博主您好,拜读了您《Python实现聚类K-means算法》这篇文章(https://blog.csdn.net/wyn1564464568/article/details/125782286?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170032756216800226592639%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=170032756216800226592639&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~baidu_landing_v2~default-4-125782286-null-null.nonecase&utm_term=Python%E5%AE%9E%E7%8E%B0%E8%81%9A%E7%B1%BBK-means%E7%AE%97%E6%B3%95&spm=1018.2226.3001.4450)
个人在想改造一下这部分代码,有个想法请教:
在约束条件”每个簇内的西瓜样本数量是一样多的“(每个簇有10个西瓜数据)前提下,把这30个西瓜数据聚类分成3个簇,:
但是运行程序后,聚类分布示意图里总有两个数据点出现异常,不能实现”每个簇有10个西瓜数据“。麻烦博主帮忙分析一下如何改进代码(自己修改过的代码片段如下)。
# 清空对簇的划分,对应上面算法的第3行
clusters = []
c = []
for i in range(k):
clusters.append([])
c.append([])
# 这个for对应上面算法的4-8行
for melon in melons:
'''
argmin 函数找出容器中最小的下标,在这里这个目标容器是:
list(map(lambda vec: np.linalg.norm(melon - vec, ord = 1), mean_vectors)),
它表示melon与mean_vectors中所有向量的距离列表。
(numpy.linalg.norm计算向量的范数,ord = 1即曼哈顿范数,ord = 2即欧几里得范数或模长)
'''
L = list(map(lambda vec: np.linalg.norm(melon - vec, ord=1), mean_vectors))
# 表示melon与mean_vectors中所有向量的曼哈顿距离列表
for i in range(k):
c[i] = np.argmin(L) # 取最小距离对应的下标值,存入c
if len(clusters[c[i]]) < 10:
clusters[c[i]].append(melon)
break # 如果最小距离值下标对应的样本簇,簇内样本数量少于10,则将该样本加入该簇
else:
L[c[i]] = 999999
# 否则,将最小距离c[i]定义无穷大,并继续重复上述步骤