线性判别函数权向量的(修正)感知器算法【python实现】

"""
线性判别函数权向量的(修正)感知器算法
适用于ω_i/ω_j两类判别问题
算法流程:
(1) 赋算法初值:
    迭代步数k=0
    固定比例因子ρ=常数,0<=ρ<=1
    解权向量的初值W(0)=任选的一个向量
    连续正确分类计数器Nc=0
(2) 对所有训练样本X_m,m=0,1,...,N-1,做一下规范化处理:若X_m属于ω_j,则X_m=-X_m.
    据此得到规范化的训练样本集合{X_0,X_1,...,X_{N-1}}
(3) 取样本X=X_{k%N},计算判别函数G(X)=W(k)^T*X的取值
(4) 若G(X)<=0,则W(k+1)=W(k)+ρ*X,并置Nc=0.否则,W(k+1)=W(k),Nc+=1
(5) 若Nc>=N,则输出W(k),算法结束;否则,k=k+1,返回步骤(3)

测试实例:
输入:ω_1={(0,0),(0,1)},ω_2={(1,0),(1,1)}(均未加长),W(0)=(1,1,1),ρ=1 输出:W*=(-3,0,1)
输入:ω_1={(1,0,1),(0,1,1)},ω_2={(1,1,0),(0,1,0)},W(0)=(1,1,1,1),ρ=1 输出:W*=(0,-1,3,0)

"""
import numpy as np

def perceptron(omega1,omega2,W0,rho):
    """修正的感知器算法"""
    k=0
    Nc=0
    W=[W0]
    omega1=np.column_stack((omega1,np.ones((len(omega1),1))))
    omega2=np.column_stack((omega2,np.ones((len(omega2),1))))
    X=np.vstack((omega1,-omega2))
    N=len(X)
    while Nc<N:
        G=np.dot(W[k],X[k%N])
        if G<=0:
            W.append(W[k]+rho*X[k%N])
            Nc=0
        else:
            W.append(W[k])
            Nc+=1
        #print(k,G,W[k])
        k+=1
    return W[-1]

def perceptron_unmodified(omega1,omega2,W0,rho):
    """未修正的感知器算法"""
    k=0
    Nc=0
    W=[W0]
    omega1=np.column_stack((omega1,np.ones((len(omega1),1))))
    omega2=np.column_stack((omega2,np.ones((len(omega2),1))))
    X=np.vstack((omega1,omega2))
    N=len(X)
    while Nc<N:
        G=np.dot(W[k],X[k%N])
        if (X[k%N]==omega1).all(axis=1).any() and G<=0:
            W.append(W[k]+rho*X[k%N])
            Nc=0
        elif (X[k%N]==omega2).all(axis=1).any() and G>=0:
            W.append(W[k]-rho*X[k%N])
            Nc=0
        else:
            W.append(W[k])
            Nc+=1
        #print(k,G,W[k])
        k+=1
    return W[-1]

if __name__=='__main__':
    omega1=[[0,0],[0,1]]
    omega2=[[1,0],[1,1]]
    W0=[1,1,1]
    print(perceptron(omega1,omega2,W0,1))

参考资料:汪增福《模式识别》P38~44.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值