Python KMeans类代码出现NameError: self未定义错误求助
排查KMeans实现中的
NameError: name 'self' is not defined错误 错误原因
self作用域违规:self是Python类实例的专属引用,只能在类的方法(如__init__、自定义方法)内部使用。你把初始化质心的代码写在了KMeans类定义的外部,属于全局作用域,这里不存在self变量,直接触发NameError。- 变量名不一致:
__init__里定义的是self.n_cluster(单数),但后续代码用的是self.n_clusters(复数),就算修复作用域问题,也会触发AttributeError。
解决方法
方案1:将质心初始化逻辑移入__init__方法
把生成质心的代码放到__init__内部,同时修正变量名:
import numpy as np from scipy.stats import uniform # 确保导入uniform函数 class KMeans: def __init__(self, n_clusters=8, max_iter=300, X_train=None): self.n_clusters = n_clusters # 统一变量名为复数 self.max_iter = max_iter # 质心初始化逻辑移到__init__内 if X_train is not None: min_, max_ = np.min(X_train, axis=0), np.max(X_train, axis=0) # scipy.uniform的参数为loc(起始值)和scale(范围),需调整参数格式 self.centroids = [uniform.rvs(min_, max_ - min_, size=min_.shape) for _ in range(self.n_clusters)]
方案2:用fit方法实现(推荐,符合机器学习库规范)
按照常规设计,将数据相关逻辑放到fit方法中,__init__仅负责初始化超参数:
import numpy as np from scipy.stats import uniform class KMeans: def __init__(self, n_clusters=8, max_iter=300): self.n_clusters = n_clusters # 修正变量名 self.max_iter = max_iter self.centroids = None # 先初始化属性占位 def fit(self, X): # 生成初始质心的逻辑放到fit方法内 min_, max_ = np.min(X, axis=0), np.max(X, axis=0) self.centroids = [uniform.rvs(min_, max_ - min_, size=min_.shape) for _ in range(self.n_clusters)] # 此处可添加后续迭代更新质心的逻辑 # 使用示例 # kmeans = KMeans(n_clusters=3) # kmeans.fit(X_train)
这种设计更合理,训练数据X_train不属于类的超参数,应在fit阶段传入,而非__init__。
内容的提问来源于stack exchange,提问作者Fresh Grad CS
相关产品推荐
相关产品推荐

