Всем привет!
Давайте начнем с вопроса, и мы найдем на него ответы автоматически.

Итак, вопрос: Как найти САМЫЙ центр?

Вопрос простой и немного расплывчатый !! Но не волнуйтесь. Мы найдем ответ.
(Удачи тебе!) ☺

Представьте, что вы живете в сообществе из 16 домов, и одна машина куплена на пожертвования со всех домов. Таким образом, все соседи могут легко попасть в офис.

Теперь машину нужно припарковать рядом с одним домом, который должен быть доступен для всех остальных 15 домов.

Где бы вы его припарковали? В каком именно доме?

Да, верно !! Припаркуйтесь в том месте, которое находится на наименее интуитивном расстоянии от всех остальных своих соседей.

мы можем использовать разные методы для измерения расстояния и решаемой проблемы.
УРА !!!!! Например, евклидово, манхэттенское, косинусное и другие, в зависимости от типа проблемы

Итак, все соседи жили счастливо, но однажды несколько соседей решили купить себе машину, так как у них другое рабочее время, и теперь они не могут идти вместе с другими. И они его купили !!!!

Теперь они должны снова решить ту же проблему, а именно найти лучший дом для парковки. Следовательно, они будут делать это снова тем же способом. Без проблем !!!

Теперь более широкая картина,

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

Итак, нам нужно найти K разных групп, которые имеют схожее время работы в офисе, а затем идеального соседа в каждой группе, который находится почти на одинаковом расстоянии от всех членов своей группы. (Представитель группы) Да, это все, что нам нужно сделать, и это называется k-means.

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

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

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

Таким образом, формулировка проблемы больше не является расплывчатой, и теперь мы можем перейти к ее решению на примере.

НО перед этим давайте разберемся с подходом алгоритма K-средних.

Как он на самом деле находит нужное количество групп / кластеров и нужное количество членов и центров / представителей для каждого кластера.

Анализ алгоритмов.

Мы всегда должны сначала указать количество кластеров. Это ограничение k-средних. Мы, конечно, не знаем правильного количества кластеров или правильного количества различных рабочих часов для людей в сообществе. Но мы можем сделать слепое предположение. Позже мы исправим это разными методами, например, методом локтя.

После того, как мы дали кластеры. Скажем, 3, следующая задача - случайным образом выбрать любые 3 дома из сообщества и измерить расстояние между всеми домами от каждого из трех домов.

Какой-либо дом из оставшихся 13 домов ближе к какому-либо из 3 случайно выбранных домов. Он помечает это как кластер.

Красные - случайно выбранные центры.

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

и снова,

Это повторяется каждый раз, пока дом, выбранный в качестве центра, больше не меняется и все время остается прежним. Сказав это, алгоритм сошелся. Значит, мы можем остановиться.

Полезно знать:
Иногда мы также останавливаемся после определенного количества итераций в некоторых случаях.

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

Хорошо, теперь простой пример:

Мы будем использовать двумерный набор данных из 150 элементов, ничего не зная о каком-либо члене, но эвристически мы создадим и распределим эти элементы по определенным классам.

Мы будем использовать python в качестве языка сценариев и scikit-learn для алгоритма kmeans и сюжетная библиотека для визуализации найденных нами кластеров.

Импорт всех зависимостей:

import csv
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

чтение файла данных csv для загрузки 2D-данных в наш массив numpy.

x = []
с open ('data-set-activation-values.csv') как csv_file:
csv_reader = csv.reader (csv_file, delimiter = ',')
для строки в csv_reader:
x.append ([строка [0], строка [1]])
x = np.array (x) .astype (np.float)

Список проще инициализировать, и после заполнения его данными мы преобразуем его в массив numpy.

Теперь просто передайте этот новый массив numpy X алгоритму Kmeans.

kmeans = KMeans (n_clusters = 3, random_state = 0)
label = kmeans.fit_predict (x)
u_labels = np.unique (метка)

Здесь я пропустил 3 в параметре n_clusters. Поскольку я считаю, что приведенные данные можно разделить на три разных класса. Мы даже можем использовать 2,4,5,6 в качестве числа и видеть результаты. Что мы и увидим, просто подождите минутку.

Затем мы вызвали метод kmeans fit_predict, который принимает данные, подгоняя их по наименьшей сумме квадратов расстояний, и маркирует каждую точку как потенциальный член определенного класса. (В данном случае 3 класса)

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

попробуйте это, если хотите проверить экземпляры на предмет лучших центроидов; выводится с помощью k-средних.

centroids = kmeans.cluster_centers_
печать (центроиды)

Итак, теперь у нас есть данные LABELED и центроиды. позволяет построить его, используя библиотеку plotly.

u_labels = np.unique (label)
для i в u_labels:
plt.scatter (x [label == i, 0], x [label == i, 1], label = i) < br /> plt.scatter (центроиды [:, 0], центроиды [:, 1], s = 80, color = 'yellow')
plt.legend ()
plt.show ()

Ниже приведены результаты для различных значений n_clusters; 4, 3 и 6.

МЕТОД ИЗОБРАЖЕНИЯ:

Ранее мы обсуждали, что нам нужно назначать кластеры случайным образом, поскольку это ограничение, и мы можем видеть на изображениях выше результаты присвоения каждого значения параметру n_clusters. Метод локтя помогает нам выбрать правильное количество кластеров, что в некоторой степени снижает ограничение.

метод локтя запускает k - означает кластеризацию набора данных для диапазона значений k (скажем, от 1–10), а затем для каждого значения k вычисляет средний балл для всех кластеров. По умолчанию рассчитывается оценка искажения, сумма квадратов расстояний от каждой точки до назначенного ей центра .

Таким образом, по мере увеличения числа K до общего числа элементов ошибки квадрата расстояния не будет, но будет резкое / изгибное изменение графика при некотором значении K. Это должно быть правильным значением кластеры.

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

Ладно, это не основная тема на сегодня, поэтому мы никогда не будем вдаваться в детали этого метода, но он полезен для понимания. Следовательно, мы пролили на него некоторый свет.

Двигаемся дальше …… ..

Проклятие размерности:

В приведенном выше примере мы использовали 2-мерные точки данных, и у нас все получилось с кластерами. Представьте себе, что у вас есть точки данных в 3-х и 4-х измерениях, а затем применяется кластеризация k-средних?

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

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

Набор данных, используемый в примере:
Набор данных, используемый в приведенном выше примере, состоит из 150 пар значений активации двух скрытых нейронов 3-го слоя. прямая нейронная сеть. Использование сигмовидной функции. обучен для базы данных завода IRIS с точностью 97,667%.

Подсказка:
Именно по этой причине я был очень уверен в начале, что у меня три кластера, а также три кластера работали достаточно точно. в классификации данных.
хе-хе-хе…. !!!

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

Большое спасибо за чтение, и я надеюсь, что мне удастся объяснить кое-что хорошее о K-средних, и если да, пожалуйста, похлопайте несколько.

Спасибо и ура