标签:
感知器学习过程:
随机选取权值W的初始值(between 0-1)
将样本数据中的输入值输入到感知器的输入节点
得到网络的输出值O,根据学习公式,由O与T的差,即误差信号来调整网络权值W
如果误差小于给定阈值,或运行次数达到限定次数则停止;否则转2,反复运行。
用感知器对平面的4个点(如下图)进行线性划分:
感知器原理图:
v = x*w1 +y*w2
程序变量解释:
Err = T –O
O 是预测得到的输出
T 是实际值,即教师信号
Wj = Wj + alph * Ij * Err
Ij 是第j个输入节点的输入值
alph 是一个常数,表示学习率
样本:
•x=0, y=0, T=0
•x=0, y=1, T=0
•x=1, y=0, T=1
•x=1, y=1, T=1
初值: w1=0.1, w2=0.1, w0=-1
取步长alph= 0.1, 则Δw= alph *Ij*(T-O)
代码:
class Perceptron{ public static void main(String[] args){ double x[] = {0,0,1,1}; double y[] = {0,1,0,1}; double T[] = {0,0,1,1}; double w1,w2,w0,v; double Err,O; double alph= 0.1;//学习率 w1 =0.1;w2 =0.1;w0 =-1;//初始值 double e = 1.0E-4; int times =0; double E ;//累加误差 do{ E = 0; for(int k=0;k<x.length;k++){ v = x[k]*w1 + y[k]*w2 + w0; O = sign(v); Err = T[k] - O; w1 = w1 + alph*x[k]*Err; w2 = w2 + alph*y[k]*Err; w0 = w0 + alph*1.0*Err; E += Err; System.out.println("w1,w2,w0:\t"+w1+"\t"+w2+"\t"+w0); } }while(E > e &×++<100);//误差或者迭代次数达到要求就跳出循环 System.out.println("w1,w2,w0:\t"+w1+"\t"+w2+"\t"+w0); } public static double sign(double v){ return v>=0?1.0:0.0; } }
结果:
w1,w2,w0: 0.1 0.1 -1.0 w1,w2,w0: 0.1 0.1 -1.0 w1,w2,w0: 0.2 0.1 -0.9 w1,w2,w0: 0.30000000000000004 0.2 -0.8 w1,w2,w0: 0.30000000000000004 0.2 -0.8 w1,w2,w0: 0.30000000000000004 0.2 -0.8 w1,w2,w0: 0.4 0.2 -0.7000000000000001 w1,w2,w0: 0.5 0.30000000000000004 -0.6000000000000001 w1,w2,w0: 0.5 0.30000000000000004 -0.6000000000000001 w1,w2,w0: 0.5 0.30000000000000004 -0.6000000000000001 w1,w2,w0: 0.6 0.30000000000000004 -0.5000000000000001 w1,w2,w0: 0.6 0.30000000000000004 -0.5000000000000001 w1,w2,w0: 0.6 0.30000000000000004 -0.5000000000000001 w1,w2,w0: 0.6 0.30000000000000004 -0.5000000000000001 w1,w2,w0: 0.6 0.30000000000000004 -0.5000000000000001 w1,w2,w0: 0.6 0.30000000000000004 -0.5000000000000001 w1,w2,w0: 0.6 0.30000000000000004 -0.5000000000000001
O=sign(v+w0)=sign(0.6*x+0.3*y-0.5)
标签:
原文地址:http://www.cnblogs.com/yuanzhenliu/p/5594217.html