Python Perceptron不工作,似乎只使用numpy不使用库进行训练

2024-09-27 21:23:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我不明白为什么我的感知机不工作,它没有从训练数据中学习,我也不知道为什么。它每一个时代都会出错,并且会收敛,我是不是遗漏了什么? 这是源代码

import numpy as np
import matplotlib.pyplot as plt
 
trainData = np.genfromtxt('train.data', delimiter=",")
testData = np.genfromtxt('test.data', delimiter=",")
 
 
class Perceptron():
 
    def __init__(self, learnRate, maxEpoch):
        self.learnRate = learnRate
        self.maxEpoch = maxEpoch
 
    def train(self, data):
 
        np.random.seed(2)
        x0 = np.ones((len(data),1))
        w0 = np.zeros((1))
        weights = np.random.rand((len(data[0]))-1)
        weights = np.hstack([w0,weights])
        data = np.hstack([x0,data])
        np.random.shuffle(data)
        label = data[:,5:]
        data = data[:,:5]
        iter = 0
        for epoch in range(self.maxEpoch): #trainign
            errors = 0
            rowCount = 0
            for row in data:
                activation = np.inner(row, weights)
                y = label[rowCount]# Class label
                rowCount += 1
                if y * activation <= 0:
                    for wx in weights:
                        wx = wx + y * row[int(wx)]
                        weights[0] = weights[0] + y
                    errors += 1
            iter += 1
        print(f'Errors total: {errors}')
        return weights
 
 
def classPicker(classX, classY):
    set1 = trainData[:40,:4]
    set2 = trainData[40:80,:4]
    set3 = trainData[80:120,:4]
    class0 = np.full((40,1),-1)
    class1 = np.ones((40,1))
 
    if classX == 1 and classY == 2:
        return np.vstack([np.hstack([set1,class0]),np.hstack([set2,class1])])
    if classX == 2 and classY == 3:
        return np.vstack([np.hstack([set2,class0]),np.hstack([set3,class1])])
    if classX == 1 and classY == 3:
        return np.vstack([np.hstack([set1,class0]),np.hstack([set3,class1])])
 
 
#Class 1 & 2
pececptron1 = Perceptron(1,20)
trainDataset = (classPicker(1,2))
pececptron1.train(trainDataset)
 
#Class 2 & 3
#pececptron2 = Perceptron(1,1)
#trainDataset = classPicker(2,3)
#pececptron2.train(trainDataset)
 
#Class 1 & 3
#pececptron3 = Perceptron(1,1)
#trainDataset = classPicker(1,3)
#pececptron3.train(trainDataset)

该数据集是iris数据集的修改版本。 数据数组在第25行看起来是这样的,就在训练循环之前

label = 40 x 1 array of 1 or -1 depending on class
weights = [0, 0.4359949, 0.02592623, 0.54966248, 0.43532239] first entry in all weights = w0 aka bias
data =  [1, 5, 3.4, 1.5, 0.2] first entry in all  = x0 (1) for the bias

Tags: 数据inselffordatanptrainlabel

热门问题