运行聚类质心更新代码时持续出现KeyError:0,请求排查
KeyError:0 问题定位与修复
核心原因
clustered_points是字典类型,但你用列表索引的方式clustered_points[i]去访问元素。字典只能通过对应的键取值,当键0不存在时,就会抛出KeyError:0。
代码逻辑矛盾
你在注释里写clusters = [] #dictionary to hold clusters with new centroids,但实际clusters是列表,反而传入的clustered_points才是字典(通常K-means中会用簇ID作为键来存储对应簇的点集合)。
修复方案
方案1:适配字典类型的clustered_points
直接遍历字典的所有值(每个簇的点集合),不用依赖k_centroids生成索引:
def get_new_centroid(clustered_points, k_centroids): clusters = [] for points in clustered_points.values(): new_centroid = compute_new_centroid(points) clusters.append((new_centroid, points)) return clusters
方案2:确保clustered_points是列表类型
检查调用get_new_centroid时传入的参数,确认clustered_points是包含k_centroids个元素的列表,每个元素对应一个簇的点集合。比如:
# 调用示例(确保clustered_points是列表) clustered_points = [[(1,2), (3,4)], [(5,6), (7,8)]] new_clusters = get_new_centroid(clustered_points, 2)
额外优化
原compute_new_centroid固定处理二维数据,改成动态适配任意维度,同时增加空簇判断:
def compute_new_centroid(elem): if not elem: raise ValueError("簇中没有点,无法计算质心") dim = len(elem[0]) new_centroid = [] for i in range(dim): total = sum(point[i] for point in elem) new_centroid.append(total / len(elem)) return new_centroid
内容的提问来源于stack exchange,提问作者Reese Chloe Batumbakal
相关产品推荐
相关产品推荐

