我为 iris 数据集编写了 3 个类分类(有 3 个类)并且我使用了 3 个感知器。我在感知器学习方面有问题,感知器只对第一类正确学习,第二类和第三类具有相同的权重,我不知道我做错了什么。总是一流的感知器学习正确并分类正确。第一个感知器有目标 0,第二个 1 和第三个 2。当我交换位置并且第一个学习时,目标为 2 的感知器会正常工作,第一个总是工作正常,接下来的两个工作得不好。设置要训练的数据有问题。
附注。这是我的第一个 python 应用程序。
import matplotlib.pyplot as plt
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import datasets
class Perceptron(object):
def __init__(self, eta=0.01, n_iter=10):
self.eta = eta
self.n_iter = n_iter
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)
print(self.w_)
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)
def main():
iris = datasets.load_iris()
X = iris.data[:, [2, 3]]
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1, stratify=y)
X_train_01_subset = X_train
y_train_01_subset = y_train
y_train_01_subset[(y_train_01_subset == 0)] = -1
y_train_01_subset[(y_train_01_subset == 1)] = -1
y_train_01_subset[(y_train_01_subset == 2)] = 0
ppn01 = Perceptron(eta=0.1, n_iter=10)
ppn01.fit(X_train_01_subset, y_train_01_subset)
X_train_02_subset = X_train
y_train_02_subset = y_train
y_train_02_subset[(y_train_02_subset == 1)] = 1
y_train_02_subset[(y_train_02_subset == 0)] = -1
y_train_02_subset[(y_train_02_subset == 2)] = -1
ppn02 = Perceptron(eta=0.1, n_iter=10)
ppn02.fit(X_train_02_subset, y_train_02_subset)
X_train_03_subset = X_train
y_train_03_subset = y_train
y_train_03_subset[(y_train_03_subset == 1)] = -1
y_train_03_subset[(y_train_03_subset == 0)] = 2
y_train_03_subset[(y_train_03_subset == 2)] = -1
ppn03 = Perceptron(eta=0.1, n_iter=10)
ppn03.fit(X_train_03_subset, y_train_03_subset)
答案 0 :(得分:1)
我在您的代码中注意到的两件事:
.copy()
来解决这个问题。要解决这些问题,请替换为以下代码:
X_train_01_subset = X_train.copy()
y_train_01_subset = y_train.copy()
y_train_01_subset[(y_train_01_subset == 0)] = -1
y_train_01_subset[(y_train_01_subset == 1)] = -1
y_train_01_subset[(y_train_01_subset == 2)] = 0
ppn01 = Perceptron(eta=0.1, n_iter=10)
ppn01.fit(X_train_01_subset, y_train_01_subset)
X_train_02_subset = X_train.copy()
y_train_02_subset = y_train.copy()
y_train_02_subset[(y_train_02_subset == 1)] = 1
y_train_02_subset[(y_train_02_subset == 0)] = -1
y_train_02_subset[(y_train_02_subset == 2)] = -1
ppn02 = Perceptron(eta=0.1, n_iter=10)
ppn02.fit(X_train_02_subset, y_train_02_subset)
X_train_03_subset = X_train.copy()
y_train_03_subset = y_train.copy()
y_train_03_subset[(y_train_03_subset == 1)] = -1
y_train_03_subset[(y_train_03_subset == 2)] = -1
y_train_03_subset[(y_train_03_subset == 0)] = 2
ppn03 = Perceptron(eta=0.1, n_iter=10)
ppn03.fit(X_train_03_subset, y_train_03_subset)