(一)神经网络
1、感知器
Rosenblatt感知器建立在一个线性神经元上,神经元模型的求和节点计算作用于突触上的输入的线性组合,同时结合外部作用的偏置。
诱导局部域是指求和节点计算得到的结果,然后这个结果被应用于硬限幅器。当硬限幅器输入为正时,神经元输出+1,反之输出-1。
其最终结果是把外部输入x1,x2,...,xm正确分成两类,分类规则是,如果感知器输出是+1,则为类1,否则输出为-1为类2。感知器被超平面分开为2类,这个超平面为
得到权值w的过程就是一个误差修正的学习过程。
我们用python来实现一个Rosenblatt感知器。相关的数值计算使用numpy包,numpy是一个用python实现的科学计算包,它基于BSD协议开源,官网为:http://www.numpy.org/,下载地址为:https://pypi.python.org/pypi/numpy,关于如何使用python进行科学计算可参考《用Python做科学计算》,可从http://cfa.everpcpc.com/scipydoc/index.html上免费下载。
下面是一个用感知器求逻辑与的操作
#!/usr/bin/env python # -*- coding: utf-8 -*- import numpy as np b=0 a=0.5 x = np.array([[1,1,1],[1,1,0],[1,0,0],[1,0,1]]) d =np.array([1,1,0,1]) w=np.array([b,0,0]) def sgn(v): if v>0: return 1 else: return 0 def comy(myw,myx): return sgn(np.dot(myw.T,myx)) def neww(oldw,myd,myx,a): print comy(oldw,myx) return oldw+a*(myd-comy(oldw,myx))*myx i=0 for xn in x: print xn w=neww(w,d[i],xn,a) i+=1 print w for xn in x: print "%d and %d => %d "%(xn[1],xn[2],comy(w,xn))
求解及验证结果如下:
>>>
[0 1 1]
0
[ 0. 0.5 0.5]
[0 1 0]
1
[ 0. 0.5 0.5]
[0 0 0]
0
[ 0. 0.5 0.5]
[0 0 1]
1
[ 0. 0.5 0.5]
1 and 1 => 1
1 and 0 => 1
0 and 0 => 0
0 and 1 => 1
>>>
我们下面测试一个更有难度的,一组数值,(x,y) 其关系为x*2+1=y为1类,x*7+1=y为2类
#!/usr/bin/env python # -*- coding: utf-8 -*- import numpy as np b=1 a=0.3 x = np.array([[1,1,3],[1,2,5],[1,1,8],[1,2,15],[1,3,7],[1,4,29]]) d =np.array([1,1,-1,-1,1,-1]) w=np.array([b,0,0]) def sgn(v): if v>0: return 1 else: return -1 def comy(myw,myx): return sgn(np.dot(myw.T,myx)) def neww(oldw,myd,myx,a): print comy(oldw,myx) return oldw+a*(myd-comy(oldw,myx))*myx i=0 for xn in x: print xn w=neww(w,d[i],xn,a) i+=1 print w for xn in x: print "%d and %d => %d "%(xn[1],xn[2],comy(w,xn)) test=np.array([b,9,19]) print "%d and %d => %d "%(test[1],test[2],comy(w,test)) test=np.array([b,9,64]) print "%d and %d => %d "%(test[1],test[2],comy(w,test))
[1 1 3]
1
[ 1. 0. 0.]
[1 2 3]
1
[ 1. 0. 0.]
[1 1 8]
1
[ 0.4 -0.6 -4.8]
[ 1 2 15]
-1
[ 0.4 -0.6 -4.8]
[1 3 7]
-1
[ 1. 1.2 -0.6]
[ 1 4 29]
-1
[ 1. 1.2 -0.6]
1 and 3 => 1
2 and 3 => 1
1 and 8 => -1
2 and 15 => -1
3 and 7 => 1
4 and 29 => -1
9 and 19 => 1
9 and 64 => -1
>>>
最后2行我们使用样本中没有出现过的数字(9,19)和(9,64),分类完全准确