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=1∑Nωixi=ωnTxn
-
令上式等于零,即可得到二分类问题的决策面,即:
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=1∑Nωixi=ωnTxn=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(ωnTxn)
- 其中: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)]xn
- 其中: 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)={1−1x(n)∈l1x(n)∈l2 0<η<1
-
ω
⃗
(
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)]xn
- ⑥:判断
- 满足收敛条件,算法结束
- 不满足收敛条件,则
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),这样就限制了在分类种类上的扩展
- 感知器网络只对线性可分的问题收敛,这是最致命的一个缺陷。
- 根据感知器收敛定理,只要输入向量是线性可分的,感知器总能在有限的时间内收敛。
- 问题不可分,则感知器无能为力
- 如果输入样本存在奇异样本,则网络需要花费很长的时间
- 奇异样本就是数值上远远偏离其他样本的数据
- 感知器的学习算法只对单层有效,因此无法直接套用其规则设计多层感知器
-
以下是一个对四个点进行二分类的实例
序号 | x | y | 值 |
---|---|---|---|
1 | -0,5 | -0.5 | 1 |
2 | -0.5 | 0.5 | 1 |
3 | 0.3 | -0.5 | 0 |
4 | 0 | 1.0 | 0 |
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