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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:55:23