统计学习方法——感知机

思维导图

在这里插入图片描述

感 知 机 学 习

一、感知机的结构

1、是什么?

感知机是一种二类分类的线性分类模型,输入为实例的特征向量,输出为实例的类别(取+1和-1二值)。感知机对应于输入空间(特征空间)中将实例划分为正负两类的分离超平面,属于判别模型

2、目的:

旨在求出将训练数据进行线性划分的分离超平面

3、模型结构:

在这里插入图片描述
其中w 叫做权值(weight)或权值向量(weight vector),b 叫做偏置(bias),sign 是符号函数,即:

在这里插入图片描述
对于模型,可以借助几何空间去理解。分割超平面为:w·x + b = 0

二、感知机的算法学习

1、损失函数

目的:为了使感知机求得一个能够将训练正实例点和负实例点完全正确分开的分离超平面。即确定感知机模型参数w,b。普遍来说,损失函数是采用误分类点的总数。但是这样的函数时离散的,不是参数w和b的可导函数,不易优化。所以这里采用了另一种选择:误分类点到超平面S的总距离

(1)误分类点到超平面S的总距离:
在这里插入图片描述
这里的 ||w|| 是 w 的 L2范数

(2)如果把绝对值去掉,对于任意一个误分类点(xi,yi)来说:
在这里插入图片描述
(3)因此,误分类的点xi到超平面的距离可以写作:
在这里插入图片描述
(4)假设超平面S的误分类点集合为M,那么所有误分类点到超平面S的总距离为:
在这里插入图片描述
不考虑1/||w|| ,就得到感知机学习的损失函数:
在这里插入图片描述
其中M为误分类点的集合。这个损失函数就是感知机学习的经验风险函数。

这里可以看到,损失函数L(w,b)是非负的。如果没有误分类点,那么L(w,b)为0,误分类点数越少,L(w,b)值越小。一个特定的损失函数:在误分类时是参数w,b的线性函数,在正确分类时,是0。

2、感知机学习算法

感知机学习问题就是求解损失函数的最优化问题。其中,这里最优化的方法是随机梯度下降法。
损失函数L(w,b)的梯度为:
在这里插入图片描述
随机选出一个样本点(xi,yi),对参数w,b进行更新:
在这里插入图片描述
其中 η(0≤η≤1)是步长,也就是学习速率。步长越大,梯度下降的速度越快,更能接近极小点。如果步长过大,有可能导致跨过极小点,导致函数发散;如果步长过小,有可能会耗很长时间才能达到极小点,且有可能会局部最优。

(1)原始形式

具体算法过程是:

输入训练集 T,学习率 η (0≤η≤1)。输出 w,b 和 感知机模型 f(x)=sign(w⋅x+b) 。
(1)选出初始值w0,b0;
(2)在训练集中选取数据(xi,yi)
(3)如果 yi(w⋅xi+b) ≤ 0 ,则执行:
在这里插入图片描述
(4)转至(2),直到训练集中没有误分类点。

上面的过程可以看作是:当一个实例点被误分类,即位于超平面的错误一侧时,则调整w,b的值,使超平面向误分类点的一侧移动,以减少误分类点与超平面的距离。

(2)对偶形式

对偶形式的基本想法是,将w和b表示实例 xi 和 标记 yi 的线性组合的形式,通过求解其系数而球的 w 和 b。
假设:在这里插入图片描述
当中的w0 = 0,b = 0 , 当所有的点均不发生误判时,最后的w,b一定是变成如下形式:
在这里插入图片描述
其中αi=niη 中ni代表对第i个样本的学习次数,感知机 对偶形式 完整式子如下:
在这里插入图片描述
具体算法过程是:
输入训练集 T,学习率 η (0≤η≤1)。输出 a,b 和 感知机模型 f(x)=sign(∑j=1Nαjyjxj⋅xi+b)
(1)初始化α=0,b=0.
(2)任意选取(xi,yi)
(3)如果yi(∑j=1Nαjyjxj⋅xi+b)≤0 ,发生误判,则对αi,b进行更新:
在这里插入图片描述
(4)重复2知道所有点被正确分类

感知机的***对偶形式就是把对w,b的学习变成了对a,b的学习***,在原始形式种,w在每一轮迭代错分时都需要更新,而采用对偶形式时,对于某一点(xi,yi)发生错分时,我们只需要更新对应的αi即可,最后逆推计算出w


(转载)第二章的课后习题
2.1-2.2 https://blog.csdn.net/cracker180/article/details/78778305
2.3 https://blog.csdn.net/xiaoxiao_wen/article/details/54097835
感知机,线性可分和线性不可分的相关讨论,https://blog.csdn.net/taoyanqi8932/article/details/53955430

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
感知机是二分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取 +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++类实现及案例代码,希望对你有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值