OR函数的感知器不会收敛

时间:2017-09-13 05:38:26

标签: python machine-learning neural-network artificial-intelligence perceptron

我正在实现一个简单的感知器,用于在python中对OR函数进行分类。但错误并不相反。任何建议都将受到高度赞赏。

def activation_function(x):
    if x<0:
        return 0
    else:
        return 1

training_set = [((0, 0), 0), ((0, 1), 1), ((1, 0), 1), ((1, 1), 1)]

w = random.rand(2)
errors = [] 
eta = .2
n = 100

for i in range(n):
    for x, y in training_set:
        u = sum(x*w)        
        error = y - activation_function(u)       
        errors.append(error) 

        for index, value in enumerate(x):
            w[index] += eta * error * value

ylim([-1,1]) 
plot(errors)

错误情节:

enter image description here

1 个答案:

答案 0 :(得分:3)

我会说你错过了偏见b ...

如果添加它,会收敛得很漂亮。

enter image description here

import numpy as np
import matplotlib.pyplot as py

np.random.seed(42)
w = np.random.rand(2)
b = 0
errors = [] 
eta = .2
n = 10

for i in range(n):
    for x, y in training_set:
        u = np.sum(x*w)+b     
        error = y - activation_function(u)       
        errors.append(error) 

        for index, value in enumerate(x):
            #print(index, " ", value)
            w[index] += eta * error * value
            b += eta*error

请注意,我导入的库与您的名称不同,但是我知道哪个函数来自哪个...让我知道这是否有助于您...

顺便说一下,这是分类的结果。我希望颜色有意义...... REd和蓝色有点华而不实,但你明白了。请注意,您可以找到解决此问题的无限解决方案。因此,如果您更改随机种子,您将得到一条不同的线,将线性地分开您的点。

enter image description here

此外,您的算法不会收敛,因为当您的线路经过(0,0)时,虽然您的预测是错误的,但是对于此特定点,权重将不会自value=0更新。所以问题是你的更新不会做任何事情。这就是你的错误出现振荡的原因。

编辑按要求我写了一个小教程(一个Jupyter笔记本),其中有一些关于如何绘制分类器决策边界的例子。你可以在github上找到它

github存储库:https://github.com/michelucci/python-Utils

希望它有用。

编辑2 :如果你想要快速和非常脏的版本(我用于红色和蓝色的情节)这里是代码

lim = 3.0
X1 = [x1 for x1 in np.arange(-lim,lim,0.1)]
X2 = [x2 for x2 in np.arange(-lim,lim,0.1)]
XX = [(x1,x2) for x1 in np.arange(-lim,lim,0.1) for x2 in np.arange(-lim,lim,0.1)]
Xcolor = ["blue" if np.sum(w[0]*x1+w[1]*x2)+b > 0  else "red" for x1 in X1 for x2 in X2]
x,y = zip(*XX)
py.scatter(x,y, c = Xcolor)
py.scatter(0,0, c = "black")
py.scatter(1,0, c = "white")
py.scatter(0,1, c = "white")
py.scatter(1,1, c = "white")
py.show()