Matlab学习笔记 2 单层感知机二分类问题及示例

Matlab学习笔记之单层感知机单层感知机二分类问题及示例------------锋锋的快乐小窝

  • 定义 ( N + 1 ) × 1 (N+1)\times 1 (N+1)×1输入向量:   x ⃗ = [ 1 , x 1 ( n ) , x 2 ( n ) , … , x N ( n ) ] T ~\vec x=[1,x_1(n),x_2(n),…,x_N(n)]^{T}  x =[1,x1(n),x2(n),,xN(n)]T

  • n n n :迭代次数

  • 定义 ( N + 1 ) × 1 (N+1)\times 1 (N+1)×1权值向量:   ω ⃗ ( n ) = [ b ( n ) , ω 1 ( n ) , ω 2 ( n ) , … , ω N ( n ) ] T ~\vec\omega(n)=[b(n),\omega_1(n),\omega_2(n),…,\omega_N(n)]^{T}  ω (n)=[b(n),ω1(n),ω2(n),,ωN(n)]T

  • 所以线性组合器的输出: v ( n ) = ∑ i = 1 N ω i x i = ω ⃗ n T x ⃗ n v(n)=\sum_{i=1}^{N} \omega_i x_i ={\vec{\omega}^{T}_{n}} \vec{x}_{n} v(n)=i=1Nωixi=ω nTx n

  • 令上式等于零,即可得到二分类问题的决策面,即:
    v ( n ) = ∑ i = 1 N ω i x i = ω ⃗ n T x ⃗ n = 0 v(n)=\sum_{i=1}^{N} \omega_i x_i ={\vec{\omega}^{T}_{n}} \vec{x}_{n}=0 v(n)=i=1Nωixi=ω nTx n=0

  • 学习算法步骤如下

    • ① :定义参数和变量
      • 对于输入 N+1 维向量:   x ⃗ ( n ) = [ 1 , x 1 ( n ) , x 2 ( n ) , … , x N ( n ) ] T ~\vec x(n)=[1,x_1(n),x_2(n),…,x_N(n)]^{T}  x (n)=[1,x1(n),x2(n),,xN(n)]T
      • 对于权值 N+1 维向量:   ω ⃗ ( n ) = [ b ( n ) , ω 1 ( n ) , ω 2 ( n ) , … , ω N ( n ) ] T ~\vec\omega(n)=[b(n),\omega_1(n),\omega_2(n),…,\omega_N(n)]^{T}  ω (n)=[b(n),ω1(n),ω2(n),,ωN(n)]T
      • 偏置: b ( n ) b(n) b(n)
      • 实际输出: y ( n ) y(n) y(n)
      • 期望输出: d ( n ) d(n) d(n)
      • 学习率参数: η \eta η (比1小的正常数)
    • ②:初始化
      • n = 0 n=0 n=0,将权值向量 ω \omega ω 设置成 随机值或者全零值
    • ③:激活
      • 输入训练样本,
    • ④:计算实际输出
      • y ( n ) = s g n ( ω ⃗ n T x ⃗ n ) y(n)=sgn({\vec{\omega}^{T}_{n}} \vec{x}_{n}) y(n)=sgn(ω nTx n)
      • 其中:sgn 是符号函数
    • ⑤:更新权值向量
      • ω ⃗ ( n + 1 ) = ω ⃗ ( n ) + η [ d ( n ) − y ( n ) ] x ⃗ n \vec{\omega}({n+1})=\vec{\omega}({n})+\eta [{d}({n})-{y}({n})]\vec{x}_{n} ω (n+1)=ω (n)+η[d(n)y(n)]x n
        • 其中: d ⃗ ( n ) = { 1 x ( n ) ∈ l 1 − 1 x ( n ) ∈ l 2     0 < η < 1 \vec d(n)=\left\{\begin{matrix} 1 & x(n)\in l_1 \\ -1 & x(n)\in l_2 \end{matrix}\right. \\\ \\\ 0<\eta<1 d (n)={11x(n)l1x(n)l2  0<η<1
    • ⑥:判断
      • 满足收敛条件,算法结束
      • 不满足收敛条件,则   n ~n  n 自增 1 1 1 n = n + 1 n=n+1 n=n+1),转到 ③ 继续进行
        • 当权值向量 ω ⃗ \vec \omega ω 已经能正确实现分类的时候,收敛算法就收敛了,此时网络的误差为 0 0 0
        • 收敛条件为:
          • Ⅰ 误差小于某个预先设定的较小的值   ε ~\varepsilon  ε ∣ d ( n ) − y ( n ) ∣ < ε \left | d(n)-y(n) \right |<\varepsilon d(n)y(n)<ε
          • Ⅱ 两次迭代之间的权值变化已经很小: ∣ ω ( n + 1 ) − ω ( n ) ∣ < ε \left | \omega(n+1)-\omega(n) \right |<\varepsilon ω(n+1)ω(n)<ε
          • Ⅲ 设定最大迭代次数 M M M,当迭代了M次之后算法就停止迭代
        • 它的值影决定误差对权值的影响大小, η \eta η 不应该过大也不应该过小
          • η \eta η 不应该过大,以便输入向量提供一个比较稳定的权值估计
          • η \eta η 不应该过小,以便使权值能够根据输入的向量   x ~x  x 实时变化,体现误差对权值的修正作用
  • 感知器的同区性

  • 感知器的局限性是显而易见的,几个缺陷::

    • 感知器的激活函数使用闽值函数,使得输出只能取两个值 (1/-1或0/1),这样就限制了在分类种类上的扩展
    • 感知器网络只对线性可分的问题收敛,这是最致命的一个缺陷。
      • 根据感知器收敛定理,只要输入向量是线性可分的,感知器总能在有限的时间内收敛。
      • 问题不可分,则感知器无能为力
    • 如果输入样本存在奇异样本,则网络需要花费很长的时间
      • 奇异样本就是数值上远远偏离其他样本的数据
    • 感知器的学习算法只对单层有效,因此无法直接套用其规则设计多层感知器
  • 以下是一个对四个点进行二分类的实例

序号xy
1-0,5-0.51
2-0.50.51
30.3-0.50
401.00
close all;
clc;
clear;
%% 初始化
learn_rate=0.2; % 学习率
w=[0,0,0];      % 权值向量
P=[-0.5 -0.5 0.3 0.0;-0.5 0.5 -0.5 1.0];    % 输入向量
T=[1,1,0,0];    % 期望输出
P=[ones(1,4);P];% n+1维输入向量
MAX= 20;        % 最大迭代次数为20次
%% 训练
i=0;
while 1
    v=w*P;
    y=hardlim(v); % 实际输出
    % 更新
    e=(T-y);
    MAE(i+1) = mean(abs(y - T)); % 定义平均绝对误差性能函数
    if (MAE(i+1)<0.001)
        disp(w);
        break;
    end
    % 更新权值和偏置
    w=w+learn_rate*(T-y)*P';
    i= i+1;
    if (i>=MAX)
        % 达到最大迭代次数,退出
        disp('MAX times loop');
        disp(w);
        disp(MAE(i+1));
        break;
    end
end
%% 显示
% 显示待分类的点和分类结果
draw_Func(P,T)
x=-1.5:0.1:1.5;
y=x*(-w(2)/w(3))-w(1)/w(3);
plot(x,y);
hold on;
axis([-1.5,1.5,-1.5,1.5]);
legend('第一类','第二类');
title('坐标点的二分类');
hold off;

function draw_Func(sample, label) %绘点函数,将不同类别的点,标记成不同的颜色
idx_pos = find(label==1);
idx_neg = find(label~=1);
plot(sample(2,idx_pos), sample(3,idx_pos),"b+")
hold on
plot(sample(2,idx_neg ),sample(3,idx_neg),"ro")
axis([-1 1.5  -1.5 1.5])
grid on
end







  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值