Самоорганизующаяся карта (SOM) - это метод машинного обучения нейронной сети без учителя. SOM используется, когда набор данных имеет много атрибутов, потому что он производит низкоразмерный, чаще всего двумерный вывод. Результатом является дискретное представление входного пространства, называемого картой.

Как работает SOM?

Точки во входном пространстве имеют соответствующие точки в выходном пространстве. В сетях Кохонена, своего рода SOM, есть один слой с двумя измерениями, и входные точки полностью связаны с нейронами на этом уровне.

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

D = размер входов; x = входы; w = веса

Эта функция покажет, какой нейрон больше всего похож на входной вектор.

Когда нейрон возбуждается, его соседи будут более возбуждены, чем удаленные нейроны. Этот процесс называется топологической окрестностью и рассчитывается следующим образом:

Где S - латеральное расстояние между нейронами, I (x) - индекс нейрона-победителя, а σ - количество соседей. и это число со временем уменьшается. Номер топологической окрестности будет уменьшаться, стремясь к нулю по мере увеличения расстояния до победителя.

Поскольку t - количество эпох, а η (t) - скорость обучения в данный момент, веса обновляются по следующей формуле:

Как мы видим, веса перемещаются в соответствии с топологической окрестностью, в результате чего удаленные нейроны имеют незначительные обновления. Это произведет эффект, как нейрон-победитель, притягивающий другие нейроны.

Алгоритм SOM ​​останавливается, когда карта функций перестает изменяться.

В этой статье мы напишем код SOM, который изучает цвета. Здесь мы используем библиотеку MiniSom с простой реализацией самоорганизующихся карт.

Обучение сети SOM с помощью этой библиотеки было очень простым: всего с 4 строками можно было обучить нашу модель и получить результат ниже, показывающий цвета, полученные в сети.

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

Теперь пора узнать, как учатся SOM. Вы готовы? Давай начнем. Здесь у нас есть очень простая самоорганизующаяся карта.

Наши входные векторы составляют три функции, и у нас есть девять выходных узлов.

Если вы помните предыдущие руководства в этом разделе, мы говорили, что SOM нацелены на уменьшение размерности вашего набора данных.

При этом вас может смутить то, как в этом примере показано, как три входных узла создают девять выходных узлов. Не пугайтесь этого. Три входных узла представляют три столбца (измерения) в наборе данных, но каждый из этих столбцов может содержать n строк. Выходные узлы в SOM всегда двумерны.

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

Вот как бы это выглядело.

Это все та же сеть, но с другим расположением узлов. Он содержит такие же связи между входными и выходными узлами.

Однако есть отличия в SOM от того, что мы узнали о контролируемых типах нейронных сетей:

  • SOM намного проще.
  • Из-за того, что они различны, некоторые термины и концепции (например, веса, синапсы и т. Д.), Которые мы узнали в предыдущих разделах, будут иметь разное значение в контексте SOM. Постарайтесь не запутаться в этих терминах.

Теперь возьмем самый верхний выходной узел и сосредоточимся на его связях с входными узлами. Как видите, каждому из этих подключений назначен вес.

Опять же, слово «вес» здесь имеет совершенно иное значение, чем в случае с искусственными нейронными сетями.

Например, в искусственных нейронных сетях мы умножили значение входного узла на вес и, наконец, применили функцию активации. С другой стороны, у SOM нет функции активации.

Здесь веса не отделены от узлов. В SOM веса принадлежат самому выходному узлу. Вместо того, чтобы быть результатом сложения весов, выходной узел в SOM содержит веса в качестве своих координат. Неся эти веса, он украдкой пытается проникнуть во входное пространство.

Дальнейшие шаги будут более интересными, когда мы узнаем и исследуем их.

Давайте перейдем ко второй части нашего руководства о том, как обучаются SOM. Как мы уже говорили в конце нашего последнего руководства, на этот раз мы рассмотрим процесс обучения SOM на более сложном уровне.

На этот раз наша карта будет содержать несколько единиц наилучшего соответствия (BMU) вместо двух.

В нашем последнем руководстве мы упоминали, как нужно будет обновить веса BMU, чтобы их можно было приблизить к точкам данных.

Затем каждому из этих BMU будет назначен радиус, как на изображении ниже.

Давайте рассмотрим эти BMU один за другим. Возьмите фиолетовый узел в верхнем левом углу. Он был обновлен, чтобы приблизить его к строке, с которой он совпадает. Остальные узлы, попадающие в его радиус, подвергаются таким же обновлениям, поэтому их перетаскивают вместе с ним.

То же самое касается всех остальных BMU вместе с узлами на их периферии.

Конечно, в этом процессе периферийные узлы подвергаются некоторому давлению и натяжению, поскольку многие из них попадают в радиус более одного BMU. Они обновляются объединенными силами этих БМУ, причем ближайшая БМУ является наиболее влиятельной.

По мере того, как мы повторяем этот процесс в дальнейшем, радиус каждого BMU уменьшается. Это уникальная особенность алгоритма Кохонена.

Это закончится теоретической частью реализации SOM, и теперь мы перейдем к реализации кода с визуализацией набора данных, а затем сделаем вывод из этого кода о SOM.

Перед тем, как приступить к практической реализации кода, мы должны ознакомиться с набором данных, который мы используем IRIS Dataset.

  1. длина чашелистиков в см.
  2. ширина чашелистика в см.
  3. длина лепестка в см.
  4. ширина лепестка в см.
  5. класс: - Ирис Сетоса - Ирис разноцветный - Ирис Вирджиния.

Первые 4 являются независимой переменной, а последняя - зависимой переменной, и вы можете загрузить набор данных из репозитория UCI.

Шаг 1 Импорт и установка набора данных.

импортировать numpy как np

импортировать matplotlib.pyplot как plt

импортировать панд как pd

Шаг 2 Загрузка набора данных

data = pd.read_csv («Iris.csv»)

Шаг 3 Фрейм набора данных

data.head ()

Шаг 4 Отбрасываем последний столбец набора данных, потому что мы будем предсказывать класс.

dataset = data.drop ([«Виды», «Идентификатор»], ось = 1)

dataset.head ()

Шаг 5 Стандартизация набора данных для более точного и упрощенного набора данных.

#numpy базы реализация SOM

из sklearn.preprocessing import StandardScaler

standard = StandardScaler ()

cleandataset = pd.DataFrame (standard.fit_transform (набор данных))

cleandataset.head ()

cleandataset.tail ()

Шаг 6 MINISOM разрабатывается разработчиками в течение года для лучшей визуализации набора данных и правильной реализации классов со стороны прогнозирования и дает нам надлежащую стандартную визуализацию набора данных.

! pip установить minisom

Шаг 7 В minisom мы имеем (7,7) относится к строкам и столбцам в сетке выполнения кластеризации со 150 строками в наборе данных. Сигма относится к размеру круга по умолчанию 0,5, мы можем использовать от 0 до 1

из минисом импорт МиниСом

из matplotlib.gridspec import GridSpec

som = MiniSom (7,7,4, sigma = 0.5, neighbour_function = ”gaussian”) # 4 для данных независимых переменных

som.train_random (cleandataset.to_numpy (), 300000) # 30000 указывает на количество итераций для модели.

Шаг 8 Теперь настала очередь зависимой переменной Y с тремя значениями, поэтому мы ставим категориальную, а не двоичную.

target = data.Species.astype ("категория"). cat.codes

label_map = som.labels_map (cleandataset.to_numpy (), цель)

label_names = np.unique (цель)

Шаг 9 вы можете увидеть классы, которые являются кодами в 0,1,2 и label_map для корреляции в нем с матрицей.

цель*

label_map

#выход

