【机器学习笔记】——感知机(Perceptron)

目 录

1 感知机(Perceptron)

  感知机是二类分类线性分类模型,旨在求出将训练数据进行线性划分的分离超平面,因此导入基于误分类的损失函数,利用梯度下降法对损失函数进行极小化,求得感知机模型。

1.1 定义

  假设输入空间是 X ⊆ R n \mathcal{X} \subseteq \mathbf{R}^n XRn ,输出空间是 Y = { + 1 , − 1 } \mathcal{Y} = \left\{+1,-1\right\} Y={ +1,1} 。输入 x ∈ X x \in \mathcal{X} xX 表示实例的特征向量,对应于输入空间的点;输出 y ∈ Y y \in \mathcal{Y} yY 表示实例的类别。由输入空间到输出空间的如下函数

f ( x ) = s i g n ( w ⋅ x + b ) f(x) = sign(w \cdot x + b) f(x)=sign(wx+b)

称为感知机。其中, w ∈ R n w \in \mathbf{R}^n wRn 叫做权值(weight)或权值向量(weight vector), b ∈ R b \in \mathbf{R} bR 叫做偏置(bias)。 s i g n sign sign 是符号函数,即

s i g n ( x ) = { + 1 , x ≥ 0 − 1 , x &lt; 0 sign(x) = \begin{cases} +1, &amp; x \ge 0 \\ -1, &amp; x \lt 0 \end{cases} sign(x)={ +1,1,x0x<0

1.2 几何解释

  线性方程

w ⋅ x + b = 0 w \cdot x + b = 0 wx+b=0

对于特征空间 R n \mathbf{R}^n Rn 中的一个超平面 S ,其中 w w w 是超平面的法向量, b b b 是超平面的截距。这个超平面将特征空间划分为两个部分。位于两部分的点(特征向量)分别被分为正、负两类。因此超平面 S S S 称为分离超平面,如图所示

在这里插入图片描述

  感知机通过训练训练集数据求得感知机模型,即求得模型参数 w w w b b b 。通过学习得到的感知机模型,对于新的输入实例给出其对应的输出类别。

1.3 学习策略

  假设训练数据集是线性可分的,我们需要找到一个前面所说的分离超平面,即确定感知机模型参数 w w w b b b 。这需要制定一个学习策略,即定义损失函数并将损失函数极小化。

  首先考虑误分点总数,但因其不是参数 w w w b b b 的连续可导函数,不易优化,因此选择误分点到超平面 S S S 的总距离。我们知道一个点 x 0 x_0 x0 到平面 w ⋅ x + b w \cdot x + b wx+b 的距离 d d d 1 ∣ ∣ w ∣ ∣ ∣ w ⋅ x 0 + b ∣ \frac{1}{||w||}| w \cdot x_0 + b | w1wx0+b ,对于误分点 ( x i , y i ) (x_i,y_i) (xi,yi) 来说,当 w ⋅ x i + b &gt; 0 w \cdot x_i + b \gt 0 wxi+b>0 时, y i = − 1 y_i = -1 yi=1 ;当 w ⋅ x i + b &lt; 0 w \cdot x_i + b \lt 0 wxi+b<0 时, y i = + 1 y_i = +1 yi=+1 。所以有:

− y i ( w ⋅ x i + b ) &gt; 0 -y_i (w \cdot x_i + b) \gt 0 yi(wxi+b)>0

于是误分点到超平面 S S S 的距离为:

− 1 ∣ ∣ w ∣ ∣ y i ( w ⋅ x 0 + b ) -\frac{1}{||w||}y_i(w \cdot x_0 + b) w1yi(wx0+b)

假设超平面 S S S 的误分点集合为 M M M ,那么误分点到超平面 S S S 的总距离为:

− 1 ∣ ∣ w ∣ ∣ ∑ x i ∈ M y i ( w ⋅ x i + b ) -\frac{1}{||w||} \sum_{x_i \in M} y_i (w \cdot x_i + b) w1xiMyi(wxi+b)

  因为 w w w 的大小 ∣ ∣ w ∣ ∣ ||w|| w 不会影响极小化的结果,因此,忽略 1 ∣ ∣ w ∣ ∣ \frac{1}{||w||} w1 就得到感知及学习的损失函数:

L o s s ( w , b ) = − ∑ x i ∈ M y i ( w ⋅ x i + b ) Loss(w, b) = - \sum_{x_i \in M} y_i (w \cdot x_i + b) Loss(w,b)=xiMyi(wxi+b)

1.4 算法

1.4.1 原始形式

  感知机学习算法是误分类驱动的,采用随机梯度下降(SGD)法极小化损失函数。首先任意选取一个超平面 S 0 S_0 S0 (即初始化模型参数 w 0 w_0 w0 b 0 b_0 b0 ),然后随机选取一个误分类点(遍历数据集找到误分类的点)使其梯度下降(见CH12_2):

∇ w L

  • 28
    点赞
  • 161
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
感知机是二分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取 +1 和 -1 二值。感知机对应于输入空间(特征空间)中将实例划分为正负两类的分离超平面,属于判别模型。 感知机学习算法是基于随机梯度下降法的。具体地,首先任意选取一个超平面,然后用梯度下降法不断地极小化目标函数,找出最优超平面。 以下是感知机算法的C++类实现及案例代码: ```c++ #include <iostream> #include <vector> #include <random> using namespace std; class Perceptron { public: Perceptron(int feature_num) : w(feature_num), b(0) {} void train(const vector<vector<double>>& X, const vector<double>& y, int max_iter = 100) { int n_samples = X.size(); int n_features = X[0].size(); mt19937 rng(0); uniform_int_distribution<int> dist(0, n_samples - 1); for (int iter = 0; iter < max_iter; iter++) { int i = dist(rng); double wx = 0; for (int j = 0; j < n_features; j++) { wx += X[i][j] * w[j]; } double yi = y[i]; if (yi * (wx + b) <= 0) { for (int j = 0; j < n_features; j++) { w[j] += yi * X[i][j]; } b += yi; } } } double predict(const vector<double>& x) { double wx = 0; int n_features = x.size(); for (int i = 0; i < n_features; i++) { wx += x[i] * w[i]; } return wx + b > 0 ? 1 : -1; } void print_weights() const { cout << "w = ["; for (double wi : w) { cout << wi << ", "; } cout << "], b = " << b << endl; } private: vector<double> w; double b; }; int main() { vector<vector<double>> X{ {3, 3}, {4, 3}, {1, 1} }; vector<double> y{1, 1, -1}; Perceptron model(X[0].size()); model.train(X, y); model.print_weights(); cout << "predict([3, 4]) = " << model.predict({3, 4}) << endl; return 0; } ``` 在上述代码中,Perceptron类代表感知机模型。train函数接受训练数据X和y,以及最大迭代次数max_iter,默认为100。predict函数接受一个样本特征向量x,返回其预测的类别标签。print_weights函数打印训练后得到的权重和偏置项。 本例中,使用学习率为1的随机梯度下降法进行模型训练。训练数据X是一个3x2的矩阵,y是一个包含3个元素的向量,表示3个样本的类别标签。模型训练完毕后,使用predict函数对特定样本进行预测。 以上是感知机算法的C++类实现及案例代码,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值