Fuzzy C-means (FCM) — это алгоритм кластеризации, который назначает каждую точку данных одному или нескольким кластерам на основе их близости к центроиду каждого кластера. В отличие от традиционных алгоритмов кластеризации, которые назначают каждую точку одному кластеру, FCM позволяет точке данных принадлежать нескольким кластерам с разной степенью принадлежности. Это делает FCM особенно полезным в ситуациях, когда данные неоднозначны или перекрываются.
В этой статье мы предоставим краткий обзор FCM и продемонстрируем, как реализовать его на Python с помощью библиотеки scikit-learn.
Что такое нечеткие C-средства?
FCM — это тип алгоритма обучения без учителя, используемый для кластерного анализа. Он основан на идее нечетких множеств, которые позволяют точке данных иметь разную степень принадлежности к каждому кластеру. В традиционных алгоритмах кластеризации точка данных назначается отдельному кластеру на основе ее расстояния от центра масс этого кластера. FCM, с другой стороны, позволяет точке данных принадлежать нескольким кластерам с разной степенью членства.
FCM работает путем итеративной оптимизации функции стоимости, которая уравновешивает степень принадлежности каждой точки данных в каждом кластере с расстоянием между точкой данных и центроидом этого кластера.
Алгоритм начинается со случайной инициализации степени принадлежности каждой точки данных в каждом кластере. Затем он чередуется между двумя шагами:
- Обновите центроиды каждого кластера на основе степени принадлежности каждой точки данных.
- Обновите степень принадлежности каждой точки данных в каждом кластере на основе расстояния между точкой данных и центроидами каждого кластера.
Алгоритм останавливается, когда функция стоимости сходится к минимуму или достигается максимальное количество итераций.
Случаи использования
Некоторые из популярных вариантов использования FCM:
- Сегментация изображения. FCM широко используется при сегментации изображения, когда изображение разбивается на однородные области на основе схожести пикселей. Это полезно в тех случаях, когда изображение содержит несколько объектов с разной степенью сходства, а традиционные алгоритмы кластеризации могут работать неэффективно.
- Медицинская диагностика: FCM также используется в медицинской диагностике и классификации заболеваний. Это может помочь в определении различных типов заболеваний на основе набора медицинских атрибутов, таких как возраст, пол, артериальное давление и уровень сахара в крови.
- Обработка естественного языка. FCM используется при обработке естественного языка для кластеризации документов и моделирования тем. Это может помочь в группировании похожих документов на основе их содержания и определении основных тем в коллекции документов.
- Сегментация клиентов. FCM используется в маркетинге и сегментации клиентов для группировки клиентов с похожим поведением, предпочтениями и демографическими данными. Это может помочь в определении сегментов клиентов и адаптации маркетинговых стратегий на основе их потребностей.
- Анализ финансовых данных. 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 представляет собой универсальный алгоритм кластеризации, который можно использовать в различных приложениях, где требуется нечеткая кластеризация. Он относительно прост в использовании и реализации и предоставляет мощный инструмент для изучения структуры сложных наборов данных.