Объединение слабых учеников в сильный классификатор

Как мне объединить несколько слабых учеников в сильный классификатор? Я знаю формулу, но проблема в том, что в каждой статье об AdaBoost, которую я читал, есть только формулы без каких-либо примеров. Я имею в виду - у меня есть слабые ученики и их веса, поэтому я могу делать то, что мне говорит формула (умножить ученика на его вес и добавить еще одного, умноженного на его вес, и еще одного и т. Д.), Но как именно мне это сделать? Мои слабые ученики - пни для принятия решений. У них есть атрибут и порог, так что мне умножать?




Ответы (2)


Если я правильно понимаю ваш вопрос, у вас есть отличное объяснение того, как усиление объединяет слабые классификаторы в сильный классификатор с большим количеством изображений в этих лекциях:

www.csc.kth.se/utbildning /kth/kurser/DD2427/bik12/DownloadMaterial/Lectures/Lecture8.pdf

По сути, вы берете взвешенную комбинацию разделяющих гиперплоскостей, создавая более сложную поверхность принятия решений (отличные графики, показывающие это в примечаниях к лекции)

Надеюсь это поможет.

ИЗМЕНИТЬ

Сделать это практически:

на странице 42 вы видите формулы для alpha_t = 1/2*ln((1-e_t)/e_t), которые легко можно вычислить в цикле for, или, если вы используете какую-то числовую библиотеку (я использую numpy, что действительно здорово), напрямую с помощью векторных операций. alpha_t рассчитывается внутри adaboost, поэтому я предполагаю, что они у вас уже есть.

У вас есть математические формулы на странице 38, большая сигма обозначает сумму всего. h_t - это функция слабого классификатора, которая возвращает либо -1 (нет), либо 1 (да). alpha_t в основном, насколько хорош слабый классификатор и, следовательно, насколько он должен сказать в окончательном решении сильного классификатора (не очень демократично).

На самом деле я никогда не использую forloops, но меня будет легче понять и я буду более независимым от языка (это питонский псевдокод):

strongclassifier(x):
    response=0
    for t in T: #over all weakclassifiers indices
        response += alpha[t]*h[t](x)
    return sign(response)

Математически это называется скалярным произведением между весами и слабыми ответами (в основном: сильный (x) = альфа * слабый (x)).

http://en.wikipedia.org/wiki/Dot_product

РЕДАКТИРОВАТЬ2

Вот что происходит внутри strongclassifier (x): разделение гиперплоскости в основном определяется функцией weak (x), поэтому все x, у которых weak (x) = 1, находится на одной стороне гиперплоскости, а weak (x) = - 1 находится по ту сторону гиперплоскости. Если вы думаете, что у него есть линии на плоскости, у вас есть плоскость, разделяющая плоскость на две части (всегда), одна сторона - (-), а другая - (+). Если теперь у вас есть 3 бесконечные линии в форме треугольника с отрицательной стороной наружу, вы получите 3 (+) внутри треугольника и 1 или 2 (-) снаружи, что приводит (в сильном классификаторе) в область треугольника, которая является положительной, а остальные - отрицательной. Это чрезмерное упрощение, но суть в том, что это работает полностью аналогично в более высоких измерениях.

person SlimJim    schedule 28.08.2012
comment
Я ценю вашу помощь, но я еще кое-что не знаю. Думаю, вы правильно поняли мой вопрос, и эти конспекты лекций действительно хороши, но я все еще не знаю, как это реализовать. Допустим, у меня есть входные данные в ArrayList (JAVA), и я обучил несколько классификаторов - как разделить гиперплоскости? Помогите, пожалуйста! - person AjMeen; 01.09.2012
comment
Я пытался разбить его как можно больше, но я не разбиваю его на Java, так как я никогда не использовал его для числовых задач. - person SlimJim; 02.09.2012
comment
Разве вы не используете какую-либо числовую библиотеку в матрицах обработки Java и прочем, кстати? - person SlimJim; 02.09.2012
comment
Нет, наверное, потому что я впервые с такими вещами. Думаю, я понимаю ваше объяснение и надеюсь, что смогу его реализовать, потому что у меня осталось всего 2 дня. В любом случае - большое вам спасибо! Возможно, скоро у меня появятся еще вопросы ... - person AjMeen; 02.09.2012
comment
Привет, взгляните на этот документ: csie. ntu.edu.tw/~b92109/course/Machine%20Learning/ Это наглядный пример, и я хорошо понимаю, но скажите мне, пожалуйста, это: f3 (x) = 0: 423649 I (x ‹2 : 5) + 0: 6496 I (x ‹8: 5) + 0: 752 I (x› 5: 5); 0 ошибок окончательный результат? Или мне как-то это вычислить? Я имею в виду - как мне узнать, что именно составляет 0,42 из (x ‹2,5) или 0,69 из (x‹ 8,5)? - person AjMeen; 03.09.2012
comment
Если я не ошибаюсь, это будет окончательный ответ, поскольку вы успешно классифицировали все данные обучения (поскольку у вас не будет максимизации маржи (как в SVM) или чего-то подобного) 0,42 и 0,69 - это разные альфы для слабые классификаторы I (x ‹2,5) и I (x‹ 8). Я не внимательно прочитал ссылку, поэтому могу ошибаться. - person SlimJim; 04.09.2012

