当我们最初学习机器学习时候,了解到最简单的神经网络可能便是单层感知器,他也是监督学习的最简单一种。本文章就通过《人工神经网络理论、设计及应用》书中介绍的单层感知器一节,进行python的代码实现。
单层感知器的网络结构如下:
上图便是一个单层感知器,很简单的一个结构,图中说明我们有个3维的输入值分别是x1、x2、x3,输入端和其上的权值0.3相乘,然后将乘积相加后,最后通过激活函数对乘积和进行处理得到输出值y。
感知器学习算法:
采用感知器学习规则(对误差平方求导推极值问题),考虑到训练过程是感知器权值随每一步调整改变的过程,为此用t表示学习的迭代次数,权值看作t的函数。t=0表示学习开始前的初始状态,此时对应的权值为初始化值。训练可按如下步骤进行:
(1)、对各权值
(m为计算层的节点数)赋予较小的非零随机数;
(2)、输入样本对 {
} ,x是训练样本,d是样本的目标值;
(3)、计算各节点的实际输出
(t) = sgn[
(t)
] , j =1 ,2 ...... m;
(4)、调整各节点的权值
(t+1) =
+
[
]
,j=1,2......m;其中
为学习率,用于控制调整速度,学习率太大会影响训练的稳定性,太小则使训练的收敛速度变慢,一般取值范围0<
1;
(5)、返回到步骤2输入下一对样本
好了,有了上面的基本知识后,我们通过简单的python代码来实现单层感知网络。比如我们有如下图的例子:
首先建立数据集
import numpy as np
#建立数据集
x = np.mat([[1,0,0],[1,0,1],[1,1,0],[1,1,1],[0,0,1],[0,1,0],[0,1,1],[0,0,0]])
y = np.mat([[-1],[1],[1],[1],[-1],[-1],[1],[-1],])
#设置初始权值和偏置值
w = np.mat([0.3,0.3,0.3])
baise = 0.4
#学习率
rate = 0.01
#激活函数
def sgn(x):
return np.where(x >= 0.0, 1, -1)
#通过学习规则,进行迭代
for i in range(1000):
#误差计算
errors = 0
for j in range(len(x)):
#误差计算
r = rate*(y[j] - sgn(x[j]*w.T+baise))
#r = rate*(y[j] - (x[j]*w.T+baise))
#调整权值
w += r*x[j]
baise += r
#误差计算
errors += abs(r)
print(i,' iter :error is ', errors)
if errors ==0:
break
下图,是我运行上面程序的结果,可以看到迭代了8次后,误差为0:
通过计算出来的权值W和偏置值baise进行验证模型是否正确:
sgn(x*w.T+baise)
可以看到模型的输出和实际y的值一模一样: