标签:
感知器学习过程:
随机选取权值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