首页 > 其他分享 >感知机模型

感知机模型

时间:2023-07-26 09:37:07浏览次数:63  
标签:plt mathbf cdot 模型 感知机 np model self

模型概念

输入空间和输出空间

  • \(\mathbf X \subseteq \mathbb R^n\)
  • \(\mathbf Y = \{+1, -1\}\)
  • \(\mathbf x \in \mathbf X\)
  • \(y \in \mathbf Y\)

假设空间

\[f(\mathbf x) = sign(\mathbf w \cdot \mathbf x + b) \]

\(w\)和\(b\)是感知机的模型参数,\(\mathbf w \subseteq \mathbb R^n\)叫做权重向量,\(b \in \mathbb R\)叫做偏置。\(\mathbf w \cdot \mathbf x\)表示\(w\)和\(x\)的内积,\(sign\)是符号函数,即

\[sign(x) =\begin{cases} +1& x \geq 0 \\ -1& x < 0 \end{cases} \]

学习策略

点\(\mathbf x_0\)到直线\(y = \mathbf w \cdot \mathbf x + b\)的距离

\[distance = \frac{1}{||\mathbf w||}|\mathbf w \cdot \mathbf x_0 + b| \]

对于误分类点\((x_i,y_i)\),如果\(\mathbf w \cdot \mathbf x_i + b < 0\),那么\(y_i= +1\);反之,如果\(\mathbf w \cdot \mathbf x_i + b > 0\),那么\(y_i=-1\)。所以,将距离公式去掉绝对值,误分类点到超平面的距离可以表示为

\[-\frac{1}{||\mathbf w||}y_i(\mathbf w \cdot \mathbf x_i + b) \]

损失函数的定义:误分类点到超平面的总距离

\[L(\mathbf w,b) = - \sum_{x_i \in M} \frac{1}{||\mathbf w||}y_i(\mathbf w \cdot \mathbf x_i + b) \]

其中\(M\)为误分类点的集合

对于感知机算法使用梯度下降法求解

\[\frac{\partial L}{\partial \mathbf w} = - \sum_{x_i \in M}y_ix_i\\ \frac{\partial L}{\partial b} = - \sum_{x_i \in M}y_i \]

在训练过程中,使用随机梯度下降法,随机选取一个误分类点,对\(w\),\(b\)更新

\[\mathbf w = \mathbf w + \eta y_ix_i\\ b = b + \eta y_y \]

问题:为什么参数更新的时候不需要考虑\(\frac{1}{||w||}\)?

分离超平面通过\(w\)和\(b\)确定,\(\frac{1}{||w||}\)对\(w\)的方向没有影响,可以固定\(w\)的大小为1。

从上述学习过程中可以看出来,假如\(w\)和\(b\)的初始值都设为\(0\),\(\eta\)的初始值设为\(1\),那么\(w\)在误分类点\((x_i,y_i)\)的驱动下的增量为\(y_ix_i\),\(b\)的增量为\(y_i\)。设误分类点\((x_i,y_i)\)对\(w\)和\(b\)的修正次数为\(a_i\),那么最终\(w=\sum_{i=1}^{N}a_iy_ix_i\),\(b = \sum_{i=1}^{N}a_iy_i\)。

此时的模型可以表示为

\[f(\mathbf x) = sign(\sum_{j=1}^{N}a_jy_jx_j \cdot x + b) \]

算法

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

class Perceptron:
    def __init__(self, alpha=0.1):
        self.alpha = alpha
        self.w = None
        self.b = None

    def fit(self, X, y):
        self.w = np.ones_like(X[0])
        self.b = 0.0
        flag = 1
        while flag:
            flag = 0
            for xi, yi in zip(X, y):
                if yi * (np.dot(self.w, xi) + self.b) <= 0:
                    self.w += self.alpha * yi * xi
                    self.b += self.alpha * yi
                    flag = 1

可视化结果

def plot(X, y, model):
    w = model.w
    b = model.b
    print(w, b)
    plt.scatter(X[:, 0], X[:, 1], c=y, cmap='rainbow')
    plt.plot(range(5), [-w[0] / w[1] * x - model.b / w[0] for x in range(5)], c="b")
    plt.xlabel("x [0]")
    plt.ylabel("x [1]")
    plt.title("Perceptron Algorithm")
    plt.show()


def main():
    model = Perceptron(alpha=1)
    X = np.array([[3., 3.], [4., 3.], [1., 1.]])
    y = np.array([1., 1., -1.])
    model.fit(X, y)
    plot(X, y, model)

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

class Perceptron:
    def __init__(self, alpha=0.1):
        self.alpha = alpha
        self.a = None
        self.b = None

    def fit(self, X, y):
        self.a = np.zeros(X.shape[0])
        self.b = 0.0
        flag = 1
        while flag:
            flag = 0
            for i, (xi, yi) in enumerate(zip(X, y)):
                if yi * (sum([self.a[j] * y[j] * np.dot(x, xi) for j, x in enumerate(X)]) + self.b) <= 0:
                    self.a[i] += self.alpha
                    self.b += self.alpha * yi
                    flag = 1

可视化结果

