Как мне объединить несколько слабых учеников в сильный классификатор? Я знаю формулу, но проблема в том, что в каждой статье об 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)).
РЕДАКТИРОВАТЬ2
Вот что происходит внутри strongclassifier (x): разделение гиперплоскости в основном определяется функцией weak (x), поэтому все x, у которых weak (x) = 1, находится на одной стороне гиперплоскости, а weak (x) = - 1 находится по ту сторону гиперплоскости. Если вы думаете, что у него есть линии на плоскости, у вас есть плоскость, разделяющая плоскость на две части (всегда), одна сторона - (-), а другая - (+). Если теперь у вас есть 3 бесконечные линии в форме треугольника с отрицательной стороной наружу, вы получите 3 (+) внутри треугольника и 1 или 2 (-) снаружи, что приводит (в сильном классификаторе) в область треугольника, которая является положительной, а остальные - отрицательной. Это чрезмерное упрощение, но суть в том, что это работает полностью аналогично в более высоких измерениях.
В ванильной версии 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. И так далее...
Достаточно ли я конкретен?