统计学习方法——感知机

统计学习方法——感知机

1.1 感知机的定义

1.2 感知机的学习策略

1.2.1 数据集的线性可分

1.2.2 感知机的损失函数

1.3 感知机算法

 

1.1 感知机的定义

感知机是一种线性分类模型,属于判别模型,用于处理二分类问题。感知机是分类模型中比较简单的一种,是神经网络和支持向量机的基础。

假设输入空间是 ,输出空间是,输入表示特征向量,输出表示样本的类别。由输入空间到输出空间的函数称为感知机。都是感知机的参数,叫做权值,叫做偏置。是符号函数,并且有


通俗的说,线性方程对应于特征空间(输入空间)的一个超平面,将整个输入空间分成两部分,每一部分对应于一个类别(下文为简便起见,这两个类定为+1和-1)。其中是这个超平面的法向量,是这个超平面的截距。

一个典型的感知机见下图(图片来源http://blog.csdn.net/dream_angel_z/article/details/48915561)


1.2 感知机学习策略

1.2.1 数据集的线性可分

通俗的来说,数据集的线性可分即是对于输入空间的所有向量,存在一个超平面,可以将数据集的正实例点和负实例点完全正确的分开,这也是感知机学习算法能够找到正确的超平面的条件。如果数据集不满足线性可分,那么感知机找到的超平面会在迭代过程中不断震荡。对于线性不可分的数据集,我们可以采用支持向量机,将输入向量映射到高维,当输入向量在高维线性可分时,再寻找一个超平面然后映射回低维。(这是线性不可分支持向量机的思想,在实际上用了更简便的方法)

当数据集线性可分时,我们能够找到超平面将数据点正确的划分。对于所有的实例,有,对于所有的实例,有

1.2.2 感知机的损失函数

假设数据集是线性可分的,那么感知机的目标就是找出一个超平面将所有的正实例点和负实例点完全正确的分开,也就是寻找合适的参数

为了寻找合适的参数,我们定义了一个损失函数,采用的是所有误分类点到超平面的距离。我们通常认为一个向量距离超平面越近,它的分类准确率就越不可信。反之,如果距离超平面越远,分类准确率就越可信。因为一个向量越靠近超平面,那么下一次超平面变动时,它就越可能变成另外一类,所以它的分类准确率就越不可信。所以感知机的损失函数采用的是所有误分类点到超平面的距离,这也是有道理的。

首先,输入空间中任意一点到超平面的距离为:


这里是范数。

对于误分类点,当时,,而当时,所以恒成立。因此,误分类点到超平面的距离为:

那么,假设所有误分类点的集合为,所有误分类点到超平面的距离为:

我们的目的是让损失函数尽可能小,所以目标是找出参数,来使上面的这个式子尽可能小。而是一个常数,并不影响我们让损失函数最小,所以感知机的损失函数为:

 

1.3 感知机算法

现在我们有一个损失函数,并且目标是找出参数,来使损失函数尽可能小。也就是找出一个极小化问题的解:

其中是所有误分类点的集合

对于这种问题,我们通常使用梯度下降法来极小化目标函数。先对目标函数求偏导:

为了减少计算量,我们采用随机梯度下降,即随机选取一个误分类点,对进行更新:


其中是学习率,也是梯度下降中的步长。

所以感知机的原式算法为:

1. 选取的初值

2. 在训练集中选取样本

(a)若样本满足,更新


(b)转至2,直到训练集中没有误分类点

 

实例:

正实例点:

负实例点:

用感知机算法的原始形式来求感知机模型。其中均为二维向量。

解:首先确定最优化问题,然后按照原始算法来求解。我们设=1

(1)先取初值(不一定要都取零,但初值不同解可能不同)

(2)对,满足,即是一个误分类点,所以更新

,得到


(3)接着迭代,对于不满足,即分类正确,不更新。对,所以更新

得到

……

同理,最后得到,所有数据分类正确,算法终止。最后得到

分离超平面为:

感知机模型为:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值