感知机

1 感知机模型

感知机,是机器学习中二分类问题中的一个非常简单的模型,是最找的监督式训练算法,是神经网络构建的基础。
在这里插入图片描述
  定义:假设输入空间(特征空间)是 χ ⊆ R n \chi\subseteq R^n χRn,输出空间是 Y = { + 1 , − 1 } Y=\{+1, -1\} Y={+1,1}。输入 x ∈ χ x\in\chi xχ表示实例的特征向量,对应于输入空间的点,即感知模型也是线性分类器模型;输出 y ∈ Y y\in Y yY表示实例的列别。由输入空间到输出空间的如下函数 f ( x ) = s i g n ( w ⋅ x + b ) f(x)=sign(w·x+b) f(x)=sign(wx+b)
称为感知机。
   w 和 b w和b wb是感知机模型参数
   w ∈ R n w\in R^n wRn是权值或权值向量
   b ∈ R b\in R bR是偏置
   w ⋅ x w·x wxbi表示w和x的内积
   s i g n sign sign是符号函数即 s i g n ( x ) = { + 1 , x ≥ 0 − 1 , x ≤ 0 sign(x)=\begin{cases} +1, & x\geq 0\\ -1, & x\leq 0 \end{cases} sign(x)={+1,1,x0x0

  感知机的线性解释: 线性方程 w ⋅ x + b = 0 w·x+b=0 wx+b=0对应特征空间 R n R^n Rn中的一个超平面S,其中w是超平面的法向量,b是超平面的截距。超平面会将空间划分为两个部分,位于两部分的点分为正负两类。


2 学习策略

  线性可分定义:能够将数据集的正实例和负实例完全划分到超平面的两侧,则数据线性可分。
  确定感知机学习策略即定义损失函数并将损失函数最小化。
可选策略:

  • 误差分类点的总数,但是这样损失函数 w , b w,b w,b不是连续可导函数,不易优化
  • 误分类点到超平面的总距离,损失函数定义为 L ( w , b ) = − 1 ∣ ∣ w ∣ ∣ ∑ x i ∈ M y i ( w ⋅ x i + b ) L(w,b)=-\frac{1}{||w||}\sum_{x_i\in M}y_i(w·x_i+b) L(w,b)=w1xiMyi(wxi+b),不考虑 1 ∣ ∣ w ∣ ∣ \frac{1}{||w||} w1,就得到告知及学习的损失函数。
    感知机 s i g n ( w ⋅ x + b ) sign(w·x+b) sign(wx+b)学习的损失函数定义为: L ( w , b ) = − ∑ x i ∈ M y i ( w ⋅ x i + b ) L(w,b)=-\sum_{x_i\in M}yi(w·x_i+b) L(w,b)=xiMyi(wxi+b),M为误分类点的集合。

3 感知机学习算法

目标是将损失函数 L ( w , b ) L(w,b) L(w,b)最小化
  随机梯度下降:任意选取一个超平面 w 0 , b 0 w_0,b_0 w0,b0,然后用梯度下降不断地极小化 L ( w , b ) L(w,b) L(w,b),损失函数地梯度由:
∇ w L ( w , b ) = − ∑ x i ∈ M y i x i \nabla_wL(w,b)=-\sum_{x_i\in M}y_ix_i wL(w,b)=xiMyixi
∇ b L ( w , b ) = − ∑ x i ∈ M y i \nabla_bL(w,b)=-\sum_{x_i\in M}y_i bL(w,b)=xiMyi
给出。
  随机选取一个误分类点 ( x i , y i ) (x_i,y_i) (xi,yi),对w,b进行更新:
w ← w + η y i x i w\leftarrow w+\eta y_ix_i ww+ηyixi
b ← b + η y i b\leftarrow b+\eta y_i bb+ηyi
其中 η \eta η是步长,又称学习率。

感知机学习算法地原始形式

输出: w , b ; 感 知 机 模 型 f ( x ) = s i g n ( w ⋅ x + b ) . w,b;感知机模型f(x)=sign(w·x+b). w,bf(x)=sign(wx+b).
(1)选取初值 w 0 , b 0 w_0,b_0 w0,b0
(2)在训练集中选取数据 ( x i , y i ) (x_i,y_i) (xi,yi)
(3)如果 y i ( w ⋅ x i + b ) ≤ 0 y_i(w·x_i+b)\leq 0 yi(wxi+b)0
w ← w + η y i x i w\leftarrow w+\eta y_ix_i ww+ηyixi
b ← b + η y i b\leftarrow b+\eta y_i bb+ηyi
(4)转至(2),直到没有误分类点

w ^ = ( w T , b ) T \hat w=(w^T,b)^T w^=(wT,b)T
x ^ = ( x T , 1 ) T \hat x=(x^T,1)^T x^=(xT,1)T
定理: 设训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x n , y n ) } T=\{(x_1,y_1),(x_2,y_2),...,(x_n,y_n)\} T={(x1,y1),(x2,y2),...,(xn,yn)}是线性可分的,其中 x i ∈ χ = R n , y i ∈ Y = { − 1 , + 1 } x_i\in\chi=R^n,y_i\in Y=\{-1,+1\} xiχ=Rn,yiY={1,+1}则:
 &wmsp;(1)存在满足条件 ∣ ∣ w ^ o p t ∣ ∣ = 1 ||\hat w_{opt}||=1 w^opt=1的超平面 w ^ o p t ⋅ x ^ i = w o p t ⋅ x + b o p t = 0 \hat w_{opt}·\hat x_i=w_{opt}·x+b_{opt}=0 w^optx^i=woptx+bopt=0将训练数据集完全正确分开;且存在 γ > 0 \gamma\gt0 γ>0 y i ( w ^ o p t ⋅ x ^ i ) = y i ( w o p t ⋅ x + b o p t ) ≥ γ y_i(\hat w_{opt}·\hat x_i)=y_i(w_{opt}·x+b_{opt})\geq\gamma yi(w^optx^i)=yi(woptx+bopt)γ
  (2)令 R = m a x i ≥ N ≥ N ∣ ∣ x ^ i ∣ ∣ R=max_{i\geq N\geq N}||\hat x_i|| R=maxiNNx^i,则感知机算法2.1在训练数据集上的误分类次数k满足不等式 k ≤ ( R γ ) 2 k\leq(\frac{R}{\gamma})^2 k(γR)2

