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

2021-03-04 11:54:01 浏览数 (2)

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

¶一、基本思想

感知器(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_{yin Y^k}(-a^Ty) $$ 其中$Y^k$表示被错分的规范化增广样本集。确定向量$a$的问题变为对$J_P(a)$求极小值的问题。当$Y^k$为空集(即不存在错分样本时),$J_P(a)=0$达到极小值。

¶二、梯度下降法求解

对(迭代)向量沿某函数的负梯度方向修正。迭代式为:

a_{k 1}=a_k-r_kbigtriangledown{J_P(a)}=a_k r_ksum_{yin{Y_k}}y

其中,

bigtriangledown{J_P(a)}=dfrac{partial{J_P(a)}}{partial{a}}=sum_{yin Y^k}(-y)

¶三、实验

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

关键代码为

代码语言:javascript复制
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

0 人点赞