1. 感知机原理(Perceptron)

完整机器学习实现代码GitHub
欢迎转载,转载请注明出处https://www.cnblogs.com/huangyc/p/9706575.html
欢迎沟通交流: 339408769@qq.com


 


1. 感知机原理(Perceptron)

2. 感知机(Perceptron)基本形式和对偶形式实现

3. 支持向量机(SVM)拉格朗日对偶性(KKT)

4. 支持向量机(SVM)原理

5. 支持向量机(SVM)软间隔

6. 支持向量机(SVM)核函数

1. 前言

感知机是1957年,由Rosenblatt提出会,是神经网络和支持向量机的基础。

2. 感知机的原理

感知机是二分类的线性模型,其输入是实例的特征向量,输出的是事例的类别,分别是+1和-1,属于判别模型。

假设训练数据集是线性可分的,感知机学习的目标是求得一个能够将训练数据集正实例点和负实例点完全正确分开的分离超平面。如果是非线性可分的数据,则最后无法获得超平面

image

2.1 点到线的距离

公式中的直线方程为Ax+By+C=0,点P的坐标为(x0,y0)

d=Ax0+By0+CA2+B2

2.2 样本到超平面距离

我们假设超平面是h=wx+b,其中w=(w0,w1,...wm),x=(x0,x1,...xm),样本点x到超平面的距离如下:

d=wx+b||w||

2.2 超平面(Hyperplanes)

超平面是在空间Rd中的一个子空间Rd1

在2维空间中的超平面是一条线,在3维空间中的超平面是一个平面。

3. 感知机模型

image

感知机从输入空间到输出空间的模型如下:

f(x)=sign(wx+b)

sign(x)={1x<01x0

3.1 感知机的损失函数

我们首先定义对于样本(xi,yi),如果wxi+b||w||>0则记yi=+1,如果wxi+b||w||<0则记yi=1

这样取y的值有一个好处,就是方便定义损失函数。因为正确分类的样本满足yi(wxi+b)||w||>0,而错误分类的样本满足yi(wxi+b)||w||<0。我们损失函数的优化目标,就是期望使误分类的所有样本,到超平面的距离之和最小

所以损失函数定义如下:

L(w,b)=1||w||xiMyi(wxi+b)

其中M集合是误分类点的集合。

不考虑1||w||,就得到感知机模型的损失函数:

L(w,b)=xiMyi(wxi+b)

3.2 为什么可以不考虑1||w||

网上有人说1||w||是个定值,但是个人觉得平面不唯一,这个值肯定也会变。通过参考他人观点结合思考,觉得原因可以列为以下两点。

  1. 1||w||不影响yi(wxi+b)正负的判断,即不影响学习算法的中间过程。因为感知机学习算法是误分类驱动的,这里需要注意的是所谓的“误分类驱动”指的是我们只需要判断yi(wxi+b)的正负来判断分类的正确与否,而1||w||并不影响正负值的判断。所以1||w||对感知机学习算法的中间过程可以不考虑。
  2. 1||w||不影响感知机学习算法的最终结果。因为感知机学习算法最终的终止条件是所有的输入都被正确分类,即不存在误分类的点。则此时损失函数为0. 对应于1||w||iMyi(wxi+b),即分子为0.则可以看出1||w||对最终结果也无影响。

综上所述,即使忽略1||w||,也不会对感知机学习算法的执行过程产生任何影响。反而还能简化运算,提高算法执行效率。

4. 感知机学习算法

感知机学习算法是对上述损失函数进行极小化,求得wb。但是用普通的基于所有样本的梯度和的均值的批量梯度下降法(BGD)是行不通的,原因在于我们的损失函数里面有限定,只有误分类的M集合里面的样本才能参与损失函数的优化。所以我们不能用最普通的批量梯度下降,只能采用随机梯度下降(SGD)。目标函数如下:

L(w,b)=argminw,b(xiMyi(wxi+b))

4.1 原始形式算法

输入:训练数据集T=(x1,y1),(x2,y2),...,(xN,yN)yi{1,+1},学习率η(0<η<1)

输出:w,b;感知机模型f(x)=sign(wx+b)

  1. 赋初值 w0,b0
  2. 选取数据点(xi,yi)
  3. 判断该数据点是否为当前模型的误分类点,即判断若yi(wxi+b)<=0则更新

w=w+ηyixi

b=b+ηyi

  1. 转到2,直到训练集中没有误分类点

4.2 对偶形式算法

由于w,b的梯度更新公式:

w=w+ηyixi

b=b+ηyi

我们的w,b经过了n次修改后的,参数可以变化为下公式,其中α=ny

w=xiMηyixi=i=1nαiyixi

b=xiMηyi=i=1nαiyi

这样我们就得出了感知机的对偶算法。

输入:训练数据集T=(x1,y1),(x2,y2),...,(xN,yN)yi{1,+1},学习率η(0<η<1)

输出:α,b;感知机模型f(x)=sign(j=1nαjyjxjx+b)

其中α=(α1,α2,...,αn)T

  1. 赋初值 α0,b0
  2. 选取数据点(xi,yi)
  3. 判断该数据点是否为当前模型的误分类点,即判断若yi(j=1nαjyjxjxi+b)<=0则更新

αi=αi+η

b=b+ηyi

  1. 转到2,直到训练集中没有误分类点

为了减少计算量,我们可以预先计算式中的内积,得到Gram矩阵

G=[xi,xj]N×N

4.3 原始形式和对偶形式的选择

  • 在向量维数(特征数)过高时,计算内积非常耗时,应选择对偶形式算法加速。
  • 在向量个数(样本数)过多时,每次计算累计和就没有必要,应选择原始算法

5. 训练过程

我们大概从下图看下感知机的训练过程。

线性可分的过程:

image

线性不可分的过程:
image

6. 小结

感知机算法是一个简单易懂的算法,自己编程实现也不太难。前面提到它是很多算法的鼻祖,比如支持向量机算法,神经网络与深度学习。因此虽然它现在已经不是一个在实践中广泛运用的算法,还是值得好好的去研究一下。感知机算法对偶形式为什么在实际运用中比原始形式快,也值得好好去体会。

posted @   hyc339408769  阅读(61676)  评论(6编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示