【机器学习】感知机算法的原理和实现

本文详细介绍了感知机算法,包括其作为线性分类模型的定义、模型参数、学习策略和损失函数。文章重点阐述了感知机的原始形式,通过随机梯度下降法进行参数更新,同时提到了其在面对线性不可分数据时的局限性,并与支持向量机、神经网络等其他算法进行了对比。此外,文章还预告了对偶形式的感知机算法的理论和实现。
摘要由CSDN通过智能技术生成

文章目录

  • 推荐
  • 一、简介
  • 二、模型
  • 三、策略
  • 四、感知机算法的原始形式
    • 1、理论
    • 2、实现(代码)
    • 3、效果
  • 五、感知机算法的对偶形式
    • 1、理论
    • 2、实现(代码)
    • 3、效果


推荐

  去年看完吴恩达的机器学习网课之后,虽然记了很多笔记,但是感觉学的太多也太浅,应该是自己学的不够认真,没有一个完整的体系。(吴老师的课讲得很细,很适合初学者,即便你是高中毕业稍微花点时间也可以学懂)
  今年开学除了完成学业,也有在查机器学习方面的资料。在知乎上找相关学习资料时,发现知乎如何学习《统计学习方法》下面有两类人,一类是大佬推荐一些论文和英文资料,对我个人来说,靠此入门有点困难,要是大佬就无所谓;一类就是各种营销号之类的去卖课程,卖书,里面说的天花乱坠,其实干货太少,这个极其不推荐的。
  在此我推荐机器学习的入门书——李航教授的《统计学习方法》
  偶然之间我在b站找到了一位up主的带读视频,是我找到的所有适合初学者学这本书教程里,最良心和细致的教学,up主以一个小白的视角去带大家推每一个公式,复习线性代数和概率论的相关知识,极力推荐大家去读。

【机器学习】带读李航 第一章-第四章《统计学习方法 第二版 监督学习》 跟我一起从菜鸟成长为大神


一、简介

  1. 定义:感知机 (perceptron) 类分类的线性分类模型,其输入为实例的特征向量,输
    出为实例的类别,取 +1 和-1值。
  2. 感知机对应于输入空间中将实例划分为正负两类的分离超平面,属于判别模型
  3. 目的:感知机学习旨在求出将训练数据进行线性划分的分离超平面,为此,导入基于误分类的损失函数,利用梯度下降法对损失函数进行极小化,求得感知机模型。
  4. 特点:感知机学习算法具有简单,并且易于实现的特点,分为原始形式对偶形式
  5. 预测:感知机预测是用学习得到的感知机模型对新的输入实例进行分类。

感知机的思想很好理解,比如我们在一个屋子里有很多的男人和女人,感知机的模型就是尝试找到一条直线,能够把所有的男人和女人隔离开。放到三维或者更高维的空间,感知机的模型就是尝试找到一个超平面,能够把所有的二元类别隔离开。当然,如果我们找不到这么一条直线的话怎么办?找不到的话那就意味着类别线性不可分,也就意味着感知机模型不适合你的数据的分类。

  1. 算法前提:数据集得线性可分。感知机模型遇上线性不可分的数据,它的学习算法就不会收敛,它就不能经过有限次选代可以得到 1个将训练数据集完全正确划分的分离超平面及感知机模型。
  2. 这一前提大大限制了它的应用场景。

它的分类竞争对手在面对不可分的情况时,比如支持向量机可以通过核技巧来让数据在高维可分,神经网络可以通过优化激活函数、增加隐藏层和支持多输出,来让数据可分。


二、模型

  • 输入空间 χ ⊆   R n \chi\subseteq\ R^n χ Rn

