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
相关产品推荐
相关产品推荐

