Perceptron类plot_decision_regions方法报错及类对象使用问题求助
问题分析与解决方案
1. TypeError: 'Perceptron' object is not subscriptable 错误修复
这个错误的核心是调用plot_decision_regions时传错了参数——把Perceptron类的实例当成输入特征数组X传入,而该方法内部需要对X执行数组下标操作(比如X[:,0]),但Perceptron实例不支持这类操作,因此触发报错。
错误示例
# 错误:将Perceptron实例p当作特征数组X传入 plot_decision_regions(p, y_ex, classifier=p)
正确调用方式
将你的特征数组X_ex作为第一个参数传入,Perceptron实例作为分类器参数传入:
# 正确:传入特征数组X_ex、标签y_ex,指定分类器为Perceptron实例 plot_decision_regions(X_ex, y_ex, classifier=p)
2. init() 缺失必填参数错误修复
这个错误是因为创建Perceptron实例时,没有给类的__init__方法传全必填参数。比如你的Perceptron类定义可能要求必须传入学习率、迭代次数等参数,但创建实例时未提供。
错误示例
# 错误:未传入__init__要求的必填参数 p = Perceptron()
正确创建方式
传入所有必填参数,或给__init__参数设置默认值避免必填限制:
# 方式1:传入必填参数 p = Perceptron(eta=0.1, n_iter=50) # 方式2:给__init__参数加默认值(推荐,避免后续传参遗漏) class Perceptron: def __init__(self, eta=0.01, n_iter=10): self.eta = eta self.n_iter = n_iter # 其他初始化代码
完整修正代码示例
import numpy as np from mlxtend.plotting import plot_decision_regions import matplotlib.pyplot as plt # 正确定义Perceptron类 class Perceptron: def __init__(self, eta=0.01, n_iter=10): self.eta = eta self.n_iter = n_iter self.w_ = None self.errors_ = [] def fit(self, X, y): self.w_ = np.zeros(1 + X.shape[1]) self.errors_ = [] for _ in range(self.n_iter): errors = 0 for xi, target in zip(X, y): update = self.eta * (target - self.predict(xi)) self.w_[1:] += update * xi self.w_[0] += update errors += int(update != 0.0) self.errors_.append(errors) return self def net_input(self, X): return np.dot(X, self.w_[1:]) + self.w_[0] def predict(self, X): return np.where(self.net_input(X) >= 0.0, 1, -1) # 模拟数据 X_ex = np.array([[1, 2], [2, 3], [3, 1], [4, 2]]) y_ex = np.array([-1, -1, 1, 1]) # 正确创建实例并训练 p = Perceptron(eta=0.1, n_iter=20) p.fit(X_ex, y_ex) # 正确调用决策边界绘制方法 plot_decision_regions(X_ex, y_ex, classifier=p) plt.xlabel('Feature 1') plt.ylabel('Feature 2') plt.title('Perceptron Decision Regions') plt.show()
额外注意点
- 如果是自定义的
plot_decision_regions方法,务必确认参数顺序:第一个参数应为特征数组X,而非分类器实例。 - 给
__init__参数设置默认值,能大幅降低后续创建实例时的参数遗漏问题。
内容的提问来源于stack exchange,提问作者My_password_is_my_cat
相关产品推荐
相关产品推荐

