前言
由于模式识别课程实验需要所以跟着B站shuhuai008大佬的白板推导课学习了相关的机器学习算法,下面是跟着视频做的笔记,写成博客以做记录。
大佬主页地址:https://space.bilibili.com/97068901/?spm_id_from=333.999.0.0
线性分类
线性回归在统计机器学习中占据了核心的地位,它是最简单也是最基础的模型。线性回归有三个特点,统计学习的其他模型都是通过打破线性回归的一个或多个特点形成的。
对于分类任务,线性回归模型就无能为力了,但是我们可以在线性模型的函数进行后对它进行降维或者加入一层激活函数就变成了线性分类模型,这个函数是非线性的,激活函数的反函数叫做链接函数。
我们有两种线性分类的方式:
- 硬分类,我们直接需要输出观测对应的分类。这类模型的代表为:
- 线性判别分析(Fisher 判别)
- 感知机
- 软分类,产生不同类别的概率,这类算法根据概率方法的不同分为两种
- 生成式(根据贝叶斯定理先计算参数后验,再进行推断):高斯判别分析(GDA)和朴素贝叶斯等为代表
- GDA
- Naive Bayes
- 判别式(直接对条件概率进行建模):Logistic 回归
- 生成式(根据贝叶斯定理先计算参数后验,再进行推断):高斯判别分析(GDA)和朴素贝叶斯等为代表
两分类-硬分类-感知机算法(Perceptron Algorithm)
思想: 感知机算法的思想是错误驱动,先随机w,然后看有多少个样本点被错误分类了,之后再不断改变w值以降低被错误分类样本点的个数,最后实现线性分类。
策略: 策略是找出损失函数,我们把损失函数定义为被错误分类样本点的个数,目标是使损失函数最小,接下来的推论过程就是如何把损失函数从文字语言转换为数学语言。
首先我们定义感知机的激活函数为:
s
i
g
n
(
a
)
=
{
+
1
,
a
≥
0
−
1
,
a
<
0
sign(a)=\left\{\begin{matrix}+1,a\ge0\\-1,a\lt0\end{matrix}\right.
sign(a)={+1,a≥0−1,a<0
这样就可以将线性回归的结果映射到两分类的结果上了。
对于样本点
(
x
i
,
y
i
)
(x_i,y_i)
(xi,yi),正确分类时满足:
{
w
T
x
i
>
0
,
y
=
+
1
w
T
x
i
<
0
,
y
=
−
1
\left\{\begin{matrix}w^Tx_i>0,y=+1\\w^Tx_i<0,y=-1\end{matrix}\right.
{wTxi>0,y=+1wTxi<0,y=−1
这两个式子可以统一写成
y
i
w
T
x
i
>
0
y_iw^Tx_i>0
yiwTxi>0,也就是说样本点
(
x
i
,
y
i
)
(x_i,y_i)
(xi,yi),满足
y
i
w
T
x
i
<
0
y_iw^Tx_i<0
yiwTxi<0时就被错误分类了,被错误分类样本点的个数应该+1
这样我们可以借助指示函数I(当里面为True时取1,为False时取0),目标损失函数就可以写为:
L
(
w
)
=
∑
i
=
1
N
(
)
−
y
i
w
T
x
i
>
0
L(w)=\sum\limits_{i=1}^N()-y_iw^Tx_i>0
L(w)=i=1∑N()−yiwTxi>0
但是我们可以发现,w变化一点点就可能导致
L
(
w
)
L(w)
L(w)的值从0变到1或者从1变到0,指示函数不可导,因此继续变换(这里变换有点没听懂),可以再去看视频,在16:42s处,解释排版如下图:
w变换的时候,
y
i
w
T
x
i
y_iw^Tx_i
yiwTxi也会变化,且我们的目标是改变w使
(
x
i
,
y
i
)
(x_i,y_i)
(xi,yi)正确分类,所以w变化的时候,
y
i
w
T
x
i
y_iw^Tx_i
yiwTxi会逐渐变大直至接近0(正确分类),我们要使目标函数最小,因此前面再加一个负号,损失函数就可以再定义为:
L
(
w
)
=
∑
x
i
∈
D
w
r
o
n
g
−
y
i
w
T
x
i
L(w)=\sum\limits_{x_i\in\mathcal{D}_{wrong}}-y_iw^Tx_i
L(w)=xi∈Dwrong∑−yiwTxi
其中,
D
w
r
o
n
g
\mathcal{D}_{wrong}
Dwrong是错误分类集合。
算法: 实际在每一次训练的时候,我们采用梯度下降的算法。损失函数对
w
w
w 的偏导为:
∂
∂
w
L
(
w
)
=
∑
x
i
∈
D
w
r
o
n
g
−
y
i
x
i
\frac{\partial}{\partial w}L(w)=\sum\limits_{x_i\in\mathcal{D}_{wrong}}-y_ix_i
∂w∂L(w)=xi∈Dwrong∑−yixi
但是如果样本非常多的情况下,计算复杂度较高,但是,实际上我们并不需要绝对的损失函数下降的方向,我们只需要损失函数的期望值下降,但是计算期望需要知道真实的概率分布,我们实际只能根据训练数据抽样来估算这个概率分布(经验风险):
我们知道,
N
N
N 越大,样本近似真实分布越准确,但是对于一个标准差为
σ
\sigma
σ 的数据,可以确定的标准差仅和
N
\sqrt{N}
N 成反比,而计算速度却和
N
N
N 成正比。因此可以每次使用较少样本,则在数学期望的意义上损失降低的同时,有可以提高计算速度,如果每次只使用一个错误样本,我们有下面的更新策略(根据泰勒公式,在负方向):
w
t
+
1
←
w
t
+
λ
y
i
x
i
w^{t+1}\leftarrow w^{t}+\lambda y_ix_i
wt+1←wt+λyixi
是可以收敛的,同时使用单个观测更新也可以在一定程度上增加不确定度,从而减轻陷入局部最小的可能。在更大规模的数据上,常用的是小批量随机梯度下降法。
代码:
%matlab代码
clear;
W1=[0.1 6.8 -3.5 2.0 4.1 3.1 -0.8 0.9 5.0 3.9;
1.1 7.1 -4.1 2.7 2.8 5.0 -1.3 1.2 6.4 4.0];
W2=[7.1 -1.4 4.5 6.3 4.2 1.4 2.4 2.5 8.4 4.1;
4.2 -4.3 0.0 1.6 1.9 -3.2 -4.0 -6.1 3.7 -2.2];
W3=[-3.0 0.5 2.9 -0.1 -4.0 -1.3 -3.4 -4.1 -5.1 1.9;
-2.9 8.7 2.1 5.2 2.2 3.7 6.2 3.4 1.6 5.1];
%将所有训练样本进行规范化增广
ww1=[ones(1,size(W1,2));W1];
ww2=[ones(1,size(W2,2));W2];
ww3=[ones(1,size(W3,2));W3];
%对W1,W2训练
w12=[ww1,-ww2];%增广样本规范化为w12
y=zeros(1,size(w12,2));%y初始为0矩阵
% a=[0;0;0];%初始权向量
a=[1;1;1];%初始权向量
k=0;
while any(y<=0)
for i=1:size(y,2)
y(i)=a'*w12(:,i);
end
a=a+(sum((w12(:,find(y<=0)))'))';%修正向量a
k=k+1;%收敛步数
end
subplot(1,2,1)
plot(W1(1,:),W1(2,:),'r.');
hold on;
plot(W2(1,:),W2(2,:),'g*');
%找到样本在坐标中的集中区域,以便于打印样本坐标图
xmin=min(min(W1(1,:)),min(W2(1,:)));
xmax=max(max(W1(1,:)),max(W2(1,:)));
xindex=xmin-1:(xmax-xmin)/100:xmax+1;
yindex=-a(2)*xindex/a(3)-a(1)/a(3);
plot(xindex,yindex);
代码输出: