我正在尝试编写自己的K-Means聚类算法,但它无法正常工作。有人可以看看并帮我找出我犯的错误。我很新。
我希望数据能够聚集在2组中,因为K = 2.但是我没有得到预期的结果。我认为平均分配工作不正常。有人可以看看吗?
https://github.com/DivJ/Robo_Lab/blob/master/K_Means.py
dist=[]
lab=[]
x_sum,y_sum=0,0
x_sum1,y_sum1=0,0
k=2
mean=pt[:k]
def assignment():
global dist
global lab
for i in range(0,100):
for j in range(0,k):
dist.append(math.hypot(pt[i,0]-mean[j,0],pt[i,1]-mean[j,1]))
lab.append(dist.index(min(dist)))
dist=[]
def mean_shift():
global x_sum,x_sum1,y_sum,y_sum1,lab
for i in range(0,100):
if(lab[i]==0):
plt.scatter(pt[i,0],pt[i,1],c='r')
x_sum=pt[i,0]+x_sum
y_sum=pt[i,1]+y_sum
elif(lab[i]==1):
plt.scatter(pt[i,0],pt[i,1],c='b')
x_sum1=pt[i,0]+x_sum1
y_sum1=pt[i,1]+y_sum1
mean[0,0]=x_sum/lab.count(0)
mean[0,1]=y_sum/lab.count(0)
mean[1,0]=x_sum1/lab.count(1)
mean[1,1]=y_sum1/lab.count(1)
lab=[]
def k_means(itr):
for z in range(0,itr):
assignment()
mean_shift()
k_means(100)
答案 0 :(得分:0)
以下是您的代码出了什么问题:
1)您将means
初始化为pt[:k]
,但稍后您重新分配means
会导致无意中重新分配前两个点,因为means
仅指向这些点点。您需要创建第一个要点的副本以避免更改它们:
import copy
means=copy.copy(pt[:k])
2)您在x_sum, y_sum, x_sum1
之外初始化y_sum1
和mean_shift()
,导致每次迭代时总和越来越大。每次拨打mean_shift()
时将它们设置为0。