我为虹膜数据集编写了3类分类(有3类),并使用3种感知器。我对感知器学习有问题,感知器只对头等舱正确,二等和三等有相同的权重,我不知道我做错了什么。总是以感知为头等,学习正确,分类正确。第一个感知器有目标0,第二个1和第三个目标2。当我交换位置,第一个感知器和目标2学习时,感知器和目标2会工作得很好,第一个感知器总是工作得很好,下一个感知器工作得很差。将数据设置为训练是有问题的。
PS。这是我的第一个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)发布于 2021-04-07 03:16:22
我在您的代码中注意到了两件事:
当您将numpy数组分配给一个新变量时,
.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)https://stackoverflow.com/questions/66974560
复制相似问题