感知器没有正确学习

时间:2021-04-06 18:36:41

标签: python machine-learning

我为 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)

1 个答案:

答案 0 :(得分:1)

我在您的代码中注意到的两件事:

  1. 当您将 numpy 数组分配给新变量时,它们被视为相同的变量,即。对新变量的更改将影响初始变量。这意味着当您更改 y_train_01_subset、y_train_02_subset 和 y_train_03_subset 值时,您的代码将更改 y_train。这意味着您的代码仅适用于您的第一个子集,因为当您到达第二个集合时 y_train 将全部为 -1。使用 .copy() 来解决这个问题。
  2. 在您的 y_train_03_subset 中,您将等于 0 的值设置为 2,然后将等于 2 的值设置为等于 -1,因此您的所有值都将为 -1。重新排列这些行。

要解决这些问题,请替换为以下代码:

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)
相关问题