赞
踩
机器学习-感知器学习算法
Python语言实现
初学者整理,参考资料均来源于网上
感知器是由美国计算机科学家罗森布拉特(Rosenblatt)于1957年提出的。感知器可谓是最早的人工神经网络。
感知器分单层感知器和多层感知器。
单层感知器是一个具有一层神经元、采用阈值激活函数的前向网络。通过对网络权值的训练,可以使感知器对一组输人矢量的响应达到元素为0或1的目标输出,从而实现对输人矢量分类的目的。
单层感知器是一个简单的线性二分类器,它保存着输入权重,根据输入和内置的函数计算输出.人工神经网络中的单个神经元。
单层感知器可以计算逻辑或,逻辑与,逻辑非等运算,但是不能计算异或。因为异或不是平面线性可分的,在多层感知器中解决。
单层感知器只有输入和输出,输入和输出直接相连,多个输入一个输出。
模型为每个输入定义为X,输入到输出的权重定义为w,所有的输入和权重的乘积和为输出的值,对于这个乘积和做如下处理,如果乘机和大于临界值(一般是0),输入端就取1;如果小于临界值,就取-1。
单层感知器可将外部输入分为两类。当感知器的输出为+1时,输入属于L1类,当感知器输出-1时,输入属于L2类,从而实现两类目标的识别。在二维空间,单层感知器进行模式识别的判决超平面由下式决定:。
对于只有两个输入的判别边界是直线(),选择合适的学习算法可训练出满意的w1和w2。将样本中两类数据用直线分开。如下图:
b的值决定了直线的偏移量,w决定了直线的旋转度数。
第一步、设置变量和参数
f(x)为激活函数,y(n)为实际输出,d(n)为期望输出,λ为学习速率,n为迭代次数,e为实际输出与期望输出的误差。
第二步、初始化
给权值向量w的各个分量赋一个较小的随机非零值,置n=1
第三步、输入一组样本X(n)=[1,x1(n),x2(n),…,xm(n)],并给出它的期望输出d(n)。
第四步、计算出实际输出:y(n)=f()
第五步、求出期望输出和实际输出的差 e=d(n)-y(n)。根据误差判断输出是否满足条件,一般为对所有样本误差为零或者均小于预设的值,则算法结束,否则将值增加1,并用下式调整权值:
w(n+1)=w(n)+λ[d(n)-y(n)]x(n)。
权值调整公式属于随机梯度下降算法。(待确认)
然后转到第三步,进行下一轮计算过程。
感知器源码(Perceptron.py):
#单层感知器机器学习算法 20170621 gyk
#多层感知器使用梯度下降算法进行训练
#单层感知器只能解决线性可分问题
#importlogging
#importos
#预测函数,训练使用使用公式“输入×权重的和”为结果。使用阶跃函数sigmoid把结果转换为1或0
#由于默认第一个输入为1,第一个权重为b,所以在公式转换为:w1*x1+w2*x2+b=0
#结果等于0为线性分割线的线上。小于0为线下,大于0为线上。用该线把结果分成两种。
#由于在预测的时候,输入参数比训练参数少一个结果列,所以不能用输入参数数组计算特征列,而是用权重数组减去第一个bias偏移量列来计算特征数。
defpredict(inputs, weights):
activation = weights[0]
for i in range(len(weights)-1):
activation += weights[i+1]*inputs[i]
return sigmoid(activation)
#阶跃函数,把值转换成1/0或者1/-1
defsigmoid(value):
return 1.0 if value >= 0.0 else 0.0
#训练
#初始化权重为0.5,然后循环训练集,读取每一条训练集数据,进行预测,然后把预测结果和实际结果进行对比,如果一样就用下一条训练。如果和实际结果不相等。就使用随机梯度下降算法重新计算权重。
#然后重新训练,直到所有训练数据的预测结果和实际结果一直,则训练结束。
#训练的结果其实就是在平面上找一条直线,该直线能把两类的数据点分割在直线的两边。如果有的点是错误的,就变化w1和w2来旋转直线,变化w0来移动直线找到最佳位置。训练速率太大会找不到最佳位置,
#训练速率太小,训练速度就太慢。期望值和实际值的差值的正负决定了旋转和移动的方向。
#l_rate为学习速率,一般在0~0.1
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。