ОБУЧЕНИЕ БЕЗ КОНТРОЛЯ

Нечеткая кластеризация C-средних с Python

В этом посте я кратко расскажу о концепции неконтролируемого метода обучения, кластеризации Fuzzy C-Means и ее реализации в Python.

Алгоритм кластеризации нечетких C-средних представляет собой метод обучения без учителя. Прежде чем узнать подробности, позвольте мне сначала расшифровать его причудливое название.

Таким образом, «нечеткий» здесь означает «не уверен», что указывает на то, что это метод мягкой кластеризации. «C-means» означает c кластерных центров, которые заменяют «K» в «K-means» только на «C», чтобы он выглядел по-другому.

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

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

Понимание параметров

В методе кластеризации Fuzzy c-means(FCM) у нас есть два параметра: μ_ij и c_i и один гиперпараметр m.

μ_ij,значение членства, – это вероятность того, что j-я точка данных принадлежит i-й и ограничивается тем, что сумма μ_ij по центрам кластера C равна 1 для каждого точка данных j. c_i – центр кластера ith (то же измерение, что и X). . А m — это нечеткость, которая определяет, насколько нечеткой должна быть граница кластера.

На приведенном выше примере графика мы смотрим на 5-ю точку данныхX_5 и предположим, что мы знаем, что есть только два кластера, а текущие центры кластеров — c_1 и c_2. μ_25 — это вероятность того, что 5-я точка данных принадлежит 2-му кластеру, а μ_15 — это вероятность 5-й точки данных, принадлежащей 1-му кластеру. Затем мы видим, что 5-я точка данных намного ближе к c_2, чем к c_1, поэтому μ_25 (0,6) больше, чем μ_15 (0,4). И они удовлетворяют ограничению, состоящему в том, что сумма μ для каждой точки данных равна 1, где μ_15 + μ_25 = 1.

Пример выше приведен только для иллюстрации параметров в FCM, но реальные значения не обязательно должны быть такими же.

Целевая функция

Я решил показать целевую функцию после введения параметров, потому что здесь она будет выглядеть намного яснее.

Вы можете понимать целевую функцию как взвешенную сумму расстояний между точками данных (X_j) и центрами кластеров (C_i). Термин «расстояние» — это норма L2 в приведенном выше уравнении, а в приведенном выше примере (5-я точка данных) — это точная длина стрелок.

Если m = 1, то целевая функция представляет собой просто взвешенную по вероятности сумму расстояний между точками данных и центрами кластеров. Что это значит? Это означает, что точкам данных, которые находятся близко к центрам кластеров, присваиваются более высокие веса.

В приведенном выше примере расстояние между 5-й точкой данных и 2-м центром кластера вносит больший вклад в целевую функцию, чем расстояние между 5-й точкой данных и 1-м центром кластера, потому что μ _25 = 0,6 и μ_15 = 0,4.

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

Что, если m = 2, 3, …? Затем разница вклада расстояний становится все меньше и меньше, как показано ниже (μ_15 и μ_25), все они близки к 0.

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

Если m очень велико, а все центры кластеров расположены в центроидах всех точек данных, кластеризация будет супер «нечеткой», потому что она вообще не кластеризуется!

Итак, чтобы сделать значимую кластеризацию, мы используем m = 2 для большинства случаев.

Нахождение параметров, минимизирующих целевую функцию

Оптимизацию параметров с ограничениями можно решить вручную с помощью функции Лагранжа, но мы не будем рассматривать ее в этом посте. Вместо этого я привожу окончательные уравнения для расчета c_i и µ_ij.

Уравнение для решения c_i относительно простое, поскольку оно представляет средневзвешенное значение X относительно центра кластера i. Почему мы должны делить его на сумму (μ_ij)^m? Это связано с тем, что сумма весов равна 1 только тогда, когда m=1 (в этом случае мы можем удалить весь знаменатель). Когда m›1, сумма весов используется для расчета взвешенной суммы для центров кластеров.

Однако уравнение μ_ijне выглядит таким простым для понимания, верно? Если мы преобразуем его в следующий, его будет намного легче интерпретировать.

Предположим, что m=2, тогда часть числителя равна обратной величине расстояния между j-й точкой данных и центр i кластера (длина стрелки на графике выше). Как упоминалось выше, большее расстояние должно соответствовать меньшему μ_ij, что также отражено в этом уравнении. Знаменатель уравнения представляет собой сумму этих обратных величин расстояний от x_j до центров каждого кластера.

Алгоритм

Полный алгоритм FCM можно описать на рисунке ниже.

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



Внедрить ФКМ

Реализация нечеткой кластеризации c-средних в Python очень проста. Процедура подгонки показана ниже,

import numpy as np
from fcmeans import FCM
my_model = FCM(n_clusters=2) # we use two cluster as an example
my_model.fit(X) ## X, numpy array. rows:samples columns:features

Извлечь информацию из модели кластеризации,

centers = my_model.centers
labels = my_model.predict(X)

Вот и все!

Надеюсь статья будет полезной.