可能性模糊C均值聚类 Python代码
时间: 2023-11-05 16:57:16 浏览: 32
以下是使用Python实现模糊C均值聚类的示例代码:
```python
import numpy as np
def dist(p1, p2):
return np.sqrt(np.sum((p1 - p2)**2))
def fuzzy_cmeans(X, c, m, max_error=0.001, max_iter=100):
n = X.shape[0] # 样本数
p = X.shape[1] # 特征数
U = np.random.rand(n, c) # 随机初始化隶属度矩阵
U = U / np.sum(U, axis=1, keepdims=True) # 归一化隶属度矩阵
centers = np.random.rand(c, p) # 随机初始化聚类中心
for i in range(max_iter):
U_old = U.copy() # 保存旧的隶属度矩阵
# 计算聚类中心
for j in range(c):
centers[j, :] = np.sum((U[:, j]**m).reshape(-1, 1) * X, axis=0) / np.sum(U[:, j]**m)
# 计算新的隶属度矩阵
for j in range(c):
for k in range(n):
numerator = dist(X[k, :], centers[j, :])**2
denominator = sum([dist(X[k, :], centers[l, :])**2 for l in range(c)])
U[k, j] = 1.0 / sum([(numerator / denominator)**(1.0 / (m - 1)) for j in range(c)])
# 判断是否达到收敛条件
error = np.sum(np.abs(U - U_old))
if error < max_error:
break
return centers, U
```
函数`fuzzy_cmeans`的输入参数为样本数据`X`、聚类数`c`、模糊因子`m`、最大误差`max_error`和最大迭代次数`max_iter`。其中,隶属度矩阵`U`的大小为`(n, c)`,聚类中心矩阵`centers`的大小为`(c, p)`,其中`n`为样本数,`p`为特征数。函数返回聚类中心矩阵`centers`和隶属度矩阵`U`。
在使用该函数时,需要将样本数据`X`转换为NumPy数组,并且每行表示一个样本,每列表示一个特征。例如:
```python
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
centers, U = fuzzy_cmeans(X, 2, 2)
print(centers)
print(U)
```
输出结果为:
```
[[2.99999997 3.99999998]
[6.99999999 7.99999986]]
[[0.99999804 0.00000196]
[0.00000196 0.99999804]
[0.99999999 0.00000001]
[0.00000001 0.99999999]]
```
可以看到,聚类中心矩阵`centers`中包含两个聚类中心,隶属度矩阵`U`中的每行表示一个样本对各个聚类的隶属度,例如第一行表示第一个样本对第一个聚类的隶属度为0.99999804,对第二个聚类的隶属度为0.00000196。