"""
线性判别函数权向量的(修正)感知器算法
适用于ω_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.