python代码实现
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
'''建立感知机模型(原始形式)'''
def PM(X,Y):
#设置感知机模型w和b、h(学习率)的初值
w=np.array([[0,0]])
b=0
h=1
#迭代,更新参数
work=True
while work:
n=0 #计数器
for i in range(X.shape[0]):
if Y[i]*(np.dot(w,np.array([X[i]]).T)+b)<=0:
#更新参数
w=w+h*Y[i]*np.array([X[i]])
b=b+h*Y[i]
n+=1
else:
continue
if n==0:
work=False
#感知机模型
return w,b
if __name__=="__main__":
X=np.array([[3,3],[4,3],[1,1]])
Y=[1,1,-1]
w,b=PM(X,Y)
'''可视化'''
plt.scatter([X[i][0] for i in range(X.shape[0]-1)],[X[i][1] for i in range(X.shape[0]-1)],c='b',label="1")
plt.scatter([X[X.shape[0]-1][0]],[X[X.shape[0]-1][1]],c='orange',label="-1")
#确定函数
p1=w[0][0]
p2=w[0][1] #系数
x=np.linspace(1,4,10)
# w₀x₀ + w₁y + b = 0 => y = -(w₀x₀ + b)/w₁ 这里把x₁用y来代替,因为要画到二维坐标系上,就是两个维度,另一个当成y
y=-(p1*x+b)/p2 #分离超平面
plt.plot(x,y,c='plum',label="分离超平面")
#预测点(2,2)
m=2
n=2
if p1*m+p2*n+b>=0:
k=1
else:
k=-1
print("点(2,2)属于{}类".format(k))
plt.scatter([2],[2],c='r',marker="*",label="预测点")
plt.legend()
plt.show()