基于ADALINE网络的LMS算法识别手写数字1和2

#!/usr/bin/env python
#-*- coding: utf-8 -*-
#code:myhaspl@qq.com
#9-14.py


import numpy as np


import mlpy
import cv2




print 'loading  ...'


def getnumc(fn):
    '''返回数字特征'''
    fnimg = cv2.imread(fn)
    img=cv2.resize(fnimg,(8,8))
    alltz=[]


    for now_h in xrange(0,8):
        xtz=[]        
        for now_w in xrange(0,8):
            b = img[now_h,now_w,0]
            g = img[now_h,now_w,1]
            r = img[now_h,now_w,2]
            btz=255-b
            gtz=255-g
            rtz=255-r
            if btz>0 or gtz>0 or rtz>0:
                nowtz=1
            else:
                nowtz=0
            xtz.append(nowtz)  
        alltz+=xtz


   
    return alltz
    


#读取样本数字
x=[]
y=[]
for numi in xrange(1,3):
    for numj in xrange(1,5):
        fn='nums/'+str(numi)+'-'+str(numj)+'.png'
        x.append(getnumc(fn))
        y.append(numi)
    


x=np.array(x)
#以下分别为目标输出数字1-2
d =np.array([0,0,0,0,1,1,1,1])
y=np.array(y)
a=0.1
expect_e=0.0005
maxtrycount=200


def sgn(v):
        if v>0:
                return 1
        else:
                return 0
def get_v(myw,myx):
        return sgn(np.dot(myw,myx.T))
def neww(oldw,myd,myx,a):
        mye=get_e(oldw,myx,myd)
        return (oldw+2*a*mye*myx,mye)
def get_e(myw,myx,myd):
        return myd-get_v(myw,myx.T)
 


w=zeros((1,64),dtype=float64)
mycount=0
while True:
        mye=0
        i=0          
        for xn in x:
                w,e=neww(w,d[i],xn,a)
                i+=1
                mye+=pow(e,2)  
        mye/=float(i)
        mycount+=1
        #print u"第 %d 次调整后的权值:"%mycount
        #print w
        print u"误差:%f"%mye        
        if mye<expect_e or mycount>maxtrycount:break 
               
for xn in x:
        print get_v(w,xn.T)


svm = mlpy.LibSvm(svm_type='c_svc', kernel_type='poly',gamma=10)
svm.learn(x, y)
print u"训练样本测试"
print svm.pred(x)
print u"未知图像测试"
for iii in xrange (1,3):
    testfn= 'nums/test/'+str(iii)+'-test.png'
    #testfn='nums/'+str(iii)+'-'+'2'+'.png'
    testx=[]
    testx.append(getnumc(testfn))
    
    print     
    print testfn+":",
    print svm.pred(testx)

    print get_v(w,np.array(testx))+1



因为这里只用了一个神经元,所以只能产生一个判别边界,故只能对两个数字进行识别。每个数字都有4个样本,结果证明,用其它的测试样三进行测试,效果很好。程序中部分是参考别人写的或门程序,刚开始没有用sgn函数,发现对样本进行训练时,都能很快达到误差为0,但是用测试样本测试时,不是输出精确的-1或1的近似值,所以改就加了一个sgn函数程序中也带了SVM的代码,暂时我也没有看,没有学到那里去,好晚了突然好想睡觉,哈哈!!!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值