#python #machine-learning #neural-network #self-organizing-maps
#python #машинное обучение #нейронная сеть #самоорганизующиеся карты
Вопрос:
Я написал сеть SOM для своих классов, но она не работает, и я не могу понять, почему. У меня есть класс Node, который представляет собой один нейрон и содержит вектор весов. Затем я написал класс SOM, который содержит массив узлов.
Моя задача — реализовать SOM, который из этих данных: http://archive.ics.uci.edu/ml/datasets/SPECT Heart покажите мне, какой входной вектор (это двоичный вектор) подходит к какой категории (0 или 1).
Код: http://pastebin.com/GerkTf3C
Процесс обучения:
- Я получаю случайным образом один входной вектор из набора обучающих данных и категории, к которой он подходит.
- Я активирую сеть и получаю массив расстояний, который сообщает мне, как конкретные нейроны отличаются от входного вектора.
- Я получаю индексы узла-победителя, который имеет наименьшее расстояние от входного вектора.
- Я вычисляю скорость обучения и радиус окрестности для текущей итерации.
- Для каждого узла я вычисляю евклидово расстояние до узла-победителя.
- Если узел находится в районе победителя, я вычисляю, как он должен изменить и обновить свой вектор веса, и добавляю к его вектору кластеров категорию, которой он соответствует.
- Я повторяю шаги с 1 по 6, пока скорость обучения превышает определенный предел
- В конце концов я настроил для каждого узла категорию, которой он соответствует.
К сожалению, я получаю эффективность примерно от 40% до 80% (она довольно нестабильна, и я не знаю, как устранить такую случайность), тестируя ее на обучающем наборе (я предполагаю, что у меня должна быть эффективность 100% на обучающем наборе)
PS Извините за мой английский и качество кода, но я только начал изучать Python.
Комментарии:
1. Я еще не читал ваш код, но моим первым предложением было бы изменить алгоритм классификации. SOM используются для обучения без учителя (без классов) и, скорее всего, будут работать не так хорошо, как современные контролируемые методы, такие как SVM. Если вам нравятся нейронные сети, я бы посоветовал вам прочитать о MLP.
2. @ASantosRibeiro спасибо за ваше предложение, я также думаю, что в этом случае MLP может быть лучшей идеей, но другие студенты должны писать MPL, а я должен создавать SOM. Вы правы, что SOM используются для обучения под наблюдением, и мой SOM должен создавать два кластера (категории) для ввода входных векторов, но я понятия не имел, как заставить SOM создавать два кластера.
3. SOM не используются для обучения под наблюдением, они используются для обучения без присмотра. В зависимости от вашей задачи может быть возможно разделить 2 класса на основе SOMs, хотя в большинстве случаев это намного сложнее, чем MLP. Чтобы объяснить немного больше, SOMS обычно используют несколько узлов на уровне шаблонов для кластеризации данных, поэтому они бесполезны только для 2 классов. Тем не менее, вы можете использовать U-матрицу, чтобы попытаться получить 2 кластера. Однако это все равно будет неконтролируемый метод. Конечно, вы можете использовать метку после обучения, чтобы попытаться кластеризировать узлы для каждого класса, но это неэффективно.
4. Если вам нужно использовать SOMS, ищите варианты исходного метода, которые увеличивают метку в обновлении веса (я знаю, что что-то есть), вместо того, чтобы пытаться кластеризовать после обучения без контроля
5. @ASantosRibeiro конечно, я имел в виду обучение без учителя 🙂 Хорошо, спасибо за вашу помощь и время, похоже, мне нужно провести дополнительные исследования в книгах и статьях о SOM, чтобы что-то выяснить. Я нашел кое-что, что могло бы мне помочь: smartquant.com/references/NeuralNetworks/neural2.pdf