jody970214 发表于 2020-9-22 21:19:43

不知道哪里出了问题

本帖最后由 jody970214 于 2020-9-22 22:32 编辑

想用Python自己实现一下K-mean算法,代码如下:


def K_means(data, k = 10, iters = 100):
    center = list(init_center(data, k))
    while iters:
      clusters = dict.fromkeys(list(range(k)),[])
      for node in data:
            print(node)
            jud = []
            center_new = []
            dist = []
            for cen in center:
                dist.append(np.linalg.norm(node - cen))
            print(dist)
            ##cluster = dist.index(min(dist))
            ##print(cluster)
            ##clusters.append(node)
            ##print(clusters)
      for cluster in clusters.keys():
            center_new.append(np.mean(clusters,axis = 0))
      i = k
      while i:
            jud.append(all(center_new == center))
            i -= 1
      if all(jud):
            break
      center = center_new
      print(center)
      iters -= 1
    return center
然后使用test = np.array([,,,,]) 测试,发现#标部分代码没按想象中的实现,结果如下:


1
{0: )], 1: )], 2: )]}

为什么 clusters.append(node) 将值放入了所有键下面啊?不应该只放在clusters下面吗?

抉择啊 发表于 2020-9-22 21:19:44

本帖最后由 抉择啊 于 2020-9-23 12:13 编辑

抉择啊 发表于 2020-9-23 11:44
原因:




补充:覆盖原本的值
dict1 = dict.fromkeys(list(range(4)))
for k in dict1:
    dict1 = []

dict1.append('123')

for k in range(4):
    print(k,dict1,id(dict1))

jody970214 发表于 2020-9-22 22:32:55

顶顶顶!!

抉择啊 发表于 2020-9-23 11:44:12

原因:
for k in range(4):
    clusters = dict.fromkeys(list(range(k)),[]) # 这里的用的都是同一个内存

print(clusters)
clusters.append('123')
# clusters.update({1:'123'}) 用这个就不会
print(clusters)

应该还有很多别的解决方法,具体问题应该就是这个,楼主自己在找找好的解决方法。
页: [1]
查看完整版本: 不知道哪里出了问题