Статьи

Самоорганизующиеся Карты

Самоорганизующиеся карты (SOM), также известные как карты Кохонена, представляют собой тип искусственной нейронной сети, способной преобразовывать сложные нелинейные статистические отношения между элементами данных большого размера в простые геометрические отношения на дисплее низкого размера. В СДЛ нейроны организованы в двумерной решетке, и каждый нейрон полностью связан со всеми узлами источника во входном слое. Иллюстрация СДЛ Хайкина (1999) выглядит следующим образом:

С каждым нейроном
n связан вектор
весовых
коэффициентов w n . Процесс обучения SOM включает в себя несколько этапов обучения, пока SOM не изучит элементы в вашем наборе данных. Для каждого паттерна
x один нейрон
n будет «выигрывать» (что означает, что
w
n — вектор весов, более похожий на
x ), и вес этого нейрона-победителя будет отрегулирован так, чтобы в следующий раз он имел более сильный отклик на вход это видит (это означает, что расстояние между
x и
w
nбудет меньше). Поскольку разные нейроны выигрывают для разных паттернов, их способность распознавать этот паттерн будет увеличиваться. Алгоритм обучения можно обобщить следующим образом:

  1. Инициализировать веса каждого нейрона
  2. Инициализировать t = 0
  3. Случайно выбрать вход х из набора данных
  4. Определить выигрышный нейрон i как нейрон, такой что:
  5. Адаптируйте веса каждого нейрона n согласно следующему правилу:
  6. Увеличение t на 1
  7. если t < t max, перейдите к шагу 3

Мы имеем, что
η (t) называется
скоростью обучения и что
h (i) называется
функцией соседства , которая имеет высокие значения для
i и нейронов, близких к
i на решетке (гауссовский центр с центром в
i является хорошим примером функции соседства ). И, когда t увеличивается,
η также уменьшается, а
hуменьшает его распространение. Таким образом, на каждом этапе обучения вес нейронов, близких к выигрышному, корректируется, чтобы иметь более сильный отклик на текущий паттерн. После процесса обучения у нас получается, что расположение нейронов становится упорядоченным, и на решетке создается значимая система координат для входных объектов. Итак, если мы рассмотрим координаты ассоциированного выигрышного нейрона для каждого шаблона, SOM формирует топографическую карту входных шаблонов.

MiniSom — это минималистичная реализация SOM на основе NumPy. Я сделал это во время экспериментов для своей диссертации, чтобы иметь полностью взломанный алгоритм SOM, и в последнее время я решил выпустить его на
GitHub . Следующая часть этого поста покажет, как тренировать MiniSom на наборе
данных Iris.и как визуализировать результат. Первым шагом является импорт и нормализация данных:

from numpy import genfromtxt,array,linalg,zeros,apply_along_axis

# reading the iris dataset in the csv format    
# (downloaded from http://aima.cs.berkeley.edu/data/iris.csv)
data = genfromtxt('iris.csv', delimiter=',',usecols=(0,1,2,3))
# normalization to unity of each pattern in the data
data = apply_along_axis(lambda x: x/linalg.norm(x),1,data)

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

from minisom import MiniSom
### Initialization and training ###
som = MiniSom(7,7,4,sigma=1.0,learning_rate=0.5)
som.random_weights_init(data)
print("Training...")
som.train_random(data,100) # training with 100 iterations
print("\n...ready!")

Теперь у нас есть SOM 7 на 7, обученный на нашем наборе данных. MiniSom использует гауссову в качестве функции соседства, и ее начальный разброс задается параметром
sigma . С помощью параметра
learning_rate мы можем указать начальную скорость обучения. Реализованный алгоритм обучения уменьшает оба параметра в процессе обучения. Это позволяет проводить быстрое начальное обучение нейронной сети, которая затем «тонко настраивается» в процессе обучения. Чтобы визуализировать результат обучения, мы можем построить карту средней дистанции весов на карте и координаты ассоциированного нейрона-победителя для каждого шаблона:

from pylab import plot,axis,show,pcolor,colorbar,bone
bone()
pcolor(som.distance_map().T) # distance map as background
colorbar()
# loading the labels
target = genfromtxt('iris.csv',
                    delimiter=',',usecols=(4),dtype=str)
t = zeros(len(target),dtype=int)
t[target == 'setosa'] = 0
t[target == 'versicolor'] = 1
t[target == 'virginica'] = 2
# use different colors and markers for each label
markers = ['o','s','D']
colors = ['r','g','b']
for cnt,xx in enumerate(data):
 w = som.winner(xx) # getting the winner
 # palce a marker on the winning position for the sample xx
 plot(w[0]+.5,w[1]+.5,markers[t[cnt]],markerfacecolor='None',
   markeredgecolor=colors[t[cnt]],markersize=12,markeredgewidth=2)
axis([0,som.weights.shape[0],0,som.weights.shape[1]])
show() # show the figure

Результат должен быть примерно таким:

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

Для более подробного объяснения алгоритма SOM вы можете взглянуть на статью его изобретателя .