Fuzzy C-means (FCM) — это алгоритм кластеризации, который назначает каждую точку данных одному или нескольким кластерам на основе их близости к центроиду каждого кластера. В отличие от традиционных алгоритмов кластеризации, которые назначают каждую точку одному кластеру, FCM позволяет точке данных принадлежать нескольким кластерам с разной степенью принадлежности. Это делает FCM особенно полезным в ситуациях, когда данные неоднозначны или перекрываются.

В этой статье мы предоставим краткий обзор FCM и продемонстрируем, как реализовать его на Python с помощью библиотеки scikit-learn.

Что такое нечеткие C-средства?

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

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

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

  1. Обновите центроиды каждого кластера на основе степени принадлежности каждой точки данных.
  2. Обновите степень принадлежности каждой точки данных в каждом кластере на основе расстояния между точкой данных и центроидами каждого кластера.

Алгоритм останавливается, когда функция стоимости сходится к минимуму или достигается максимальное количество итераций.

Случаи использования

Некоторые из популярных вариантов использования FCM:

  1. Сегментация изображения. FCM широко используется при сегментации изображения, когда изображение разбивается на однородные области на основе схожести пикселей. Это полезно в тех случаях, когда изображение содержит несколько объектов с разной степенью сходства, а традиционные алгоритмы кластеризации могут работать неэффективно.
  2. Медицинская диагностика: FCM также используется в медицинской диагностике и классификации заболеваний. Это может помочь в определении различных типов заболеваний на основе набора медицинских атрибутов, таких как возраст, пол, артериальное давление и уровень сахара в крови.
  3. Обработка естественного языка. FCM используется при обработке естественного языка для кластеризации документов и моделирования тем. Это может помочь в группировании похожих документов на основе их содержания и определении основных тем в коллекции документов.
  4. Сегментация клиентов. FCM используется в маркетинге и сегментации клиентов для группировки клиентов с похожим поведением, предпочтениями и демографическими данными. Это может помочь в определении сегментов клиентов и адаптации маркетинговых стратегий на основе их потребностей.
  5. Анализ финансовых данных. FCM используется в анализе финансовых данных для сегментации рынка и оптимизации портфеля. Это может помочь в группировании акций с похожим поведением и определении оптимальных портфелей на основе риска и доходности.

Псевдокод

Input:
    X: n x d data matrix
    c: number of clusters
    m: weighting exponent
    tol: convergence tolerance

Output:
    centers: c x d matrix of cluster centers
    U: n x c matrix of fuzzy cluster memberships

Initialization:
    Initialize U randomly such that each row sums to 1
    Repeat until convergence:
        1. Compute cluster centers:
            centers = U.T @ X / np.sum(U.T, axis=1)[:, np.newaxis]
        2. Update fuzzy cluster memberships:
            distances = cdist(X, centers, metric='euclidean')
            U_new = distances**(2/(m-1))
            U_new /= np.sum(U_new, axis=1)[:, np.newaxis]
        3. Check for convergence:
            if np.linalg.norm(U - U_new) < tol:
                break
            U = U_new

Return centers, U

Алгоритм принимает в качестве входных данных матрицу данных X, количество кластеров c, показатель степени взвешивания m и допуск сходимости tol. Он возвращает матрицу центров кластеров centers и матрицу принадлежности нечетких кластеров U.

Алгоритм случайным образом инициализирует членство в нечетких кластерах, так что сумма каждой строки равна 1. Затем он итеративно обновляет центры кластеров и членство в нечетких кластерах, пока не будет достигнута сходимость. Правила обновления для центров кластеров и нечеткого членства в кластерах основаны на евклидовом расстоянии между точками данных и центрами кластеров, а показатель веса m контролирует степень нечеткости кластеризации.

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

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

Реализация на Python

Для реализации FCM в Python мы будем использовать библиотеку scikit-learn, которая обеспечивает реализацию алгоритма Fuzzy C-means. Мы будем использовать набор данных ириса, который является хорошо известным набором данных, состоящим из измерений цветков ириса. Наша цель состоит в том, чтобы сгруппировать цветы на основе их длины и ширины чашелистиков.

from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.cluster import FuzzyCMeans
import numpy as np
import matplotlib.pyplot as plt

# Load iris dataset
iris = load_iris()
X = iris.data[:, :2]
y = iris.target

# Standardize the data
scaler = StandardScaler()
X_std = scaler.fit_transform(X)

# Perform PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_std)

# Cluster the data using FCM
fcm = FuzzyCMeans(n_clusters=3, m=2)
fcm.fit(X_std)

# Visualize the clusters
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=fcm.labels_)
plt.title("FCM Clustering of Iris Dataset")
plt.xlabel("Principal Component 1")
plt.ylabel("Principal Component 2")
plt.show()

Сначала мы импортируем необходимые библиотеки, включая набор данных iris из scikit-learn. Затем мы извлекаем первые две характеристики набора данных, которые соответствуют длине чашелистиков и ширине чашелистиков цветков ириса.

Мы стандартизируем данные с помощью StandardScaler и выполняем PCA, чтобы уменьшить размерность данных до двух измерений. Затем мы создаем экземпляр класса FuzzyCMeans с 3 кластерами и коэффициентом взвешивания, равным 2, и подгоняем модель к стандартизированным данным.

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

Заключение

В этой статье мы представили обзор нечеткой кластеризации C-средних и продемонстрировали, как реализовать ее в Python с помощью библиотеки scikit-learn. FCM — это мощный алгоритм кластеризации, который допускает нечеткую кластеризацию и полезен в ситуациях, когда точки данных могут принадлежать нескольким кластерам с разной степенью членства. Внедрив FCM в Python, мы можем легко применить этот алгоритм к нашим собственным наборам данных и получить представление о базовой структуре наших данных.

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

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