感知机是二类分类的线性分类模型,输入为实例的特征向量,输出为实例的类别,取+1和-1二值,感知机对应与输入空间(特征空间)中将实例划分为正负两类的分离超平面,属于判别模型。
感知机模型
感知机学习策略
感知机学习算法的原始形式
例题1:
算法的收敛性
感知机学习算法的对偶形式
例题2:
python实现例题1:
感知机学习算法原始形式
# -*- encoding:utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
data_set=[[3,3],[4,3],[1,1]]
data_label=[1,-1]
data=np.array(data_set)
label=np.array(data_label)
#初始化w,b,alpha
w=np.array([0,0])
b=0
alpha=1
#计算y*(w*x+b)
f=(np.dot(data,w.T)+b)*label
#np.dot用法 https://blog.csdn.net/weixin_43584807/article/details/103105709
idx=np.where(f<=0)
#使用随机梯度下降法求解w,b
iteration=1
while f[idx].size!=0:
point=np.random.randint((f[idx].shape[0]))
x = data[idx[0][point],:]
y = label[idx[0][point]]
w=w+alpha*y*x
b=b+alpha*y
print(x,y)
print('Iteration:%d w:%s b:%s' %(iteration,w,b))
f=(np.dot(data,w.T)+b)*label
idx=np.where(f<=0)
iteration=iteration+1
#绘图
x1=np.arange(0,8,1)
x2=(w[0]*x1+b)/(-w[1])
idx_p=np.where(label==1)
idx_n=np.where(label==-1)
data_p=data[idx_p]
data_n=data[idx_n]
plt.scatter(data_p[:,0],data_p[:,1],color='red')
plt.scatter(data_n[:,0],data_n[:,1],color='blue')
plt.plot(x1,x2)
plt.show()
效果展示:
python实现PLA:
# -*- encoding:utf-8 -*-
'''
随机生成点
'''
import numpy as np
import matplotlib.pyplot as plt
data_set=[]
data_label=[]
num=10
x1 = np.random.normal(20, 10, int(num / 2))
y1 = np.random.normal(20, 10, int(num / 2)) # 在点 (20, 10) 周围生成点
x2 = np.random.normal(60, 10, int(num / 2))
y2 = np.random.normal(60, 10, int(num / 2)) # 在点 (60, 10) 周围生成点,保证生成的点是可被划分的
for i in range(num):
if i < num / 2:
data_set.append([x1[i], y1[i]])
data_label.append(-1)
else:
data_set.append([x2[int(i - num / 2)], y2[int(i - num / 2)]])
data_label.append(1)
data=np.array(data_set)
label=np.array(data_label)
#初始化w,b,alpha
w=np.array([0,0])
b=0
alpha=1
#计算y*(w*x+b)
f=(np.dot(data,w.T)+b)*label
#np.dot用法 https://blog.csdn.net/weixin_43584807/article/details/103105709
idx=np.where(f<=0)
#使用随机梯度下降法求解w,b
iteration=1
while f[idx].size!=0:
point=np.random.randint((f[idx].shape[0]))
x = data[idx[0][point],:]
y = label[idx[0][point]]
w=w+alpha*y*x
b=b+alpha*y
print(x,y)
print('Iteration:%d w:%s b:%s' %(iteration,w,b))
f=(np.dot(data,w.T)+b)*label
idx=np.where(f<=0)
iteration=iteration+1
#绘图
x00=np.arange(9,100,1)
y0 = (w[0]*x00+b)/(-w[1])
idx_p=np.where(label==1)
idx_n=np.where(label==-1)
data_p=data[idx_p]
data_n=data[idx_n]
plt.scatter(data_p[:,0],data_p[:,1],color='red')
plt.scatter(data_n[:,0],data_n[:,1],color='blue')
plt.plot(x00,y0)
plt.show()
效果展示: