在没有任何外部软件包(例如numpy和scipy)的情况下从头开始用python写kmeans,当我试图将数据点分配给集群时遇到了这个问题。
基本上,对于每个数据点,我都会找到最接近该点的聚类,然后通过将数据点添加到属于该聚类的点列表(即字典的值)来更新聚类字典。我的问题是,当我尝试更新字典中的键时,会将所有其他字典值都设置为None,这是不正确的。
试图将过程的各个步骤分开并逐行查看,但是当我尝试更新一个值时,所有其他值都变为None。
clusters = dict.fromkeys(k_init, [].copy())
for elem in data:
minC = (101010101, 9999999)
for cent in k_init:
#print(elem, cent)
if eucliean(elem, cent) < minC[1]:
minC = (cent, eucliean(elem, cent))
key = minC[0]
old = clusters.get(key)
clusters[key] = old.append(elem)
答案 0 :(得分:0)
问题就在线上
clusters = dict.fromkeys(k_init, [].copy())
当您创建如上所述的字典时,每个键都被分配了相同列表的引用。因此,每当您添加到任何键的列表时,所有其他键的引用都是相同的,因此您会看到它被附加到所有键上。为避免此问题,请执行以下操作:
clusters = { key : list([]) for key in keys }