R n R^n Rn:n维实数集,即( x 1 , x 2 , . . . , x n x_1,x_2, ... ,x_n x1,x2,...,xn) , R n R^n Rn中每个元素是n维向量,向量中的每个分量是实数。

  • 输出空间 Y = { − 1 , + 1 } Y=\{-1,+1\} Y={1,+1}
  • 感知机模型 f ( x ) = s i g n ( ω ⋅ x + b ) f(x)=sign(\omega\cdot x+b) f(x)=sign(ωx+b)
  • 模型参数: ω ∈ R n \omega\in R^n ωRn b ∈ R b\in R bR ω \omega ω叫做权值向量
    b b b叫做偏置
    ω ⋅ x \omega\cdot x ωx表示 ω \omega ω x x 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<0 \end{cases} sign(x)={+1,x01,x<0
  • 假设空间:感知机是一种线性分类模型,属于判别模型。感知机模型的假设空间是定义在特征空间中的所有线性分类模型或线性分类器 ,即函数集合 { f ∣ f ( x ) = ω ⋅ x + b } \{f|f(x)=\omega\cdot x + b\} {ff(x)=ωx+b}
  • 训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯   , ( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\} T={(x1,y1),(x2,y2),,(xN,yN)}其中, x i ∈ χ = R n x_i\in \chi =R^n xiχ=Rn y i ∈ Y = { − 1 , + 1 } y_i\in Y =\{-1,+1\} yiY={1,+1} i = 1 , 2 , ⋯   , N i=1,2,\cdots,N i=1,2,,N

∈ \in 是“属于“,表示元素和集合之间的关系
⊆ \subseteq 是”包含于“,表示集合和集合之间的关系


三、策略

  1. 数据集的线性可分性
      给定一个数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯   , ( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\} T={(x1,y1),(x2,y2),,(xN,yN)}其中, x i ∈ χ = R n x_i\in \chi =R^n xiχ=Rn y i ∈ Y = { − 1 , + 1 } y_i\in Y =\{-1,+1\} yiY={1,+1} i = 1 , 2 , ⋯   , N i=1,2,\cdots,N i=1,2,,N,如果存在某个超平面 S S S ω ⋅ x + b = 0 \omega\cdot x+b=0 ωx+b=0能够将数据集的正实例点和负实例点完全正确地划分到超平面的两侧,即对所有 y i = + 1 y_i = +1 yi=+1的实例 i i i ,有 ω ⋅ x i + b > 0 \omega\cdot x_i + b >0 ωxi+b>0 ,对所有 y i = − 1 y_i =-1 yi=1 的实例 i i i ,有 ω ⋅ x i + b < 0 \omega\cdot x_i + b <0 ωxi+b<0 ,则称数据集 T T T为线性可分数据集;否则,称数据集 T T T为线性不可分
  2. 感知机学习策略
      假设训练数据集是线性可分的,感知机学习的目标是求得一个能够将训练集正实例点和负实例点完全正确分开的分离超平面。
      为了找出这样的超平面,即确定感知机模型参数 ω \omega ω b b b,需要确定一个学习策略,即定义(经验)损失函数并将损失函数极小化。
      损失函数的另一个自然选择是误分类点到超平面的总距离,这是感知机所采用的。

损失函数的一个 自然选择 是误分类点的总数。但是这样的损失函数不是 ω , b \omega,b ω,b的连续可导函数,所以不能求该损失函数的极小值。

自然选择:自然选择就是最接近人类思维方向逻辑推断

  1. 策略中的损失函数
  • 首先写出输入空间 R n R^n Rn中任一点 x 0 x_0 x0到超平面 S S S的距离: 1 ∥ ω ∥ ∣ ω ⋅ x 0 + b ∣ \frac {1}{\parallel\omega\parallel} \mid \omega\cdot x_0+b\mid ω1ωx0+b这里 ∥ ω ∥ \parallel\omega\parallel ω ω \omega ω L 2 L_2 L2范数。
    上式可联想到点到直线的距离公式
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sFwwNcAY-1721958901331)(https://i-blog.csdnimg.cn/blog_migrate/06796039fabe5a594e5293811ad18f5c.png)]
  • 其次,对于误分类的数据 ( x i , y i ) (x_i,y_i) (xi,yi)来说 − y i ( ω ⋅ x i + b ) > 0 -y_i(\omega\cdot x_i+b)>0 yi(ωxi+b)>0成立。因为对于误分类数据,当 ω ⋅ x i + b > 0 \omega\cdot x_i+b>0 ωxi+b>0时, y i = − 1 y_i=-1 yi=1;当 ω ⋅ x i + b < 0 \omega\cdot x_i+b<0 ωxi+b<0时, y i = + 1 y_i=+1 yi=+1。即 ω ⋅ x i + b 与 y i 是 异 号 \omega\cdot x_i+b与y_i是异号 ωxi+byi
  • 这样,误分类点 ( x i , y i ) (x_i,y_i) (xi,yi)到超平面 S S S的距离为 − 1 ∥ ω ∥ y i ∣ ω ⋅ x i + b ∣ -\frac{1}{\parallel\omega\parallel}y_i\mid\omega\cdot x_i+b\mid ω1yiωxi+b假设超平面 S S S的误分类点的集合为 M M M,那么所有误分类点到超平面 S S S的总距离为 − 1 ∥ ω ∥ ∑ x i ∈ M y i ∣ ω ⋅ x i + b ∣ -\frac{1}{\parallel\omega\parallel}\sum_{x_i\in M}^{}y_i{\mid\omega\cdot x_i+b\mid} ω1xiMyiωxi+b若不考虑 1 ∥ ω ∥ \frac{1}{\parallel\omega\parallel} ω1就得到感知机学习的损失函数。
    为什么不考虑 1 ∥ ω ∥ \frac{1}{\parallel\omega\parallel} ω1见我下一篇博客
  • 感知机损失函数定义(上面为推导过程)

  给定一个数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯   , ( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\} T={(x1,y1),(x2,y2),,(xN,yN)}其中, x i ∈ χ = R n x_i\in \chi =R^n xiχ=Rn y i ∈ Y = { − 1 , + 1 } y_i\in Y =\{-1,+1\} yiY={1,+1} i = 1 , 2 , ⋯   , N i=1,2,\cdots,N i=1,2,,N,感知机 s i g n ( ω ⋅ x + b ) sign(\omega\cdot x+b) sign(ωx+b)学习的损失函数定义为 L ( ω , b ) = − ∑ x i ∈ M y i ∣ ω ⋅ x i + b ∣ L(\omega,b)=-\sum_{x_i\in M}^{}y_i{\mid\omega\cdot x_i+b\mid} L(ω,b)=xiMyiωxi+b

L 2 L_2 L2范数:向量中各元素的平方和然后求平方根。
即欧氏距离

四、感知机算法的原始形式

1、理论

  经过模型,策略的推导,我们已经把感知机学习问题转化为损失函数的最优化问题,最优化方法为随机梯度下降法。

  给定一个数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯   , ( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\} T={(x1,y1),(x2,y2),,(xN,yN)}其中, x i ∈ χ = R n x_i\in \chi =R^n xiχ=Rn y i ∈ Y = { − 1 , + 1 } y_i\in Y =\{-1,+1\} yiY={1,+1} i = 1 , 2 , ⋯   , N i=1,2,\cdots,N i=1,2,,N,求参数 ω , b \omega,b ωb 使其为损失函数最小化问题的解(即求下式的解 ω , b \omega,b ωb min ⁡ ω , b L ( ω , b ) = − ∑ x i ∈ M y i ∣ ω ⋅ x i + b ∣ \min_{\omega,b}{L(\omega,b)}=-\sum_{x_i\in M}^{}y_i{\mid\omega\cdot x_i+b\mid} ω,bminL(ω,b)=xiMyiωxi+b上式中 M M M为超平面 S S S的误分类点的集合。

感知机学习算法是误分类驱动的,具体采用随机梯度下降法 (该方法见后面的博客)
首先,任意选取一个超平面 ω 0 , b 0 \omega_0,b_0 ω0,b0,然后用梯度下降法不断地极小化目标函数,极小化过程中不是一次使 M M M中所有误分类点的梯度下降,而是一次随机选取一个误分类点使其梯度下降。

假设误分类点的集合 M M M是固定的,那么损失函数 L ( ω , b ) L(\omega,b) L(ω,b)的梯度由
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F2GwEndi-1721958901333)(https://i-blog.csdnimg.cn/blog_migrate/4a6865ac8c0e008511ba5d821617cc34.jpeg)]
给出。

随机选取一个误分类点 ( x i , y i ) (x_i,y_i) (xi,yi), 对 ω , b \omega,b ω,b 进行更新: ω ← ω + η y i x i \omega\leftarrow\omega+\eta y_ix_i ωω+ηyixi b ← b + η y i b\leftarrow b+\eta y_i bb+ηyi式中 η ( 0 < η < 1 ) \eta (0<\eta<1) η(0<η<1)叫做步长,也叫做学习率。
这样,通过迭代可以使损失函数 L ( ω , b ) L(\omega, b) L(ω,b) 不断减小,直到为0 。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-25K2Cv1P-1721958901334)(https://i-blog.csdnimg.cn/blog_migrate/2bbfc746105072f906d8367c167f7f8e.png)]

损失函数 L ( ω , b ) L(\omega, b) L(ω,b)是非负的。如果没有误分类点,损失函数值是0 。而且,误分类点越少,误分类点离超平面越近,损失函数值就越小。一 个特定的样本点的损失函数:在误分类时是参 ω , b \omega,b ω,b 的线性函数,在正确分类时是 0。

2、实现(代码)

import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
%matplotlib inline
# load data
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['label'] = iris.target
df.columns = [
    'sepal length', 'sepal width', 'petal length', 'petal width', 'label'
]
df.label.value_counts()
plt.scatter(df[:50]['sepal length'], df[:50]['sepal width'], label='0')
plt.scatter(df[50:100]['sepal length'], df[50:100]['sepal width'], label='1')
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.legend()
data = np.array(df.iloc[:100, [0, 1, -1]])
X, y = data[:,:-1], data[:,-1]
y = np.array([1 if i == 1 else -1 for i in y])
# 数据线性可分,二分类数据
# 此处为一元一次线性方程
class Model:
    def __init__(self):
        self.w = np.ones(len(data[0]) - 1, dtype=np.float32)
        self.b = 0
        self.l_rate = 0.1
        # self.data = data

    def sign(self, x, w, b):
        y = np.dot(x, w) + b
        return y

    # 随机梯度下降法
    def fit(self, X_train, y_train):
        is_wrong = False
        while not is_wrong:
            wrong_count = 0
            for d in range(len(X_train)):
                X = X_train[d]
                y = y_train[d]
                if y * self.sign(X, self.w, self.b) <= 0:
                    self.w = self.w + self.l_rate * np.dot(y, X)
                    self.b = self.b + self.l_rate * y
                    wrong_count += 1
            if wrong_count == 0:
                is_wrong = True
        return 'Perceptron Model!'

    def score(self):
        pass
perceptron = Model()
perceptron.fit(X, y)
x_points = np.linspace(4, 7, 10)
y_ = -(perceptron.w[0] * x_points + perceptron.b) / perceptron.w[1]
plt.plot(x_points, y_)

plt.plot(data[:50, 0], data[:50, 1], 'bo', color='blue', label='0')
plt.plot(data[50:100, 0], data[50:100, 1], 'bo', color='orange', label='1')
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.legend()

3、效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PTyPivU3-1721958901335)(https://i-blog.csdnimg.cn/blog_migrate/90fccd8e199ffd38f73f83b83807afdf.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9jQ2bzke-1721958901335)(https://i-blog.csdnimg.cn/blog_migrate/adeef661d56355013d131a13e5616806.png)]

五、感知机算法的对偶形式

1、理论

2、实现(代码)

3、效果

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值