首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >感知器学不到正确的东西

感知器学不到正确的东西
EN

Stack Overflow用户
提问于 2021-04-06 18:36:41
回答 1查看 70关注 0票数 0

我为虹膜数据集编写了3类分类(有3类),并使用3种感知器。我对感知器学习有问题,感知器只对头等舱正确,二等和三等有相同的权重,我不知道我做错了什么。总是以感知为头等,学习正确,分类正确。第一个感知器有目标0,第二个1和第三个目标2。当我交换位置,第一个感知器和目标2学习时,感知器和目标2会工作得很好,第一个感知器总是工作得很好,下一个感知器工作得很差。将数据设置为训练是有问题的。

PS。这是我的第一个python应用程序。

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-07 03:16:22

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

当您将numpy数组分配给一个新变量时,

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

为了解决这些问题,请在下面的代码中替换:

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66974560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档