不知道哪里出了问题
本帖最后由 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-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)) 顶顶顶!! 原因:
for k in range(4):
clusters = dict.fromkeys(list(range(k)),[]) # 这里的用的都是同一个内存
print(clusters)
clusters.append('123')
# clusters.update({1:'123'}) 用这个就不会
print(clusters)
应该还有很多别的解决方法,具体问题应该就是这个,楼主自己在找找好的解决方法。
页:
[1]