我是机器学习的新手。我已编写此代码http://ideone.com/t9VOag来训练感知器,以使用感知器训练规则学习布尔AND函数。
感知器永远不会学习正确的重量。输入(1,-1)和(-1,1)的误差使权重在0.7999999999999999,0.20000000000000004和0.7,0.300000000000000之间振荡,这显然是
For input 1, -1
target output - output given = 0-1 = -1
w1 = w1 + n*(t-o)*1 = w1 - n
w2 = w2 + n*(t-o)*(-1) = w2 + n
for input -1, 1
t-o = 0-1 = -1
w1 = w1 + (n)(t-o)(-1) = w1 + n
w2 = w2 + (n)(t-o)(1) = w2 - n
The weights are getting increased and decreased by the same amount
如果我在学习过程中包含权重w0进行更新,它就会达到解决方案(但是w0不应该更新?)。
正确的实施是什么?
答案 0 :(得分:0)
将w0完全取出代码。您的感知器应具有2个输入节点和1个输出节点,其中一个权重将每个输入节点连接到输出节点。像这样(原谅糟糕的ascii艺术):
I1
\
\W1
\
Out
/
/W2
/
I2
通过将W0
设置为1
答案 1 :(得分:0)
与你的陈述" 相反,但是w0不应该被更新",w0应该被更新,但是输入到w0总是你的不可改变的偏见(例如1)。
直觉:看看你的问题;你有两个输入可以是1或-1,他们可以改变他们的位置而不影响结果。这是"和"的性质。运营商。因此,w1应等于w2,偏置权重(w0)应为零。
简单地说,您的代码是正确的,您应该取消注释更新w0。