Fuzzy C-Means算法
模糊c均值聚类融合了模糊理论的精髓。相较于k-means的硬聚类,模糊c提供了更加灵活的聚类结果。因为大部分情况下,数据集中的对象不能划分成为明显分离的簇,指派一个对象到一个特定的簇有些生硬,也可能会出错。故,对每个对象和每个簇赋予一个权值,指明对象属于该簇的程度。当然,基于概率的方法也可以给出这样的权值,但是有时候我们很难确定一个合适的统计模型,因此使用具有自然地、非概率特性的模糊c均值就是一个比较好的选择。
算法原理
流程图
代码实现
- 初始聚类中心
c = 4 # 聚类数目c
b = 2 # b>l,是一个可以控制聚类结果的模糊程度的常数。
m=np.array([[0, 0, 0,],[0, 0, 0,], [0, 0, 0,], [0, 0, 0, ]]).astype(float)
- 计算隶属度
while(x>0.001):
for row in range(h):
for col in range(w):
temp=0
for i in range(c):
# 避免分母会为0,需要判断
if paradigm(img[row][col],m[i])!=0:
temp= temp + pow(1/paradigm(img[row][col],m[i]),1/(b - 1))
else:
temp = temp + pow(1/(10e-10),1/(b - 1))
for j in range(c):
# 避免分母会为0,需要判断
if paradigm(img[row][col],m[j]) != 0:
t=math.pow(1/paradigm(img[row][col],m[j]),1/(b-1))
else:
t=math.pow(1/(10e-10),1/(b-1))
# 更新隶属度表Mu
mu[row][col][j]=t/temp
- 更新聚类中心
# 按照公式,将m的分子分母部分分别计算出来
t=math.pow(mu[row][col][j],b)
for i in range(ch):
mfenzi[j][i]=mfenzi[j][i] + (t*img[row][col]