python有专门的神经网络库,但为了加深印象,我自己在numpy库的基础上,自己编写了一个简单的神经网络程序,是基于Rosenblatt感知器的,这个感知器建立在一个线性神经元之上,神经元模型的求和节点计算作用于突触输入的线性组合,同时结合外部作用的偏置,对若干个突触的输入求和后进行调节。为了便于观察,这里的数据采用二维数据。
目标函数是训练结果的误差的平方和,由于目标函数是一个二次函数,只存在一个全局极小值,所以采用梯度下降法的策略寻找目标函数的最小值。
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
import numpy as np import pylab as pl b = 1 #偏置 a = 0.3 #学习率 x = np.array([[b, 1 , 3 ],[b, 2 , 3 ],[b, 1 , 8 ],[b, 2 , 15 ],[b, 3 , 7 ],[b, 4 , 29 ],[b, 4 , 8 ],[b, 4 , 20 ]]) #训练数据 d = np.array([ 1 , 1 , - 1 , - 1 , 1 , - 1 , 1 , - 1 ]) #训练数据类别 w = np.array([b, 0 , 0 ]) #初始w 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): return oldw + a * (myd - comy(oldw,myx)) * myx for ii in range ( 5 ): #迭代次数 i = 0 for xn in x: w = neww(w,d[i],xn,a) i + = 1 print w myx = x[:, 1 ] #绘制训练数据 myy = x[:, 2 ] pl.subplot( 111 ) x_max = np. max (myx) + 15 x_min = np. min (myx) - 5 y_max = np. max (myy) + 50 y_min = np. min (myy) - 5 pl.xlabel(u "x" ) pl.xlim(x_min,x_max) pl.ylabel(u "y" ) pl.ylim(y_min,y_max) for i in range ( 0 , len (d)): if d[i] = = 1 : pl.plot(myx[i],myy[i], 'r*' ) else : pl.plot(myx[i],myy[i], 'ro' ) #绘制测试点 test = np.array([b, 9 , 19 ]) if comy(w,test)> 0 : pl.plot(test[ 1 ],test[ 2 ], 'b*' ) else : pl.plot(test[ 1 ],test[ 2 ], 'bo' ) test = np.array([b, 9 , 64 ]) if comy(w,test)> 0 : pl.plot(test[ 1 ],test[ 2 ], 'b*' ) else : pl.plot(test[ 1 ],test[ 2 ], 'bo' ) test = np.array([b, 9 , 16 ]) if comy(w,test)> 0 : pl.plot(test[ 1 ],test[ 2 ], 'b*' ) else : pl.plot(test[ 1 ],test[ 2 ], 'bo' ) test = np.array([b, 9 , 60 ]) if comy(w,test)> 0 : pl.plot(test[ 1 ],test[ 2 ], 'b*' ) else : pl.plot(test[ 1 ],test[ 2 ], 'bo' ) #绘制分类线 testx = np.array( range ( 0 , 20 )) testy = testx * 2 + 1.68 pl.plot(testx,testy, 'g--' ) pl.show() for xn in x: print "%d %d => %d" % (xn[ 1 ],xn[ 2 ],comy(w,xn)) |
图中红色是训练数据,蓝色是测试数据,圆点代表类别-1.星点代表类别1。由图可知,对于线性可分的数据集,Rosenblatt感知器的分类效果还是不错的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://blog.csdn.net/cui134/article/details/25632981