模式识别从0构建—感知器

⌛️本文状态:已完结✔️

一、基本思想

感知器(Perception)的特点是随意确定判别函数初始值,在对样本分类训练过程中逐步修正直至最终确定。

感知器可以解决线性可分问题。

二、形式化定义

为了讨论方便,将样本向量增加一维,定义增广的样本向量为 $y=[1,x_1,x_2,…,x_d]^T$ ;相应地,定义增广的权向量为 $a=[w_0,w_1,w_2,…,w_d]^T$ ;

在此基础上,再定义对于第一类的样本,$y=y$ , 对于第二类样本 $y=-y$ ,称作规范化增广样本向量

此时,对于所有正确分类的样本,都应该有 $a^Ty>0$ ;

定义感知准则函数$J_P(a)$:

$$ J_P(a)=\sum_{y\in Y^k}(-a^Ty) $$ 其中$Y^k$表示被错分的规范化增广样本集。确定向量$a$的问题变为对$J_P(a)$求极小值的问题。当$Y^k$为空集(即不存在错分样本时),$J_P(a)=0$达到极小值。

二、梯度下降法求解

对(迭代)向量沿某函数的负梯度方向修正。迭代式为:
$$
a_{k+1}=a_k-r_k\bigtriangledown{J_P(a)}=a_k+r_k\sum_{y\in{Y_k}}y
$$
其中,
$$
\bigtriangledown{J_P(a)}=\dfrac{\partial{J_P(a)}}{\partial{a}}=\sum_{y\in Y^k}(-y)
$$

三、实验

感知器的训练过程动画为:

train

关键代码为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
a1 = [0;0;0];
ak=zeros(3,MAXNUM_train);
ak(:,1) = a1;
num_wrong = 0;
for die_dai=1:MAXNUM_train
num_p1 = ak(:,die_dai)'* p1; % p1、p2为规范化增广样本向量
num_p2 = ak(:,die_dai)'* p2;
num_wrong = length(num_p1(num_p1<=0)) + length(num_p2(num_p2<=0));
fu_ti_du = sum(p1(:,num_p1<=0),2) + sum(p2(:,num_p2<=0),2); % 最关键的一步
ak(:,die_dai+1) = ak(:,die_dai) + rk * fu_ti_du;
if num_wrong==0
break;
end
end

完整代码已上传到Github

请我喝杯咖啡吧~

支付宝
微信