def plot(X, y, model):
    w = np.sum(np.array([model.a[i] * y[i] * x for i, x in enumerate(X)]), axis=0)
    b = np.sum(np.array([model.a[i] * y[i] for i, x in enumerate(X)]), axis=0)
    print(w, b)
    plt.scatter(X[:, 0], X[:, 1], c=y, cmap='rainbow')
    plt.plot(range(5), [-w[0] / w[1] * x - model.b / w[0] for x in range(5)], c="b")
    plt.xlabel("x [0]")
    plt.ylabel("x [1]")
    plt.title("Perceptron Algorithm")
    plt.show()


def main():
    model = Perceptron(alpha=1)
    X = np.array([[3., 3.], [4., 3.], [1., 1.]])
    y = np.array([1., 1., -1.])
    model.fit(X, y)
    plot(X, y, model)

算法的收敛性

详细证明过程参照李航老师《统计学习方法》

算法的收敛性证明表明,在数据集线性可分的情况下,搜索次数\(k\)是有上界的,经过有限次搜索可以找到将训练数据完全正确分开的超平面。

标签:plt,mathbf,cdot,模型,感知机,np,model,self
From: https://www.cnblogs.com/crazypigf/p/17581548.html

相关文章

  • 模型训练——样本选择,训练方式,loss等
     数据采样第一阶段预训练时,通过是否点击、点击位次等,将曝光点击率大于一定阈值Query-POI对作为正样本。负样本采样上,skip-above采样策略将位于点击POI之前&点击率小于阈值的POI,这样的query-POI对作为负样本。此外,也可以随机负采样补充简单负例。  欠采样过采样 ......
  • JS中的浏览器对象模型-DOM(一)
    document对象中,document元素的选取、修改、添加、删除是常见的应用。元素的选取下面一段HTML代码,我们可以非常方便地选取指定的元素。例如:<!--HTML结构--><divid="test-div"><divclass="c-red"><pid="test-p">JavaScript</p>......
  • bert语言模型
    一、bert语言模型介绍BERT语言模型是自然语言处理领域最近的一项重大成果。它的主要特点是双向编码器和变压器。BERT使用Transformer模型进行训练,它是一种自注意力机制,因此可以对输入句子中的所有单词进行编码,而不仅仅是像传统的RNN模型一样只考虑前面的单词。这种模型的特点使......
  • 模型部署 — PaddleNLP 基于 Paddle Serving 快速使用(服务化部署 - Docker)— 图像识别
    目录流程版本安装Docker安装PaddleNLP安装环境准备模型准备压缩模型下载模型模型部署环境配置启动服务测试--暂时还没通过重启图像识别+信息抽取(UIE-X),部署接口供别的应用调用最终在自己部署的环境中识别时报错,不知道是不是和GPU有关,还在尝试中流程在百度BMLCodeLab......
  • 数据分享|SAS与eviews用ARIMA模型对我国大豆产量时间序列预测、稳定性、白噪声检验可
    全文链接:http://tecdat.cn/?p=31480最近我们被客户要求撰写关于ARIMA的研究报告,包括一些图形和统计输出。我国以前一直以来都是世界上大豆生产的第一大国。但由于各国的日益强大,导致我国豆种植面积和产量持续缩减。因此,预测我国的大豆产量对中国未来的经济发展有着极其重要的作......
  • 模型蒸馏
    https://www.microsoft.com/en-us/research/blog/three-mysteries-in-deep-learning-ensemble-knowledge-distillation-and-self-distillation/......
  • 模型类中建立外键的常用方法 db_constraint=False,self.user.id
    1.user=models.ForeignKey(to=User,related_name='order_user',on_delete=models.DO_NOTHING,db_constraint=False,verbose_name="下单用户") to=Order:这是ForeignKey的一个参数,用于指定这个外键字段将关联到的目标模型。在这个例子中,外键字段将关联到名为Order的模......
  • 建立模型类的方法学习 DecimalField ,models.SmallIntegerField ,get_pay_type_display(
    1. total_amount=models.DecimalField(max_digits=10,decimal_places=2,verbose_name="订单总价",default=0)DecimalField:这是一个Django模型字段类型,用于存储十进制数值,通常用于表示货币和其他需要高精度计算的数值max_digits=10:这是DecimalField中的一个参数,用于指......
  • 球盒模型
    参考:算法学习笔记(7):球盒模型斯特林数-OIWiki贝尔数-OIWiki基本模型球盒模型可根据:球与球之间是否相同盒子与盒子之间是否相同盒子是否能为空分为\(2^3=8\)种基本模型n个相同的球,k个相同的盒子,盒子可为空intbox0(intn,intk){if(!n)return1;i......
  • 傻瓜式零代码 临床预测模型构建、评价、验证LogisticApp
    傻瓜式临床预测模型软件LogisticApp无需复杂冗长的代码只需要鼠标点点,即可轻松完成3分SCI支持Windows32位、64位,Macintel芯片、M1/M2芯片视频教程见B站up主:R语言临床预测模型1LogisticApp简介傻瓜式零代码Logistic临床预测模型构建、评价、验证。......