from __future__ import division     #表示精确除法
import random
import numpy as np
import matplotlib.pyplot as plt

# 返回sign函数的结果
def sign(v):
    if v >= 0:
        return 1
    else:
        return -1

# 训练函数
def train(train_num, train_datas, lr):  #lr表示学习率
    w = [0, 0]
    b = 0
    for i in range(train_num):  #设定训练次数
        x = random.choice(train_datas)  #从训练集中随机选择一条数据
        x1, x2, y = x
        if (y * sign((w[0] * x1 + w[1] * x2 + b)) <= 0):
            w[0] += lr * y * x1
            w[1] += lr * y * x2
            b += lr * y
    return w, b

def plot_points(train_datas, w, b):
    plt.figure()
    x1 = np.linspace(0, 8, 100)
    x2 = (-b - w[0] * x1)/w[1]
    plt.plot(x1, x2, color='r', label='y1 data')
    datas_len = len(train_datas)
    for i in range(datas_len):
        if train_datas[i][-1] == 1:
            plt.scatter(train_datas[i][0], train_datas[i][1], s=50)
        else:
            plt.scatter(train_datas[i][0], train_datas[i][1], marker='x', s=50)
    plt.show()

train_data1 = [[1, 3, 1], [2, 2, 1], [3, 8, 1], [2, 6, 1]]  # 正样本
train_data2 = [[2, 1, -1], [4, 1, -1], [6, 2, -1], [7, 3, -1]]  # 负样本
train_datas = train_data1 + train_data2  # 样本集
w, b = train(train_num=50, train_datas=train_datas, lr=0.01)
plot_points(train_datas, w, b)

