kmeans算法,python ks值计算
步骤说明
1.确定k值。
决定了将数据分成几类,K的值是K-Means算法中唯一的参数。
2.从原始数据集中随机选取K个点作为初始均值点。
3.依次从原始数据集中取出数据。
取出每一个数据,用K个均值点计算距离(默认计算点之间的欧几里德距离),谁更近就归入均值点所在的簇;
4.分别计算每个聚类的当前平均点。
也就是说,平均聚类中的所有点。
5.比较当前的平均点是否与上一步获得的相同。
如果相同,则K-Means算法完成;否则,当前的平均点被先前的平均点代替,然后族被重新划分,并且重复步骤3。
实例
importnumpyasnp
importmatplotlib.pyplotasplt
标志位计算递归运行的次数
标志=0
欧洲距离
defecludDist(x,y):
returnnp . sqrt(sum(NP . square(NP . array(x)-NP . array(y)))
曼哈顿距离
defmanhatdandist(x,y):
returnnp.sum(np.abs(x-y))
夹角余弦
defcos(x,y):
returnnp.dot(x,y)/(NP . linalg . norm(x)* NP . linalg . norm(y))
计算聚类的平均点
defclusterMean(数据集):
returnsum(NP . array(dataset))/len(dataset)
生成随机平均点
defrandCenter(数据集,k):
temp=[]
白色(临时)k:
index=np.random.randint(0,len(dataset)-1)
ifindexnotintemp:
临时追加(索引)
returnnp . array([dataset[I]for iin temp])
取数据集的前k个点作为平均点
deforderCenter(数据集,k):
returnnp . array([数据集[i]foriinrange(k)])
群集
defkMeans(数据集,距离,中心,k):
全球标志
#all_kinds用于存储中间计算结果。
所有_k
inds=[]
for_inrange(k):
temp=[]
all_kinds.append(temp)
#计算每个点到各均值点的距离
foriindataset:
temp=[]
forjincenter:
temp.append(dist(i,j))
all_kinds[temp.index(min(temp))].append(i)
#打印中间结果
foriinrange(k):
print('第'+str(i)+'组:',all_kinds[i],end='n')
flag+=1
print('************************迭代'+str(flag)+'次***************************')
#更新均值点
center_=np.array([clusterMean(i)foriinall_kinds])
if(center_==center).all():
print('结束')
foriinrange(k):
print('第'+str(i)+'组均值点:',center_[i],end='n')
plt.scatter([j[0]forjinall_kinds[i]],[j[1]forjinall_kinds[i]],marker='*')
plt.grid()
plt.show()
else:
#递归调用kMeans函数
center=center_
kMeans(dataset,dist,center,k)
defmain(k):
'''生成随机点'''
x=[np.random.randint(0,50)for_inrange(50)]
y=[np.random.randint(0,50)for_inrange(50)]
points=[[i,j]fori,jinzip(x,y)]
plt.plot(x,y,'b.')
plt.show()
initial_center=randCenter(dataset=points,k=k)
kMeans(dataset=points,dist=ecludDist,center=initial_center,k=k)
if__name__=='__main__':
main(3)以上就是Python K-means算法的计算步骤,希望对大家有所帮助。更多Python学习指路:python基础教程
本文教程操作环境:windows7系统、Python 3.9.1,DELL G3电脑。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。