码迷,mamicode.com
首页 > 其他好文 > 详细

感知器

时间:2016-06-17 16:47:57      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:

感知器学习过程:

随机选取权值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 &&times++<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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!