该篇与聚类小练习2对应,是它的python实现方法
程序
import numpy as np fi=open("D:\\alsun\data.txt") lin=fi.readlines() fi.close() data=np.ones([100,200]) for i,lines in enumerate(lin): data[i][:]=lines.split("\t") data1=zip(*data) data2=list(data1) data3=np.array(data2) z=np.zeros([2,100]) z[0][:]=data3[0][:] z[1][:]=data3[1][:] w=np.ones([2,100])/100 err=1 alp=2 lmd=0.5 dd=np.ones(2) E=0 #print(np.shape(data),np.shape(z)) while err>0.05: u = np.zeros([2, 200]) for i in range(200): for j in range(2): ul=(w[j][:])**alp uz=(data3[i][:]-z[j][:])**2 dd[j]=np.inner(ul,uz) if j==1 and (dd[0]>dd[1]): u[1][i]=1 if j==1 and (dd[0]<=dd[1]): u[0][i]=1 adds=0 for j in range(2): for i in range(200): uu=np.dot(u[j][i],w[j][:])**alp uuu=(data3[i][j]-z[j][:])**2 adds=adds+np.inner(uu,uuu) E1=w**alp EE=np.sum(E1)+adds err=abs(EE-E) E=EE for i in range(2): for h in range(100): sum1=0 for t in range(100): sum2=0 sum3=0 for i in range(200): sum2=sum2+u[j][i]*((data3[i][j]-z[j][h])**2) sum3=sum3+u[j][i]*((data3[i][t]-z[j][t])**2) sum1=sum1+((sum2+lmd)/(sum3+lmd))**(1/(alp-1)) w[j][h]=1/sum1 for j in range(2): for h in range(100): z[j][h]=np.dot(u[j][:],data[:][h])/np.sum(u[j][:]) print(u)
结果:[[ 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1.]