浏览本文须要的背景知识点:正态分布、线性判别分析、一丢丢编程常识
一、引言
后面一节介绍了根本的线性判别分析算法,最初留下了一个问题,咱们在应用sklearn失去的后果与上一节中本人实现的后果不同,这一节就来看看sklearn中通过概率分布的角度是如何实现线性判别分析的。
二、模型介绍
一元正态分布
在介绍模型之前先来回顾一下一个在统计学中特地常见的散布——正态分布1(Normal distribution),同时也被称为高斯分布(Gaussian distribution),该散布是上面介绍模型的根底。
$$f(x ; \mu ; \sigma)=\frac{1}{\sigma \sqrt{2 \pi}} \exp \left(-\frac{(x-\mu)^{2}}{2 \sigma^{2}}\right)$$
下面为一元正态分布的概率密度函数,其中 x 为一元随机变量, 为地位参数, 为尺度参数。
不同尺度参数的正态分布图示
多元正态分布
在机器学习中咱们的输出特色个别是多维的,多元正态分布的概率密度函数能够从一元正态分布的概率密度函数失去的。为了简略起见,假如随机变量之间是独立的,即相互之间不存在线性相关性。
(1)随机变量之间互相独立,则联结概率密度函数为每一个随机变量的概率密度函数的乘积,其中x为p维
(2)别离带入各个一元概率密度函数
(3)将e的指数用z的平方来示意
(4)z的平方能够写成向量矩阵的模式
(5)察看两头的对角矩阵,用来示意该对角矩阵的逆矩阵
(6)则z的平方能够简写成该式,x为特征向量,为均值向量。该表达式被称为马哈拉诺比斯间隔2(Mahalanobis distance),用于示意数据的协方差间隔
(7)察看,的行列式为对角线上的元素相乘,开根号后为各的乘积,||示意的行列式
(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}$$
以上为互相独立的随机变量的多元正态分布的概率密度函数,对于任意的随机变量,该式亦成立,只是示意随机变量的协方差矩阵。
贝叶斯定理
再来回顾一下概率论中的一个重要定理——贝叶斯定理3,在B事件产生时,A事件产生的概率等于在A事件产生时,B事件产生的概率乘以A事件产生的概率除以B事件产生的概率,用公式示意如下:
$$P(A \mid B)=\frac{P(B \mid A) P(A)}{P(B)}$$
线性判别分析
后面铺垫了这么多前置常识,上面来介绍以概率的角度来实现线性判别分析的办法。首先咱们须要假如样本点是遵从正态分布,并且每一类样本的协方差矩阵雷同,满足下面两点咱们就能够开始推导线性判别分析的实现过程。
(1)咱们先来看下在输出为x的状况下分类为k的概率,依据后面介绍的贝叶斯定理可失去上面的(1)式
(2)样本点遵从正态分布,在分类为k的状况下,输出为x的概率能够用多元正态分布的概率密度函数示意
$$\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}$$
(1)咱们的目标就是求在输出为x的状况下分类为k的概率最大的分类,所以咱们能够写出假如函数如下图(1)式,该办法被称为最大后验概率预计4(maximum a posteriori probability (MAP) estimate)
(2)对其概率取对数,不影响函数的最初后果
(3)带入下面的P(k|x)的表达式,因为P(x)对最初后果也没有影响,也能够间接去掉
(4)带入多元正态分布的概率密度函数表达式
(5)将(4)式中的对数化简失去
(6)察看(5)式第二项,因为每一类样本的协方差矩阵雷同,不影响最初的后果,能够间接去掉
$$\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}$$
(1)咱们再来看下下面(6)式中的第一项,将其开展
(2)察看第三项,能够合并成整体的转置的模式,留神协方差矩阵为对称矩阵,其转置等于其自身
(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}$$
(1)后面所得的假如函数
(2)用下面开展的后果替换第一项
(3)在(2)式中第一项的后果不影响最初的后果,也能够间接去掉,失去最初的假如函数
$$\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}$$
(1)将假如函数的函数局部写成新的一个函数L(x)
(2)将其中两类做差,当后果等于零时,即此时既能够将其分为i类,也能够分为j类。其本质为分类i与分类j的决策边界
(3)能够看到该决策边界是一个对于x的线性函数
$$\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}$$
(1)、(2)依据下面的决策边界的线性函数模式,能够失去对应的w和b
(3)P(k) 示意k分类的先验概率,即k分类的样本数除以总样本数
(4) 示意均值向量
(5) 为协方差矩阵的预计,因为须要使得每一个分类的协方差矩阵雷同,这里将每一个分类的协方差矩阵相加后应用N-K来做归一化解决
$$\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}$$
当须要判断新样本点的分类时只需将样本点带入该线性函数中,对于二分类来说,最初的后果大于零,则分类为i,反之则分类为j。
两种角度下的线性判别分析的关系
两种角度下的线性判别分析的权重系数的公式如下:
$$\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}$$
当每一个分类的协方差矩阵雷同的时候,会有S_w 等于 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, bdef 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...
- https://en.wikipedia.org/wiki...
- https://en.wikipedia.org/wiki...
- https://en.wikipedia.org/wiki...
- https://scikit-learn.org/stab...
残缺演示请点击这里
注:本文力求精确并通俗易懂,但因为笔者也是初学者,程度无限,如文中存在谬误或脱漏之处,恳请读者通过留言的形式批评指正
本文首发于——AI导图,欢送关注