美文网首页
机器学习6:感知器算法python实现

机器学习6:感知器算法python实现

作者: 崔业康 | 来源:发表于2018-07-10 14:51 被阅读0次
    单样本感知器算法

    单样本感知器算法仅读取一次样本,每读取一次样本,就是一次迭代。每次迭代时,只考虑用一个训练模式修正权重矢量。

    代码1

    or分类,1 or 0 =1 、0 or 0 =0

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    #code:myhaspl@qq.com
    #8-1.py
    import numpy as np
    b=0
    a=0.5
    #输入向量
    x = np.array([[b,1,1],[b,1,0],[b,0,0],[b,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):
        return oldw+a*(myd-comy(oldw,myx))*myx
    #从第一个向量开始,每次通过上一个权重和这个向量计算权重
    i=0
    for xn in x:
        w=neww(w,d[i],xn,a)
        i+=1
    
    for xn in x:
        print("%d or %d => %d "%(xn[1],xn[2],comy(w,xn)))
    
    
    
    代码2

    2x+1=y,7x+1=y 分类

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    #8-2.py
    import numpy as np
    b=1
    a=0.3
    x=np.array([[b,1,3],[b,2,5],[b,1,8],[b,2,15],[b,3,7],[b,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):
            return oldw+a*(myd-comy(oldw,myx))*myx
    i=0
    for xn in x:
            w=neww(w,d[i],xn,a)
            i+=1
    
       
    test=np.array([b,9,19])
    print("%d ~ %d => %d "%(test[1],test[2],comy(w,test)))
    test=np.array([b,9,64])
    print("%d ~ %d => %d "%(test[1],test[2],comy(w,test)))
    print(w)
    
    代码3

    按照分类绘图

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    #8-3.py
    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]])
    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):
            return oldw+a*(myd-comy(oldw,myx))*myx
    i=0
    for xn in x:
            w=neww(w,d[i],xn,a)
            i+=1
    
    #取向量的第二位数(x值)
    myx=x[:,1]
    #取向量的第三位数(y值)
    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]>0:
            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],'bx') 
    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],'bx')
    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],'bx')
    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],'bx')
    #绘制分类线
    testx=np.array(range(0,20))
    testy=testx*2+1.68
    pl.plot(testx,testy,'g--')
            
    pl.show()
    
    
    代码4

    每次计算所有向量,梯度下降求权重

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    #code:myhaspl@qq.com
    #8-4.py
    
    import numpy as np
    b=1
    a=0.5
    x = np.array([[1,1,3],[1,2,3],[1,1,8],[1,2,15]])
    d =np.array([1,1,-1,-1])
    w=np.array([b,0,0])
    wucha=0
    ddcount=50
    
    
    def sgn(v):
            if v>0:
                    return 1
            else:
                    return -1
    def comy(myw,myx):
            return sgn(np.dot(myw.T,myx))
    
    #梯度下降计算权重
    def tiduxz(myw,myx,mya):
            i=0
            sum_x=np.array([0,0,0])
            for xn in myx:
                    if comy(myw,xn)!=d[i]:
                            sum_x+=d[i]*xn
                    i+=1
            return mya*sum_x
    
    
            
    i=0                
    while  True:
            tdxz=tiduxz(w,x,a)
            print(w)
            w=w+tdxz
            i=i+1
            if abs(tdxz.sum())<=wucha or i>=ddcount:break
            
    
    test=np.array([1,9,19])
    print("%d %d => %d "%(test[1],test[2],comy(w,test)))
    test=np.array([1,3,22])
    print("%d %d => %d "%(test[1],test[2],comy(w,test)))
    
    输出均方误差
    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    #code:myhaspl@qq.com
    #8-5.py
    import numpy as np
    b=1
    a=0.1
    x = np.array([[1,1,1],[1,1,0],[1,0,1],[1,0,0]])
    d =np.array([1,1,1,0])
    w=np.array([b,0,0])
    expect_e=0.005
    maxtrycount=20
    
    def sgn(v):
            if v>0:
                    return 1
            else:
                    return 0
    def get_v(myw,myx):
            return sgn(np.dot(myw.T,myx))
    #权重调整函数
    def neww(oldw,myd,myx,a):
            mye=get_e(oldw,myx,myd)
            return (oldw+a*mye*myx,mye)
    #推测值与正确值的差值
    def get_e(myw,myx,myd):
            return myd-get_v(myw,myx)
    
    
    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("第 %d 次调整后的权值:"%mycount)
            print(w)
            print("误差:%f"%mye)
            if mye<expect_e or mycount>maxtrycount:break 
                   
    for xn in x:
            print("%d or %d => %d "%(xn[1],xn[2],get_v(w,xn)))
    

    机器学习实践指南——案例应用解析(麦好)

    相关文章

      网友评论

          本文标题:机器学习6:感知器算法python实现

          本文链接:https://www.haomeiwen.com/subject/rjgfpftx.html