首先分割数据集,然后k-means聚类。论文中对于k-means获取k,用的是贪心算法。第一个点是随机获取的,第二个中心点是根据第一个点获取的,这就导致获取的k可能不是最优的。
先用论文中的方式,贪心算法
import random
import numpy as np
# 计算欧几里得距离
def distEclud(x, y):
#强制类型转换,list转array
a=np.array(x, dtype = float)
b=np.array(y, dtype = float)
dis=np.sqrt(np.sum(np.square(a - b)))
return dis
def getcNumAndCenter(data,m):
#簇中心
centers=[]
#随机选择第一个簇中心
c1=random.choice(data)
centers.append(c1)
#根据第一个簇中心找第二个
maxdis=-1
for c in data:
dis=distEclud(c,c1)
if maxdis<dis :
c2=c.copy()
centers.append(c2)
number=2
for xi in data:
#xi到每个中心点的距离,xi != cj
mindis=9999999
flag=0
sumDis=0.0
for cj in centers:
if xi is not cj:
flag=1
#计算距离
dis=distEclud(xi,cj)
if mindis > dis:
mindis =dis #找最小的距离
#求cj与ck之间的平均距离,这里只计算c1到各个点之间的距离
if c1 is not cj:
dis2=distEclud(c1,cj)
sumDis+=dis2
if flag:
centersNum=float(len(centers))
avgdis =float(sumDis/centersNum)
if mindis >avgdis and number<m :
centers.append(xi)
number+=1
return data, number, centers
if __name__ =='__main__':
#产生数据
X=np.random.rand(300, 2)
data=X.copy()
m=len(data)
data, number, centers=getcNumAndCenter(data,m)
print(number)
print(centers)
第一部分贪心获取到K,及簇,这里的簇中心距离计算的不好,应该选择一天最优的连接。
import random
import numpy as np
from sklearn.cluster import AffinityPropagation
from sklearn import metrics