K-Means算法无法正常工作

时间:2017-04-29 11:41:32

标签: python-2.7 machine-learning

我正在尝试编写自己的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)

1 个答案:

答案 0 :(得分:0)

以下是您的代码出了什么问题:

1)您将means初始化为pt[:k],但稍后您重新分配means会导致无意中重新分配前两个点,因为means仅指向这些点点。您需要创建第一个要点的副本以避免更改它们:

import copy
means=copy.copy(pt[:k])

2)您在x_sum, y_sum, x_sum1之外初始化y_sum1mean_shift(),导致每次迭代时总和越来越大。每次拨打mean_shift()时将它们设置为0。