模糊K均值算法
思路说明
python代码实现
def Fuzzy_K_means_clustering(x1,x2,x3,x4,U,pointvalue):
w=[]
w.append(x1)
w.append(x2)
w.append(x3)
w.append(x4)
z1=multiple(w,U)
while 1:
U1 = [[] for i in range(0, len(U))]
for i in range(0, len(w)):
listd = []
for k in range(0, len(z1)):
d = 0.0
for j in range(0, len(w[i])):
d = d + (w[i][j] - z1[k][j]) ** 2
listd.append(d)
count = 0
for m in range(0, len(listd)):
sum = 0.0
for n in range(0, len(listd)):
sum = sum + (listd[m] / listd[n])
if sum != 0:
u1 = 1 / sum
U1[count].append(u1)
count = count + 1
else:
U1[count].append(float(1.0))
count = count + 1
for i in range(0, len(U1)):
for j in range(0, len(U1[i])):
if U1[i][j] == 1.0:
zero(U1, i, j)
judgenum = judge(U1, U, pointvalue)
if judgenum == 1:
result = Union(U1, w)
print(result)
break
else:
U = U1
def zero(U1,index1,index2):
for i in range(0,len(U1)):
if index1!=i:
U[i][index2]=0.0
def Union(U1,w):
result=[[]for i in range(0,len(U1))]
for i in range(0,len(U1[0])):
min=U[0][i]
index=0
for j in range(0,len(U1)):
if min<U1[j][i]:
min=U1[j][i]
index=j
result[index].append(w[i])
return result
def multiple(w,U):
sumz=[]
for i in range(0,len(U)):
z=[0.0 for k in range(0,len(w[0]))]
sum=0.0
for j in range(0,len(U[i])):
sum=sum+U[i][j]*U[i][j]
zan=multiple1(U[i][j],w[j])
z=addtion(zan,z)
for m in range(0,len(z)):
z[m]=z[m]/sum
sumz.append(z)
return sumz
def multiple1(c,list1):
zan=[]
for i in range(0,len(list1)):
zan.append(c**2*list1[i])
return zan
def addtion(list1,list2):
z=[]
for i in range(0,len(list1)):
z.append(float(list1[i]+list2[i]))
return z
def judge(U1,U2,pointvalue):
for i in range(0,len(U1)):
for j in range(0,len(U[i])):
if(abs(U1[i][j])-U2[i][j])>pointvalue:
return 0
return 1
if __name__ == '__main__':
x1 = [0, 0]
x2 = [0, 1]
x3 = [3, 1]
x4 = [3, 2]
key=int(input("请输入K的值:"))
U=[[]for i in range(key)]
for i in range(0,key):
print("请输入第"+str(i+1)+"行的4个隶属度:")
for j in range(0,4):
num=float(input())
U[i].append(num)
Fuzzy_K_means_clustering(x1, x2, x3, x4, U, 1.0)