神经网络:用于猜测点相对于函数的位置的感知器

时间:2016-05-14 07:09:32

标签: python neural-network perceptron

我正在构建一个具有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)

你可以在这里看到结果。绿色表示感知器猜对了,红色表示错误。 有趣的是 - 它往往会误解线下方的点。

我应该怎么做才能改进计划?

Perceptron results

完整代码CLICK

我的问题是使用偏置输入作为粗暴常量(完整代码的第14行),而不允许算法学习它。 所以,我的输入现在是[bias,x,y],权重是[w1,w3,w3] - 偏差输入现在有它的权重。

另一个好主意是将权重保存在其他地方,因此每次测试程序时算法都不必重新开始。

2x + 1 Image

x ^ 2 - 2x + 1 enter image description here

2 个答案:

答案 0 :(得分:2)

你的解决方案的主要问题是你的偏见总是1.它不是一个参数 - 它是常数。所以这可能是一个问题,因为你的模型比传统的感知器模型弱得多。

答案 1 :(得分:0)

确保您要分类的数据是线性可分的,或者感知器学习算法永远不会收敛。