Python3无Numpy实现K-Means的update_assignment函数求助
解决K-Means的update_assignment函数实现问题
嘿,别纠结历史距离的事儿啦!既然你已经写好assign_data函数,完全不需要再去管之前的距离数据——直接复用这个现成的函数就能搞定update_assignment,逻辑其实很清晰:
核心思路
update_assignment的本质就是基于当前质心,重新给每个数据点找归属,然后把同属一个质心的点归到一起。你的assign_data已经封装了“给单个点找最近质心”的逻辑,直接用它就行,根本不需要依赖历史距离或者上一轮的分配结果。
具体实现步骤
假设你的assign_data函数是接受单个数据点和质心字典(键是质心的键名,值是质心坐标),返回这个点对应的最近质心键名,那代码可以这么写:
def update_assignment(data, centroids): # 先初始化一个空字典,每个质心键对应一个空列表 new_assignment = {key: [] for key in centroids} # 遍历每一个数据点 for point in data: # 用你已有的assign_data函数,找到这个点所属的质心键名 closest_centroid_key = assign_data(point, centroids) # 把当前点添加到对应质心的列表里 new_assignment[closest_centroid_key].append(point) return new_assignment
如果你的assign_data是批量处理整个数据集的(比如输入整个data和centroids,返回每个点对应的质心键名列表),那可以稍微调整一下,效率可能还更高:
def update_assignment(data, centroids): new_assignment = {key: [] for key in centroids} # 用assign_data批量获取所有点的归属键名 point_centroid_keys = assign_data(data, centroids) # 把点和对应的键名配对,填充字典 for point, key in zip(data, point_centroid_keys): new_assignment[key].append(point) return new_assignment
为什么不用历史距离?
K-Means每一轮的分配都是独立基于当前质心的,上一轮的距离或者分配结果对这一轮没有意义——你只需要用当前的质心,重新给每个点计算一次最近的质心就行,assign_data已经帮你做了距离计算和比较的工作,直接复用就好啦!
只要你的assign_data逻辑是对的(正确计算欧氏距离,返回距离最小的质心键名),那这个update_assignment函数就能正常工作。
内容的提问来源于stack exchange,提问作者Bumper
相关产品推荐
相关产品推荐