В ванильной версии Ada Boost вы не умножаете учащихся ни на какой вес. Вместо этого вы увеличиваете вес неправильно классифицированных данных. Представьте, что у вас есть массив, например [1..1000], и вы хотите использовать нейронные сети, чтобы оценить, какие числа являются простыми числами. (Глупый пример, но для демонстрации его хватит).

Представьте, что у вас есть класс NeuralNet. Вы создаете первый экземпляр, n1 = NeuralNet.new. Затем у вас есть обучающий набор, то есть еще один массив простых чисел от 1 до 1000 (вам нужно составить некоторый набор функций для числа, например, его цифр). Затем вы обучаете n1 распознавать простые числа в вашем обучающем наборе. Представим, что n1 является слабым, поэтому после окончания периода обучения он не сможет правильно классифицировать все числа 1..1000 на простые и непростые. Представим, что n1 неправильно говорит, что 27 - простое, а 113 - не простое, и допускает другие ошибки. Что вы делаете? Вы создаете экземпляр другой нейронной сети, n2, и увеличиваете вес 27, 113 и другие ошибочные числа, скажем, с 1 до 1,5, и уменьшаете вес правильно классифицированных чисел с 1 до 0,667. Потом тренируешь n2. После тренировки вы обнаружите, что n2 исправил большинство ошибок n1, включая ошибки no. 27, но нет. 113 все еще классифицируется неправильно. Таким образом, вы создаете экземпляр n3, увеличиваете вес 113 до 2, уменьшаете вес 27 и других теперь правильно классифицированных чисел до 1 и уменьшаете вес старых правильно классифицированных чисел до 0,5. И так далее...

Достаточно ли я конкретен?

person Boris Stitnicky    schedule 27.08.2012
comment
Я ищу не тот ответ. Вы сказали мне кое-что, что я уже знаю. Может быть, мне стоит рассказать, как выглядит мое приложение: Мои входные данные - это ArrayList of Elephants. У каждого слона есть размер, вес и тип (он может быть азиатским или африканским). Мои слабые классификаторы определяют, является ли слон азиатским или африканским по размеру или весу. Я сортирую свои данные по весу слонов или размеру слонов и создаю все возможные классификаторы (которые в случае принятия решения - это те, у которых есть порог между каждой из точек данных). (подробнее в следующем комментарии ...) - person AjMeen; 28.08.2012
comment
Затем я выбираю лучший (с наименьшим количеством ошибок). Я классифицирую свои данные, используя этот один классификатор, и обновляю веса выборок (увеличиваю вес неправильно классифицированных образцов и уменьшаю веса правильно классифицированных). Затем я выбираю образцы с наибольшим весом (неправильно классифицированные) и подбираю классификатор, который классифицирует их правильно. И так далее ... НО я все еще не знаю, каков мой конечный результат и как его извлечь? - person AjMeen; 28.08.2012
comment
Например. большинством голосов. Идея состоит в том, что между итерациями вы не так сильно меняете веса, вы делаете много итераций и останавливаетесь до того, как перетренировались, т.е. не пытайтесь отнести к последнему 1%. А затем вы позволяете им голосовать за классификацию каждого элемента. А когда есть много разногласий, вы даже можете ввести функцию неоднозначности, которая показывает, насколько ваша система уверена в классификации каждого слона. - person Boris Stitnicky; 29.08.2012