鱼C论坛

 找回密码
 立即注册
查看: 1542|回复: 3

[已解决]不知道哪里出了问题

[复制链接]
发表于 2020-9-22 21:19:43 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 jody970214 于 2020-9-22 22:32 编辑

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


  1. def K_means(data, k = 10, iters = 100):
  2.     center = list(init_center(data, k))
  3.     while iters:
  4.         clusters = dict.fromkeys(list(range(k)),[])
  5.         for node in data:
  6.             print(node)
  7.             jud = []
  8.             center_new = []
  9.             dist = []
  10.             for cen in center:
  11.                 dist.append(np.linalg.norm(node - cen))
  12.             print(dist)
  13.             ##cluster = dist.index(min(dist))
  14.             ##print(cluster)
  15.             ##clusters[cluster].append(node)
  16.             ##print(clusters)
  17.         for cluster in clusters.keys():
  18.             center_new.append(np.mean(clusters[cluster],axis = 0))  
  19.         i = k
  20.         while i:
  21.             jud.append(all(center_new[i-1] == center[i-1]))
  22.             i -= 1
  23.         if all(jud):
  24.             break
  25.         center = center_new
  26.         print(center)
  27.         iters -= 1
  28.     return center
复制代码

然后使用
  1. test = np.array([[0,0],[1,1],[5,3],[10,1],[0,1]])
复制代码
测试,发现#标部分代码没按想象中的实现,结果如下:

[0 0][1.0, 0.0, 10.04987562112089]
1
{0: [array([0, 0])], 1: [array([0, 0])], 2: [array([0, 0])]}

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

最佳答案
2020-9-22 21:19:44
本帖最后由 抉择啊 于 2020-9-23 12:13 编辑


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

  4. dict1[1].append('123')

  5. for k in range(4):
  6.     print(k,dict1[k],id(dict1[k]))
复制代码

最佳答案

查看完整内容

补充:覆盖原本的值
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-9-22 21:19:44 | 显示全部楼层    本楼为最佳答案   
本帖最后由 抉择啊 于 2020-9-23 12:13 编辑


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

  4. dict1[1].append('123')

  5. for k in range(4):
  6.     print(k,dict1[k],id(dict1[k]))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-9-22 22:32:55 | 显示全部楼层
顶顶顶!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-9-23 11:44:12 | 显示全部楼层
原因:
  1. for k in range(4):
  2.     clusters = dict.fromkeys(list(range(k)),[]) # 这里的用的都是同一个内存

  3. print(clusters)
  4. clusters[1].append('123')
  5. # clusters.update({1:'123'}) 用这个就不会
  6. print(clusters)
复制代码


应该还有很多别的解决方法,具体问题应该就是这个,楼主自己在找找好的解决方法。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-18 08:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表