感知器算法的基本原理和步骤_感知器算法

前言

没什么好说的,凑个字数。

正文

感知器算法是最简单的线性回归算法。

先来看看一篇写得不错的感知器算法入门文章:什么是感知机? - 游牧皮皮虾的文章 - 知乎

文中提到了感知器算法的基本模型,然后提到了梯度下降算法和感知器的联合使用( 例子1 ),以及感知器的对偶形式( 例子2 )。这里提出一点,例子 1 其实本质上就是例子 2。只不过对于计算机而言,例子 2 的计算要相对简单一点。

懒惰如我,已经靠白嫖别人的文章来省去了对基础感知机模型的讲解。现在我们来看看本篇文章的主要内容结构。

感知器算法的基本原理和步骤_感知器算法_第1张图片

一、口袋算法(Pocket Algorithm)

感知机是最简单的线性分类算法,其本质思想就是:错了就改。

但是感知机算法有一个强前提条件——数据必须是线性可分的。这意味着,如果我们无法保证样本是线性可分的,那么根据感知机算法执行的计算机程序可能会永远找不到合适的划分边界,陷入无限迭代之中。

为此,学术界有人提出了“口袋算法”。我现在用最形象的语句来描述一下口袋算法的基本步骤:
1、执行感知器算法,将假定的划分平面放入“口袋”存储起来。

2、对划分平面执行最优化算法( 例如,梯度下降 ),并得到新的划分平面与“口袋”里的划分平面进行比较。将划分效果比较好的划分平面放入“口袋”存储起来,取代原来存储在“口袋”中的划分平面。

3、重复步骤 2

4、重复步骤 2

n、重复步骤 2

这样的话,我们的“口袋”中就始终拥有目前我们所见到的最优的划分平面,这就是“口袋算法”。值得注意的是,为了防止步骤 2 无限重复,我们必须预先规定一个值 k,当迭代次数超过 k 时,算法将会停止运行。

那么如何将划分平面放入口袋中呢?根据划分平面的基本形式

,我们知道,只要我们存储好
的值就可以了。

挺简单吧,只要你能实现最基本的感知器算法,你就可以实现口袋算法。

二、表决感知机(Voted Perceptron)

熟话说,三个臭皮匠,顶个诸葛亮。如果我们很多个臭皮匠,那不是比诸葛亮还厉害了吗?

光说不干,不是好汉!现在监狱里有一堆嫌疑犯,我必须想出一种法子将有罪的人和无罪的人区分开来。为了更好地划分,我请了一堆法官来帮我划分。

但是法官的技术有高低,有的法官经常犯错,有的法官处事英明。这可以理解,人之常情嘛。但是这嫌疑犯要是甄别错了,那可不行。所以我必须想出一种方法探探这些法官的虚实。

我先是找来一堆已经甄别好的嫌疑犯,然后安排每位法官都单独对这堆人进行一次甄别。每位法官都携带一个计分表,相应的法官每划分正确一次,就在计分表上加一分。当每位法官都进行过这样的测试之后,得分最高的法官就是能力最强的法官了。那么当甄别那些未知身份的嫌疑犯时,得分更高的法官将具有更高的话语权。

为了防止单次测试导致的误差,我可以让每个人都进行多次这样的测试,再将结果得分取平均值。这样,最终的结果就可以更好地体现法官的水平。那么在实际甄别新嫌疑犯时,我可以让法官们投票表决,然后根据法官们的投票以及其自身的话语权将嫌疑犯们分类,从而得到最好的甄别率。

看到这里,有的读者可能会说了:

MD,看了这么久,不就是一个集成算法的思想运用在感知机上吗?你长这么帅,为什么不写简短点?

我是真的不想吐槽你们某些人,我难得勤快一次,你们还不知道珍惜。要不是我在网上找不到相应的算法教程,我早就直接贴个链接完事了。( 与空气对骂 ing )

那么,表决感知机就是这么一个类似的过程了。注意这里的“表决”,就和上面所提到的“投票”是一个东西。

我们现在假定已知训练集

。我们聘请了一系列法官
,这个括号现在看不懂没关系,结合伪代码就可以看懂了。

我们先对法官进行测试,代码如下:

int k = 0, v1 = 0, c1 = 0;// k 表示当前是第几位法官,v 表示相应的法官,c表示相应的法官分数
scanf (T , m);// T 表示每位法官重复测试 T,m 是数据集的数量
while ( T-- ) {
for i = 1 to m {
y* = sign ( vk * xi ); // 第 k 位法官进行一次分类
if ( 分类正确 ) ck++;
else {
vk = vk + yi * xi;
ck+1 = 1;
k = k + 1;
{
}
}

测试完了法官后,我们就可以进行甄别了。假设我们现在要甄别嫌疑犯

,则代码如下:
for i = 1 to k {// 将每位法官的投票根据他们自身的话语权整合起来
s = s + ci * sign( vi * x );
}
yn = sign( s );// 得出最终甄别结果

我好累,继续下一个算法吧。

三、带边缘感知机

假设现在我们现在需要将一个已经划分好的数据集的判别平面进行改善,使得数据集中的每一个特征数据到达判别平面的距离不会小于某一值。

你可能会因此想到支持向量机,但我们现在打算讨论另外一个类似的算法——带边缘感知机。带边缘感知机是普通感知机的扩展算法,它通过人为的定义一个边界,使得数据集中的点到达这个判别平面的距离不会小于这个边界到判别平面的距离。

我们现在定义一个已经划分好的数据集

,其中
。我们先人为定义一系列“边缘参数”
的值,暂时不讨论这些参数是怎么来的。

执行算法:

int
= 0,
= 0, t = 0, R = max( x );

for i = 1 to m {
while (
(
) +
) <=
) {
=
+
;
;
=
;

}
}

大概是这么个算法了。

四、其他算法

还有很多我想写感知机算法还没有写,之后再写,现在不急。


返回原文

线性分类

你可能感兴趣的:(感知器算法的基本原理和步骤)