{(0, 0): Счетчик ({2: 1}), (0, 1): Счетчик ({2: 3}), (0, 2): Счетчик ({2: 4}), (0, 3 ): Счетчик ({2: 1}), (0, 4): Счетчик ({2: 2}), (0, 6): Счетчик ({0: 1}), (1, 0): Счетчик ({ 2: 2}), (1, 1): Счетчик ({2: 2}), (1, 2): Счетчик ({2: 7}), (1, 3): Счетчик ({2: 3}) , (1, 4): Счетчик ({1: 1}), (1, 5): Счетчик ({0: 4}), (1, 6): Счетчик ({0: 2}), (2, 0 ): Счетчик ({2: 4}), (2, 1): Счетчик ({1: 5}), (2, 2): Счетчик ({2: 2}), (2, 3): Счетчик ({ 1: 1, 2: 3}), (2, 4): Счетчик ({1: 2}), (2, 5): Счетчик ({0: 3}), (2, 6): Счетчик ({0 : 6}), (3, 0): Счетчик ({2: 3}), (3, 1): Счетчик ({1: 5}), (3, 2): Счетчик ({1: 6}), (3, 3): Счетчик ({1: 7}), (3, 5): Счетчик ({0: 8}), (3, 6): Счетчик ({0: 1}), (4, 0) : Счетчик ({2: 5}), (4, 1): Счетчик ({1: 1, 2: 3}), (4, 2): Счетчик ({1: 8}), (4, 3): Счетчик ({1: 1}), (4, 5): Счетчик ({0: 3}), (4, 6): Счетчик ({0: 3}), (5, 0): Счетчик ({2: 2}), (5, 1): Счетчик ({1: 1, 2: 1}), (5, 2): Счетчик ({1: 5}), (5, 3): Счетчик ({2: 1 }), (5, 5): Счетчик ({0: 2}), (5, 6): Счетчик ({0: 5}), (6, 0): Счетчик ({1: 2, 2: 1} ), (6, 1): Счетчик ({1: 1}), (6, 2): Счетчик ({1: 3}), (6, 3): Счетчик ({1: 1}), (6, 4) : Счетчик ({0: 1}), (6, 5): Счетчик ({0: 8}), (6, 6): Счетчик ({0: 3})})

Шаг 10 теперь переходит к части визуализации, где мы проводим сравнение и показываем классы в соответствии с набором данных и тем, как они были классифицированы.

plt.figure (figsize = (7,7))

the_grid = Спецификация сетки (7,7)

для позиции в label_map.keys ():

label_fracs = [label_map [position] [l] для l в label_names]

plt.subplot (the_grid [6-позиция [1], позиция [0]], аспект = 1)

патчи, тексты = plt.pie (label_fracs)

plt.legend (label_names, bbox_to_anchor = (0,1), ncol = 5)

plt.title («САМООРГАНИЗАЦИЯ КАРТ», loc = «left»)

plt.show ()

Шаг 11 Теперь перейдем к части визуализации со стороны квадрата, и мы можем видеть эту визуализацию в многоцветном исполнении.

plt.figure (figsize = (7,7))

частоты = np.zeros ((7,7))

для позиции значения в som.win_map (cleandataset.to_numpy ()). items ():

частоты [позиция [0], позиция [1]] = len (значения)

plt.pcolor (частоты, cmap = "Accent_r")

plt.title («САМООРГАНИЗАЦИЯ КАРТ ЧЕРЕЗ MINISOM», loc = «left»)

plt.legend (частоты, ncol = 15)

plt.colorbar ()

plt.show ()

plt.figure (figsize = (7,7))

частоты = np.zeros ((7,7))

для позиции значения в som.win_map (cleandataset.to_numpy ()). items ():

частоты [позиция [0], позиция [1]] = len (значения)

plt.pcolor (частоты, cmap = "зима")

plt.title («САМООРГАНИЗАЦИЯ КАРТ ЧЕРЕЗ MINISOM», loc = «left»)

plt.colorbar ()

plt.show ()

Если вы хотите реализовать код своими руками, нажмите кнопку и внедрите код в Google Colab.

Если вам нравится читать эту статью и у вас есть общий интерес к аналогичным проектам, мы можем расширить нашу сеть и работать над большим количеством проектов в реальном времени.

Для получения дополнительной информации свяжитесь со мной в моей учетной записи Linkedin !

СПАСИБО !!!!