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

Python实现聚类算法报TypeError: 'list' object is not callable如何解决

错误触发原因

你遇到的TypeError: 'list' object is not callable是命名冲突导致的:

  • 代码第8行你将assign_cluster定义为了空列表:assign_cluster = []
  • 代码第15行你又试图将assign_cluster作为函数调用:assign = assign_cluster(distance,xs[c],representatives)
    Python解释器会优先使用最近赋值的变量属性,此时assign_cluster是列表类型,没有可调用的__call__方法,因此直接抛出类型错误。
    你只需要将存储结果的列表变量名修改为不与函数名重复的名称,比如改为cluster_records,就能直接解决这个类型错误。

其他潜在逻辑问题

除了命名冲突外,你的代码还存在多处逻辑错误会导致聚类结果不符合预期:

  • 第15行传入的xs[c]取值错误:c是内层计算距离循环的临时变量,循环结束后固定为K-1,此处应该传入当前遍历的样本xs[i]
  • 质心更新逻辑错误:第16行你将新质心赋值给了存储样本分组标签的group_assignments数组,应该赋值给representatives对应分组的位置
  • 初始质心逻辑错误:representatives初始化为全零数组后,没有先根据随机生成的初始分组更新质心,直接用来计算距离不符合聚类算法的执行逻辑
  • 无提前停止条件:代码没有添加分组无变化时提前终止迭代的逻辑,会固定跑完所有steps,浪费算力

修复参考代码

import numpy as np
# 补充你依赖的两个工具函数的示例实现,可根据自己的需求调整
def compute_distance(vec1, vec2):
    return np.sum(np.square(vec1 - vec2))

def compute_new_cluster(samples, old_center):
    return np.mean(samples, axis=0) if len(samples) > 0 else old_center

def clustering(xs, K, steps=10):
    (T, W) = xs.shape
    representatives = np.zeros((K, W)) 
    group_assignments = np.random.randint(0, K, T)
    # 先根据初始分组计算初始质心
    for k in range(K):
        cluster_samples = xs[group_assignments == k]
        representatives[k] = compute_new_cluster(cluster_samples, representatives[k])
    group_history = [group_assignments.copy()]

    assign = []
    # 重命名结果存储列表,避免和函数重名
    final_assignments = []
    for iteration in range(steps):
        changed = False
        # 按簇存储属于该组的样本
        cluster_samples = [[] for _ in range(K)]
        for i in range(len(xs)):
            distance = {}
            for c in range(K):
                distance[c] = compute_distance(xs[i], representatives[c])
            # 调用分配簇的函数
            assign = assign_cluster(distance, xs[i], representatives)
            if group_assignments[i] != assign[0]:
                changed = True
                group_assignments[i] = assign[0]
            cluster_samples[assign[0]].append(xs[i])
        # 更新所有簇的质心
        for k in range(K):
            representatives[k] = compute_new_cluster(cluster_samples[k], representatives[k])
        group_history.append(group_assignments.copy())
        # 分组无变化时提前终止迭代
        if not changed:
            break
        if iteration == (steps - 1):
            final_assignments.append(assign)
            
    return [final_assignments, K, representatives, group_history]

内容的提问来源于stack exchange,提问作者cs_forgals

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 04:15:00