《统计学习方法》 第二章 感知机

感知机是二类分类的线性分类模型,输入为实例的特征向量,输出为实例的类别,取+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()

效果展示:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值