感知机学习算法的对偶形式:

对于 w 和 b w和b wb的更新公式为:
w ← w + η y i x i w\leftarrow w+\eta y_ix_i ww+ηyixi
b ← b + η y i b\leftarrow b+\eta y_i bb+ηyi
若将 w 和 b w和b wb初始化为0,则最后学习到的 w 和 b w和b wb可以分别表示为( α = n i η \alpha=n_i\eta α=niη):
w = ∑ i = 1 N α i y i x i w=\sum_{i=1}^N\alpha_iy_ix_i w=i=1Nαiyixi
b = ∑ i = 1 N α i y i b=\sum_{i=1}^N\alpha_iy_i b=i=1Nαiyi
当 η = 1 时 α i 当\eta=1时\alpha_i η=1αi表示第i个实例由于误分类而进行的更新的次数,更新次数越多意味着它距离分离超平面越近,也就越难正确分类。
算法过程:
感知机模型更新为 f ( x ) = s i g n ( ∑ i = 1 N α i y i x i ⋅ x + ∑ i = 1 N α i y i ) f(x)=sign(\sum_{i=1}^N\alpha_iy_ix_i·x+\sum_{i=1}^N\alpha_iy_i) f(x)=sign(i=1Nαiyixix+i=1Nαiyi)其中 α = ( α 1 , α 2 , . . . , α N ) T \alpha=(\alpha_1,\alpha_2,...,\alpha_N)^T α=(α1,α2,...,αN)T.
(1) α ← 0 \alpha\leftarrow0 α0 b ← 0 b\leftarrow0 b0
(2)在训练集中选取数据(x_i,y_i)
(3)如果 y i ( ∑ j = 1 N α j y j x j ⋅ x i + b ) ≤ 0 y_i(\sum_{j=1}^N\alpha_jy_jx_j·x_i+b)\leq0 yi(j=1Nαjyjxjxi+b)0
α i ← α i + η \alpha_i\leftarrow\alpha_i+\eta αiαi+η
b ← b + η y i b\leftarrow b+\eta y_i bb+ηyi
(4)转至(2)直到没有误差分类数据。
  对于迭代的过程中,需要多次计算 x j ⋅ x i x_j·x_i xjxi,因此使用Gram矩阵来减少重复计算 G r a m = [ x i ⋅ x j ] N × N Gram=[x_i·x_j]_{N\times N} Gram=[xixj]N×N

# Gram矩阵
gram = np.matmul(x, x.T)

感知机的对偶形式就是把对 w , b 的 学 习 变 成 了 α , b w,b的学习变成了\alpha,b w,bα,b的学习,原始形式中, w w w在每一轮迭代错时都需更新,而采用对偶形式时,对某一点分类错误时,只需要 更新对应的 α i \alpha_i αi即可,最后一次计算出 w w w.

def train(train_num, train_datas, lr):  #lr为学习率
    w = [0, 0]
    b = 0
    datas_len = len(train_datas)
    alpha = [0 for i in range(datas_len)]
    train_array = np.array(train_datas)
    gram = np.matmul(train_array[:, 0:-1], train_array[:, 0:-1].T)
    print(train_array)
    for idx in range(train_num):
        tmp = 0
        i = random.randint(0, datas_len-1)
        yi = train_array[i, -1]
        for j in range(datas_len):
            tmp += alpha[j] * train_array[j, -1] * gram[i, j]
        tmp += b
        if yi * tmp <= 0:
            alpha[i] = alpha[i] + lr
            b = b + lr * yi
    for i in range(datas_len):
        w += alpha[i] * train_array[i, 0: -1] * train_array[i, -1]
    return w, b, alpha, gram


代码参考:

https://blog.youkuaiyun.com/winter_evening/article/details/70196040

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值