模糊c均值聚类算法python
以下是Python实现模糊c均值聚类算法的代码:
python
import numpy as np
import random
class FuzzyCMeans:
def __init__(self, n_clusters=2, m=2, max_iter=100, tol=1e-4): self.n_clusters = n_clusters # 聚类数目
self.m = m # 模糊因子
self.max_iter = max_iter # 最大迭代次数
self.tol = tol # 中心点变化停止阈值
# 初始化隶属度矩阵
def _init_membership_mat(self, X):
n_samples = X.shape[0]
self.membership_mat = np.random.rand(n_samples, self.n_clusters)
self.membership_mat = self.membership_mat /
np.sum(self.membership_mat, axis=1)[:, np.newaxis]
# 更新聚类中心点
def _update_centers(self, X):
membership_mat_pow = np.power(self.membership_mat, self.m)
self.centers = np.dot(X.T, membership_mat_pow) /
np.sum(membership_mat_pow, axis=0)[:, np.newaxis]
# 计算隶属度矩阵
def _update_membership_mat(self, X):
n_samples = X.shape[0]
self.distances = np.zeros((n_samples, self.n_clusters))
for j in range(self.n_clusters):
self.distances[:, j] = np.linalg.norm(X-self.centers[j, :], axis=1) self.membership_mat = 1 / np.power(self.distances, 2/(self.m-1))
self.membership_mat = self.membership_mat /
np.sum(self.membership_mat, axis=1)[:, np.newaxis]
# 判断是否满足停止迭代的条件
def _check_stop_criteria(self):
return np.sum(np.abs(self.centers - self.old_centers)) < self.tol # 聚类过程
def fit(self, X):
self._init_membership_mat(X)
for i in range(self.max_iter):
self.old_centers = self.centers.copy()
self._update_centers(X)
self._update_membership_mat(X)
if self._check_stop_criteria():
break
# 预测样本所属的簇
def predict(self, X):
distances = np.zeros((X.shape[0], self.n_clusters))
for j in range(self.n_clusters):
distances[:, j] = np.linalg.norm(X-self.centers[j, :], axis=1) return np.argmin(distances, axis=1)
使用方法:
python
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
X, y = make_blobs(n_samples=500, centers=3, random_state=42)
fcm = FuzzyCMeans(n_clusters=3)
fcm.fit(X)
plt.scatter(X[:, 0], X[:, 1], c=fcm.predict(X))
plt.show()。