阅读本文需要的背景知识点:正态分布、线性判别分析、一丢丢编程知识
一、引言
前面一节介绍了基本的线性判别分析算法,最后留下了一个问题,我们在使用 sklearn 得到的结果与上一节中自己实现的结果不同,这一节就来看看 sklearn 中通过概率分布的角度是如何实现线性判别分析的。
二、模型介绍
一元正态分布
在介绍模型之前先来回顾一下一个在统计学中特别常见的分布——正态分布1(Normal distribution),同时也被称为高斯分布(Gaussian distribution),该分布是下面介绍模型的基础。
f
(
x
;
μ
;
σ
)
=
1
σ
2
π
exp
(
−
(
x
−
μ
)
2
2
σ
2
)
f(x ; \mu ; \sigma)=\frac{1}{\sigma \sqrt{2 \pi}} \exp \left(-\frac{(x-\mu)^{2}}{2 \sigma^{2}}\right)
f(x;μ;σ)=σ2π1exp(−2σ2(x−μ)2)
上面为一元正态分布的概率密度函数,其中
x
x
x 为一元随机变量,
μ
μ
μ 为位置参数,
σ
σ
σ 为尺度参数。
多元正态分布
在机器学习中我们的输入特征一般是多维的,多元正态分布的概率密度函数可以从一元正态分布的概率密度函数得到的。为了简单起见,假设随机变量之间是独立的,即相互之间不存在线性相关性。
(1)随机变量之间相互独立,则联合概率密度函数为每一个随机变量的概率密度函数的乘积,其中 x 为
p
p
p 维
(2)分别带入各个一元概率密度函数
(3)将 e 的指数用 z 的平方来表示
(4)z 的平方可以写成向量矩阵的形式
(5)观察中间的对角矩阵,用
Σ
Σ
Σ 来表示该对角矩阵的逆矩阵
(6)则 z 的平方可以简写成该式,x 为特征向量,
μ
μ
μ 为均值向量。该表达式被称为马哈拉诺比斯距离2(Mahalanobis distance),用于表示数据的协方差距离
(7)观察
Σ
Σ
Σ,
Σ
Σ
Σ 的行列式为对角线上的元素相乘,开根号后为各
σ
σ
σ 的乘积,
∣
Σ
∣
|Σ|
∣Σ∣ 表示
Σ
Σ
Σ 的行列式
(8)带入回多元正态分布的概率密度函数中,得到最终的形式
f
(
x
)
=
f
(
x
1
)
f
(
x
2
)
…
f
(
x
p
)
(
1
)
=
1
σ
1
σ
2
…
σ
p
(
2
π
)
p
exp
(
−
(
x
1
−
μ
1
)
2
2
σ
1
2
−
(
x
2
−
μ
2
)
2
2
σ
2
2
−
⋯
−
(
x
p
−
μ
p
)
2
2
σ
p
2
)
(
2
)
z
2
=
(
x
1
−
μ
1
)
2
σ
1
2
+
(
x
2
−
μ
2
)
2
σ
2
2
+
⋯
+
(
x
p
−
μ
p
)
2
σ
p
2
(
3
)
=
[
x
1
−
μ
1
x
2
−
μ
2
⋯
x
p
−
μ
p
]
T
[
1
σ
1
2
0
⋯
0
0
1
σ
2
2
⋯
0
⋮
⋮
⋱
⋮
0
0
⋯
1
σ
p
2
]
[
x
1
−
μ
1
x
2
−
μ
2
⋯
x
p
−
μ
p
]
(
4
)
Σ
=
[
σ
1
2
0
⋯
0
0
σ
2
2
⋯
0
⋮
⋮
⋱
⋮
0
0
⋯
σ
p
2
]
(
5
)
z
2
=
(
x
−
μ
)
T
Σ
−
1
(
x
−
μ
)
(
6
)
∣
Σ
∣
1
2
=
σ
1
σ
2
…
σ
p
(
7
)
f
(
x
)
=
1
∣
Σ
∣
1
2
(
2
π
)
p
2
exp
(
−
(
x
−
μ
)
T
Σ
−
1
(
x
−
μ
)
2
)
(
8
)
\begin{aligned} f(x) &=f\left(x_{1}\right) f\left(x_{2}\right) \ldots f\left(x_{p}\right) & (1)\\ &=\frac{1}{\sigma_{1} \sigma_{2} \ldots \sigma_{p}(\sqrt{2 \pi})^{p}} \exp \left(-\frac{\left(x_{1}-\mu_{1}\right)^{2}}{2 \sigma_{1}^{2}}-\frac{\left(x_{2}-\mu_{2}\right)^{2}}{2 \sigma_{2}^{2}}-\cdots-\frac{\left(x_{p}-\mu_{p}\right)^{2}}{2 \sigma_{p}^{2}}\right) & (2)\\ z^{2}&=\frac{\left(x_{1}-\mu_{1}\right)^{2}}{\sigma_{1}^{2}}+\frac{\left(x_{2}-\mu_{2}\right)^{2}}{\sigma_{2}^{2}}+\cdots+\frac{\left(x_{p}-\mu_{p}\right)^{2}}{\sigma_{p}^{2}} & (3)\\ &=\left[\begin{array}{c} x_{1}-\mu_{1} \\ x_{2}-\mu_{2} \\ \cdots \\ x_{p}-\mu_{p} \end{array}\right]^{T}\left[\begin{array}{cccc} \frac{1}{\sigma_{1}^{2}} & 0 & \cdots & 0 \\ 0 & \frac{1}{\sigma_{2}^{2}} & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & \frac{1}{\sigma_{p}^{2}} \end{array}\right]\left[\begin{array}{c} x_{1}-\mu_{1} \\ x_{2}-\mu_{2} \\ \cdots \\ x_{p}-\mu_{p} \end{array}\right] & (4)\\ \Sigma&=\left[\begin{array}{cccc} \sigma_{1}^{2} & 0 & \cdots & 0 \\ 0 & \sigma_{2}^{2} & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & \sigma_{p}^{2} \end{array}\right] & (5)\\ z^{2}&=(x-\mu)^{T} \Sigma^{-1}(x-\mu) & (6)\\ |\Sigma|^{\frac{1}{2}} &=\sigma_{1} \sigma_{2} \ldots \sigma_{p} & (7)\\ f(x) &=\frac{1}{|\Sigma|^{\frac{1}{2}}(2 \pi)^{\frac{p}{2}}} \exp \left(-\frac{(x-\mu)^{T} \Sigma^{-1}(x-\mu)}{2}\right) & (8) \end{aligned}
f(x)z2Σz2∣Σ∣21f(x)=f(x1)f(x2)…f(xp)=σ1σ2…σp(2π)p1exp(−2σ12(x1−μ1)2−2σ22(x2−μ2)2−⋯−2σp2(xp−μp)2)=σ12(x1−μ1)2+σ22(x2−μ2)2+⋯+σp2(xp−μp)2=⎣⎢⎢⎡x1−μ1x2−μ2⋯xp−μp⎦⎥⎥⎤T⎣⎢⎢⎢⎢⎡σ1210⋮00σ221⋮0⋯⋯⋱⋯00⋮σp21⎦⎥⎥⎥⎥⎤⎣⎢⎢⎡x1−μ1x2−μ2⋯xp−μp⎦⎥⎥⎤=⎣⎢⎢⎢⎡σ120⋮00σ22⋮0⋯⋯⋱⋯00⋮σp2⎦⎥⎥⎥⎤=(x−μ)TΣ−1(x−μ)=σ1σ2…σp=∣Σ∣21(2π)2p1exp(−2(x−μ)TΣ−1(x−μ))(1)(2)(3)(4)(5)(6)(7)(8)
以上为相互独立的随机变量的多元正态分布的概率密度函数,对于任意的随机变量,该式亦成立,只是Σ表示随机变量的协方差矩阵。
贝叶斯定理
再来回顾一下概率论中的一个重要定理——贝叶斯定理3,在 B 事件发生时,A 事件发生的概率等于在 A 事件发生时,B 事件发生的概率乘以 A 事件发生的概率除以 B 事件发生的概率,用公式表示如下:
P
(
A
∣
B
)
=
P
(
B
∣
A
)
P
(
A
)
P
(
B
)
P(A \mid B)=\frac{P(B \mid A) P(A)}{P(B)}
P(A∣B)=P(B)P(B∣A)P(A)
线性判别分析
前面铺垫了这么多前置知识,下面来介绍以概率的角度来实现线性判别分析的方法。首先我们需要假设样本点是服从正态分布,并且每一类样本的协方差矩阵相同,满足上面两点我们就可以开始推导线性判别分析的实现过程。
(1)我们先来看下在输入为 x 的情况下分类为k的概率,根据前面介绍的贝叶斯定理可得到下面的(1)式
(2)样本点服从正态分布,在分类为 k 的情况下,输入为 x 的概率可以用多元正态分布的概率密度函数表示
P
(
k
∣
x
)
=
P
(
x
∣
k
)
P
(
k
)
P
(
x
)
(
1
)
=
f
k
(
x
)
P
(
k
)
P
(
x
)
(
2
)
\begin{aligned} P(k \mid x) &=\frac{P(x \mid k) P(k)}{P(x)} & (1)\\ &=\frac{f_{k}(x) P(k)}{P(x)} & (2) \end{aligned}
P(k∣x)=P(x)P(x∣k)P(k)=P(x)fk(x)P(k)(1)(2)
(1)我们的目的就是求在输入为 x 的情况下分类为 k 的概率最大的分类,所以我们可以写出假设函数如下图(1)式,该方法被称为最大后验概率估计4(maximum a posteriori probability (MAP) estimate)
(2)对其概率取对数,不影响函数的最后结果
(3)带入上面的
P
(
k
∣
x
)
P(k|x)
P(k∣x) 的表达式,由于
P
(
x
)
P(x)
P(x) 对最后结果也没有影响,也可以直接去掉
(4)带入多元正态分布的概率密度函数表达式
(5)将(4)式中的对数化简得到
(6)观察(5)式第二项,由于每一类样本的协方差矩阵相同,不影响最后的结果,可以直接去掉
h
(
x
)
=
argmax
k
P
(
k
∣
x
)
(
1
)
=
argmax
k
ln
P
(
k
∣
x
)
(
2
)
=
argmax
k
ln
f
k
(
x
)
+
ln
P
(
k
)
(
3
)
=
argmax
k
ln
(
e
−
(
x
−
μ
k
)
T
Σ
k
−
1
(
x
−
μ
k
)
2
∣
Σ
k
∣
1
2
(
2
π
)
p
2
)
+
ln
P
(
k
)
(
4
)
=
argmax
k
−
1
2
(
x
−
μ
k
)
T
Σ
k
−
1
(
x
−
μ
k
)
−
ln
(
∣
Σ
k
∣
1
2
(
2
π
)
p
2
)
+
ln
P
(
k
)
(
5
)
=
argmax
k
−
1
2
(
x
−
μ
k
)
T
Σ
k
−
1
(
x
−
μ
k
)
+
ln
P
(
k
)
(
6
)
\begin{aligned} h(x) &=\underset{k}{\operatorname{argmax}} P(k \mid x) & (1)\\ &=\underset{k}{\operatorname{argmax}} \ln P(k \mid x) & (2)\\ &=\underset{k}{\operatorname{argmax}} \ln f_{k}(x)+\ln P(k) & (3) \\ &=\underset{k}{\operatorname{argmax}} \ln \left(\frac{e^{-\frac{\left(x-\mu_{k}\right)^{T}{\Sigma_{k}^{-1}\left(x-\mu_{k}\right)}}{2}}}{\left|\Sigma_{k}\right|^{\frac{1}{2}}(2 \pi)^{\frac{p}{2}}}\right)+\ln P(k) & (4) \\ &=\underset{k}{\operatorname{argmax}} -\frac{1}{2}\left(x-\mu_{k}\right)^{T} \Sigma_{k}^{-1}\left(x-\mu_{k}\right)-\ln \left(\left|\Sigma_{k}\right|^{\frac{1}{2}}(2 \pi)^{\frac{p}{2}}\right)+\ln P(k) & (5) \\ &=\underset{k}{\operatorname{argmax}} -\frac{1}{2}\left(x-\mu_{k}\right)^{T} \Sigma_{k}^{-1}\left(x-\mu_{k}\right)+\ln P(k) & (6) \end{aligned}
h(x)=kargmaxP(k∣x)=kargmaxlnP(k∣x)=kargmaxlnfk(x)+lnP(k)=kargmaxln⎝⎛∣Σk∣21(2π)2pe−2(x−μk)TΣk−1(x−μk)⎠⎞+lnP(k)=kargmax−21(x−μk)TΣk−1(x−μk)−ln(∣Σk∣21(2π)2p)+lnP(k)=kargmax−21(x−μk)TΣk−1(x−μk)+lnP(k)(1)(2)(3)(4)(5)(6)
(1)我们再来看下上面(6)式中的第一项,将其展开
(2)观察第三项,可以合并成整体的转置的形式,注意协方差矩阵
Σ
Σ
Σ 为对称矩阵,其转置等于其本身
(3)上面第二三项互为转置,结果又是一个实数,所以其结果相等,可以直接合并为一项
(
x
−
μ
k
)
T
Σ
−
1
(
x
−
μ
k
)
=
x
T
Σ
−
1
x
−
x
T
Σ
−
1
μ
k
−
μ
k
T
Σ
−
1
x
+
μ
k
T
Σ
−
1
μ
k
(
1
)
=
x
T
Σ
−
1
x
−
x
T
Σ
−
1
μ
k
−
(
x
T
Σ
−
1
μ
k
)
T
+
μ
k
T
Σ
−
1
μ
k
(
2
)
=
x
T
Σ
−
1
x
−
2
x
T
Σ
−
1
μ
k
+
μ
k
T
Σ
−
1
μ
k
(
3
)
\begin{aligned} \left(x-\mu_{k}\right)^{T} \Sigma^{-1}\left(x-\mu_{k}\right) &=x^{T} \Sigma^{-1} x-x^{T} \Sigma^{-1} \mu_{k}-\mu_{k}^{T} \Sigma^{-1} x+\mu_{k}^{T} \Sigma^{-1} \mu_{k} & (1)\\ &=x^{T} \Sigma^{-1} x-x^{T} \Sigma^{-1} \mu_{k}-\left(x^{T} \Sigma^{-1} \mu_{k}\right)^{T}+\mu_{k}^{T} \Sigma^{-1} \mu_{k} & (2) \\ &=x^{T} \Sigma^{-1} x-2 x^{T} \Sigma^{-1} \mu_{k}+\mu_{k}^{T} \Sigma^{-1} \mu_{k} & (3) \end{aligned}
(x−μk)TΣ−1(x−μk)=xTΣ−1x−xTΣ−1μk−μkTΣ−1x+μkTΣ−1μk=xTΣ−1x−xTΣ−1μk−(xTΣ−1μk)T+μkTΣ−1μk=xTΣ−1x−2xTΣ−1μk+μkTΣ−1μk(1)(2)(3)
(1)前面所得的假设函数
(2)用上面展开的结果替换第一项
(3)在(2)式中第一项的结果不影响最后的结果,也可以直接去掉,得到最后的假设函数
h
(
x
)
=
argmax
k
−
1
2
(
x
−
μ
k
)
T
Σ
−
1
(
x
−
μ
k
)
+
ln
P
(
k
)
(
1
)
=
argmax
k
−
1
2
x
T
Σ
−
1
x
+
x
T
Σ
−
1
μ
k
−
1
2
μ
k
T
Σ
−
1
μ
k
+
ln
P
(
k
)
(
2
)
=
argmax
k
x
T
Σ
−
1
μ
k
−
1
2
μ
k
T
Σ
−
1
μ
k
+
ln
P
(
k
)
(
3
)
\begin{aligned} h(x) &=\underset{k}{\operatorname{argmax}} -\frac{1}{2}\left(x-\mu_{k}\right)^{T} \Sigma^{-1}\left(x-\mu_{k}\right)+\ln P(k) & (1)\\ &=\underset{k}{\operatorname{argmax}} -\frac{1}{2} x^{T} \Sigma^{-1} x+x^{T} \Sigma^{-1} \mu_{k}-\frac{1}{2} \mu_{k}^{T} \Sigma^{-1} \mu_{k}+\ln P(k) & (2) \\ &=\underset{k}{\operatorname{argmax}} x^{T} \Sigma^{-1} \mu_{k}-\frac{1}{2} \mu_{k}^{T} \Sigma^{-1} \mu_{k}+\ln P(k) & (3) \end{aligned}
h(x)=kargmax−21(x−μk)TΣ−1(x−μk)+lnP(k)=kargmax−21xTΣ−1x+xTΣ−1μk−21μkTΣ−1μk+lnP(k)=kargmaxxTΣ−1μk−21μkTΣ−1μk+lnP(k)(1)(2)(3)
(1)将假设函数的函数部分写成新的一个函数 L(x)
(2)将其中两类做差,当结果等于零时,即此时既可以将其分为 i 类,也可以分为 j 类。其本质为分类 i 与分类 j 的决策边界
(3)可以看到该决策边界是一个关于 x 的线性函数
L
k
(
x
)
=
x
T
Σ
−
1
μ
k
−
1
2
μ
k
T
Σ
−
1
μ
k
+
ln
P
(
k
)
(
1
)
L
i
(
x
)
−
L
j
(
x
)
=
x
T
Σ
−
1
(
μ
i
−
μ
j
)
−
1
2
(
μ
i
T
Σ
−
1
μ
i
−
μ
j
T
Σ
−
1
μ
j
)
+
ln
P
(
i
)
−
ln
P
(
j
)
(
2
)
=
x
T
w
+
b
(
3
)
\begin{aligned} L_{k}(x) &=x^{T} \Sigma^{-1} \mu_{k}-\frac{1}{2} \mu_{k}^{T} \Sigma^{-1} \mu_{k}+\ln P(k) & (1) \\ L_{i}(x)-L_{j}(x) &=x^{T} \Sigma^{-1}\left(\mu_{i}-\mu_{j}\right)-\frac{1}{2}\left(\mu_{i}^{T} \Sigma^{-1} \mu_{i}-\mu_{j}^{T} \Sigma^{-1} \mu_{j}\right)+\ln P(i)-\ln P(j) & (2) \\ &=x^{T} w+b & (3) \end{aligned}
Lk(x)Li(x)−Lj(x)=xTΣ−1μk−21μkTΣ−1μk+lnP(k)=xTΣ−1(μi−μj)−21(μiTΣ−1μi−μjTΣ−1μj)+lnP(i)−lnP(j)=xTw+b(1)(2)(3)
(1)、(2)根据上面的决策边界的线性函数形式,可以得到对应的 w 和 b
(3)
P
(
k
)
P(k)
P(k) 表示 k 分类的先验概率,即 k 分类的样本数除以总样本数
(4)
μ
μ
μ 表示均值向量
(5)
Σ
Σ
Σ 为协方差矩阵的估计,因为需要使得每一个分类的协方差矩阵相同,这里将每一个分类的协方差矩阵相加后使用
N
−
K
N - K
N−K 来做归一化处理
w
=
Σ
−
1
(
μ
i
−
μ
j
)
(
1
)
b
=
−
1
2
(
μ
i
T
Σ
−
1
μ
i
−
μ
j
T
Σ
−
1
μ
j
)
+
ln
P
(
i
)
−
ln
P
(
j
)
(
2
)
P
(
k
)
=
N
k
N
(
3
)
μ
k
=
1
N
k
∑
i
=
1
N
k
x
(
4
)
Σ
=
1
N
−
K
∑
i
=
1
K
(
x
−
μ
i
)
(
x
−
μ
i
)
T
(
5
)
\begin{aligned} w &=\Sigma^{-1}\left(\mu_{i}-\mu_{j}\right) & (1) \\ b &=-\frac{1}{2}\left(\mu_{i}^{T} \Sigma^{-1} \mu_{i}-\mu_{j}^{T} \Sigma^{-1} \mu_{j}\right)+\ln P(i)-\ln P(j) & (2) \\ P(k) &=\frac{N_{k}}{N} & (3) \\ \mu_{k} &=\frac{1}{N_{k}} \sum_{i=1}^{N_{k}} x & (4) \\ \Sigma &=\frac{1}{N-K} \sum_{i=1}^{K}\left(x-\mu_{i}\right)\left(x-\mu_{i}\right)^{T} & (5) \end{aligned}
wbP(k)μkΣ=Σ−1(μi−μj)=−21(μiTΣ−1μi−μjTΣ−1μj)+lnP(i)−lnP(j)=NNk=Nk1i=1∑Nkx=N−K1i=1∑K(x−μi)(x−μi)T(1)(2)(3)(4)(5)
当需要判断新样本点的分类时只需将样本点带入该线性函数中,对于二分类来说,最后的结果大于零,则分类为 i,反之则分类为 j。
两种角度下的线性判别分析的关系
两种角度下的线性判别分析的权重系数的公式如下:
w
=
S
w
−
1
(
μ
1
−
μ
2
)
(
1
)
w
=
Σ
−
1
(
μ
1
−
μ
2
)
(
2
)
\begin{array}{c} w=S_{w}^{-1}\left(\mu_{1}-\mu_{2}\right) & (1)\\ w=\Sigma^{-1}\left(\mu_{1}-\mu_{2}\right) & (2) \end{array}
w=Sw−1(μ1−μ2)w=Σ−1(μ1−μ2)(1)(2)
当每一个分类的协方差矩阵相同的时候,会有 S w S_w Sw 等于 2 Σ 2Σ 2Σ,说明其权重系数的方向是相同的,当样本服从正态分布时且分类的协方差矩阵相同时,两种角度下线性判别分析的结果是相同的。
三、代码实现
使用 Python 实现线性判别分析(LDA):
def ldaBayes(X, y):
"""
线性判别分析(LDA)
args:
X - 训练数据集
y - 目标标签值
return:
W - 权重系数
b - 偏移量
"""
# 标签值
y_classes = np.unique(y)
# 第一类
c1 = X[y==y_classes[0]][:]
# 第二类
c2 = X[y==y_classes[1]][:]
# 第一类均值向量
mu1 = np.mean(c1, axis=0)
# 第二类均值向量
mu2 = np.mean(c2, axis=0)
# 第一类协方差矩阵
sigma1 = c1 - mu1
sigma1 = sigma1.T.dot(sigma1)
# 第二类协方差矩阵
sigma2 = c2 - mu2
sigma2 = sigma2.T.dot(sigma2)
# Σ 矩阵
sigma = (sigma1 + sigma2) / (X.shape[0] - len(y_classes))
# Σ 逆矩阵
sigman = np.linalg.pinv(sigma)
# 求权重系数
w = sigman.dot(mu2 - mu1)
b = -0.5 *(mu2.reshape(-1, 1).T.dot(sigman).dot(mu2) - mu1.reshape(-1, 1).T.dot(sigman).dot(mu1)) + np.log(len(c2) / len(c1))
return w, b
def discriminantBayes(X, w, b):
"""
判别新样本点
args:
X - 数据集
w - 权重系数
b - 偏移量
return:
分类结果
"""
r = X.dot(w) + b
r[r > 0] = 1
r[r <= 0] = 0
return r
四、第三方库实现
scikit-learn5 实现线性判别分析:
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
# 初始化线性判别分析器
lda = LinearDiscriminantAnalysis()
# 拟合线性模型
lda.fit(X, y)
# 权重系数
w = lda.coef_
# 截距
b = lda.intercept_
五、思维导图
六、参考文献
- https://en.wikipedia.org/wiki/Normal_distribution
- https://en.wikipedia.org/wiki/Mahalanobis_distance
- https://en.wikipedia.org/wiki/Bayes%27_theorem
- https://en.wikipedia.org/wiki/Maximum_a_posteriori_estimation
- https://scikit-learn.org/stable/modules/generated/sklearn.discriminant_analysis.LinearDiscriminantAnalysis.html
完整演示请点击这里
注:本文力求准确并通俗易懂,但由于笔者也是初学者,水平有限,如文中存在错误或遗漏之处,恳请读者通过留言的方式批评指正
本文首发于——AI导图,欢迎关注