我正在构建一个具有3个输入(x,y,bias = 1)的简单感知器
他必须猜测给定的点(x,y)是 给定的函数
基本上,它的灵感来自this article
使用监督的学习模型来训练网络,公式如下:
learningConst = 0.01
error = desired - neuralAnswer
new_weights[i] = old_weights[i] + error * inputs[i] * learningConst
仍然,在 100000 训练测试之后,即使在一个简单的函数(2x + 1)上它也会出错...
以下是代码:
import numpy as np
import matplotlib.pyplot as plt
class Perceptron:
def __init__(self, n):
self.n = n #n is 2 in this case. 2 inputs [ x, y ]
self.weights = [np.random.uniform(-1, 1) for x in range(n)]
self.learningConstant = 0.05
# 1 added to the sum is the bias input
def feedForward(self, inputs):
return 1 + sum([self.weights[i]*inputs[i] for i in range(self.n)])
def activate(self, result):
if result >= 0:
return 1
elif result < 0:
return -1
def train(self, inputs, expected):
prediction = self.feedForward(inputs)
answer = self.activate(prediction)
error = expected - answer
self.weights = [
self.weights[i] + error * inputs[i] * self.learningConstant
for i in range(self.n)
]
#print(self.weights)
def predict(self, inputs):
prediction = self.feedForward(inputs)
return self.activate(prediction)
你可以在这里看到结果。绿色表示感知器猜对了,红色表示错误。 有趣的是 - 它往往会误解线下方的点。
我应该怎么做才能改进计划?
完整代码:CLICK
解
我的问题是使用偏置输入作为粗暴常量(完整代码的第14行),而不允许算法学习它。 所以,我的输入现在是[bias,x,y],权重是[w1,w3,w3] - 偏差输入现在有它的权重。
另一个好主意是将权重保存在其他地方,因此每次测试程序时算法都不必重新开始。
答案 0 :(得分:2)
你的解决方案的主要问题是你的偏见总是1.它不是一个参数 - 它是常数。所以这可能是一个问题,因为你的模型比传统的感知器模型弱得多。
答案 1 :(得分:0)
确保您要分类的数据是线性可分的,或者感知器学习算法永远不会收敛。