You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:31:31