现在的位置: 首页 > 综合 > 正文

数学之路(3)-机器学习(3)-机器学习算法-神经网络[1]

2014年02月02日 ⁄ 综合 ⁄ 共 1941字 ⁄ 字号 评论关闭

二、机器学习算法

(一)神经网络

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类

本博客所有内容是原创,未经书面许可,严禁任何形式的转载

http://blog.csdn.net/u010255642

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
b=1
a=0.3
x = np.array([[1,1,3],[1,2,3],[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),分类完全准确

抱歉!评论已关闭.