鱼C论坛

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

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

[复制链接]
发表于 2020-9-22 21:19:43 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 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[cluster].append(node)
            ##print(clusters)
        for cluster in clusters.keys():
            center_new.append(np.mean(clusters[cluster],axis = 0))  
        i = k
        while i:
            jud.append(all(center_new[i-1] == center[i-1]))
            i -= 1
        if all(jud):
            break
        center = center_new 
        print(center)
        iters -= 1
    return center
然后使用
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 编辑


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

dict1[1].append('123')

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

最佳答案

查看完整内容

补充:覆盖原本的值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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


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

dict1[1].append('123')

for k in range(4):
    print(k,dict1[k],id(dict1[k]))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-9-22 22:32:55 | 显示全部楼层
顶顶顶!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

应该还有很多别的解决方法,具体问题应该就是这个,楼主自己在找找好的解决方法。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-18 15:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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