感知器算法:
代码逻辑:
1.先声明两个二维list并赋值(增广向量)
2.将二维list转为二维np数组,并把M2数组样本×(-1),再将两个np数组用vstack上下合并(hstack是左右合并)。
3.取校正增量C值为1,权向量wi取初值[0,0,0,0]T。
4.编写感知器算法,遍历M3二维数组里面的每个模式向量,并用权向量与之相乘(注意要用点积np.dot(wi,vector)才能出来一个数值),判断该值是否>0。
>0,权向量不变;≤0,权向量+=对应模式向量。
5.count用来计点积值≤0的次数,还有就继续迭代;flag用于跳出迭代。
import numpy as np
M1=[[0,0,0,1],[1,0,0,1],[1,0,1,1],[1,1,0,1]]
M2=[[0,0,1,1],[0,1,1,1],[0,1,0,1],[1,1,1,1]]
M1=np.array(M1)
M2=np.array(M2)
M2=M2*-1
M3=np.vstack((M1,M2))
print(M3,"\n")
C=1
wi=np.array([0,0,0,0])
def cal_func(wi,M3):
count=0
flag=1
iter_cout=0
while flag != 0:
count=0
iter_cout+=1
for vector in M3:
if np.dot(wi,vector) > 0:
wi=wi
else:
count=count+1
wi=wi+vector
if count == 0:
flag=0
print("共进行",iter_cout,"次迭代")
print("解向量W=",wi)
cal_func(wi,M3)