Skip to content

Commit db672f6

Browse files
authored
添加机器学习问题45/46 (#24)
* 添加机器学习问题45,LDA算法原理 * 添加机器学习问题46,PCA与LDA的比较
1 parent 7d1876c commit db672f6

File tree

4 files changed

+200
-6
lines changed

4 files changed

+200
-6
lines changed

C++基础/04_C++11常用新特性.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ auto *p = &a, b = 4.5; //错误,auto推导的结果为int类型,而b推导
5454

5555

5656

57-
## `decltype`关键字
57+
## decltype关键字
5858

5959
有时候会遇到这样的情况:希望从表达式的类型中推断出要定义的变量的类型,但是想用该表达式的值来初始化变量。C++11中引入了 `decltype`关键字来解决这个问题,编译器通过分析表达式的结果来返回相应的数据类型。
6060

@@ -70,7 +70,7 @@ decltype(表达式) 变量名 [=初始值]; //[]表示可选,下面用exp来表
7070
7171
②若exp是函数调用,则`decltype(exp)`的类型将和函数返回值类型一致
7272
73-
③若exp是一个左值,或者是一个被括号`()`包围,那么 `decltype(exp)`的类型将是exp的引用
73+
③若exp是一个左值,或者是一个被括号`()`包围的值,那么 `decltype(exp)`的类型将是exp的引用
7474
7575
具体示例:
7676
@@ -122,7 +122,7 @@ for(auto num : nums){
122122

123123

124124

125-
## `nullptr`关键字
125+
## nullptr关键字
126126

127127
C++11使用`nullptr`代替了`NULL`,原因是`NULL`有时存在二义性,有的编译器可能将`NULL`定义为`((void*)0)`,有的则直接定义为0。
128128

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ github上直接看的话很多公式和图片看不了,**请 clone 到本地
7070
| 43 | | one stage目标检测网络 YOLO 和 SSD 网络结构及优缺点(尤其注意损失函数) |
7171
| 44 | | concat 和 add 的区别 |
7272
| 45 | | 了解模型剪枝和模型压缩的概念 |
73-
| 46 | | 简单了解循环神经网络 RCNN & LSTM |
73+
| 46 | | 简单了解循环神经网络 RNN & LSTM |
7474
| 47 | | 简单了解生成式对抗网络 GAN |
7575
| 48 || 各种卷积方式串讲 |
7676

@@ -120,8 +120,8 @@ github上直接看的话很多公式和图片看不了,**请 clone 到本地
120120
| 42 | | 使用EM算法求解GMM模型的思想和步骤 |
121121
| 43 | | GMM高斯混合模型的思想 |
122122
| 44 || PCA原理、公式推导 |
123-
| 45 | | LDA原理 |
124-
| 46 | | PCA与LDA的对比 |
123+
| 45 | | LDA原理 |
124+
| 46 | | PCA与LDA的对比 |
125125
| 47 | | 牛顿法和拟牛顿法思想 |
126126
| 48 | | 梯度下降法和牛顿法的区别 |
127127
| 49 || 生成式模型和判别式模型 |

机器学习/45_LDA算法原理.md

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
## 问题
2+
3+
线性判别分析(Linear Discriminant Analysis,LDA)是机器学习中常用的降维方法之一,本文旨在介绍LDA算法的思想,其数学推导过程可能会稍作简化。
4+
5+
## LDA的思想
6+
7+
● LDA是一种线性的、有监督的降维方法,即每个样本都有对应的类别标签(这点和PCA)。
8+
9+
● 主要思想:给定训练样本集,设法将样本投影到一条直线上,使得同类的样本的投影尽可能的接近、异类样本的投影尽可能地远离(即**最小化类内距离和最大化类间距离**)。
10+
11+
> 下面分别通过《机器学习》和《百面机器学习》两本书中的图片先来直观地理解一下LDA的思想。
12+
13+
![](https://i.loli.net/2020/06/04/qOzCRLJ7d5Erx2F.png)
14+
15+
![](https://i.loli.net/2020/06/04/uETl7im9gFfwxnY.png)
16+
17+
● 为什么要将最大化类间距离和最小化类内距离同时作为优化目标呢?
18+
19+
先看上面第二张图的左图(a),对于两个类别,只采用了最大化类间距离,其结果中两类样本会有少许重叠;而对于右图(b),同时最大化类间距离和最小化类内距离,可见分类效果更好,同类样本的投影分布更加集中了。当然,对于二维的数据,可以采用将样本投影到直线上的方式,对于高维的数据,则是投影到一个低维的超平面上,这应该很好理解。
20+
21+
22+
23+
## LDA算法优化目标
24+
25+
由上面的介绍我们知道,LDA算法的思想就是最大化类间距离和最小化类内距离,其优化目标就很直观了,那怎么用数学方式来表示呢?要解决这个问题,就得先看看怎么描述类间距离和类内距离。
26+
27+
**● 类间距离**(以二分类为示例)
28+
29+
假设有$C_{1}$、$C_{2}$两类样本,其均值分别为 $\mu_{1}=\frac{1}{N}\sum_{x\in C_{1}}x$ 和 $\mu_{2}=\frac{1}{N}\sum_{x\in C_{2}}x$ 。很显然,要使得两类样本类间距离最大,则 $\mu_{1}$ 、$\mu_{2}$ 的距离应尽可能地大,则类间距离可描述为
30+
$$
31+
||\omega^{T}\mu_{0}-\omega^{T}\mu_{1}||_{2}^{2},\ \ 其中,\omega为投影方向
32+
$$
33+
**● 类内距离**
34+
35+
要使得样本在同类中距离最小,也就是最小化同类样本的方差,假设分别用 $D_{1}$、 $D_{2}$ 表示两类样本的投影方差,则有:
36+
$$
37+
D_{1} = \sum_{x\in C_{1}}(\omega^{T}x-\omega^{T}\mu_{1})^{2}=\sum_{x\in C_{1}}\omega^{T}(x-\mu_{1})(x-\mu_{1})^{T}\omega \\
38+
D_{2} = \sum_{x\in C_{2}}(\omega^{T}x-\omega^{T}\mu_{2})^{2}=\sum_{x\in C_{2}}\omega^{T}(x-\mu_{2})(x-\mu_{2})^{T}\omega
39+
$$
40+
因此,要使得类内距离最小,就是要最小化 $D_{1}+D_{2}$。
41+
42+
**● 优化目标**
43+
44+
由上面分析,最大化类间距离和最小化类内距离,因此可以得到最大化目标:
45+
$$
46+
J(\omega) = \frac{||\omega^{T}\mu_{0}-\omega^{T}\mu_{1}||_{2}^{2}}{D_{1}+D_{2}}\\\qquad\qquad\qquad\quad
47+
=\frac{||\omega^{T}\mu_{0}-\omega^{T}\mu_{1}||_{2}^{2}}{\sum_{x\in C_{i}}\omega^{T}(x-\mu_{i})(x-\mu_{i})^{T}\omega}
48+
$$
49+
为了化简上面公式,给出几个定义:
50+
51+
**● 类间散度矩阵:**
52+
$$
53+
S_{b}=(\mu_{1}-\mu_{2})(\mu_{1}-\mu_{2})^{T}
54+
$$
55+
**● 类内散度矩阵:**
56+
$$
57+
S_{\omega}=\Sigma_{1}+\Sigma_{2}=\sum_{x\in C_{1}}(x-\mu_{1})(x-\mu_{1})^{T}+\sum_{x\in C_{2}}(x-\mu_{2})(x-\mu_{2})^{T}
58+
$$
59+
因此最大化目标可以简写为:
60+
$$
61+
J(\omega) = \frac{\omega^{T}S_{b}\omega}{\omega^{T}S_{\omega}\omega}
62+
$$
63+
64+
> 这是一个广义瑞利商,可以对矩阵进行标准化操作(具体证明就不展开啦),因此,通过标准化后总可以得到 $\omega^{T}S_{\omega}\omega=1$,又由于上面优化目标函数分子分母都是二次项,其解与 $\omega$ 的长度无关,只与方向有关,因此上面优化目标等价于以下最小化目标:
65+
66+
转化为最小化目标:
67+
$$
68+
\underset{\omega}{min}\quad-\omega^{T}S_{b}\omega \\
69+
s.t. \quad \omega^{T}S_{\omega}\omega=1
70+
$$
71+
由拉格朗日法,上式可得:
72+
$$
73+
S_{b}\omega=\lambda S_{\omega}\omega \\
74+
即有,S_{\omega}^{-1}S_{b}\omega=\lambda \omega
75+
$$
76+
至此,我们的**优化目标就转化成了求矩阵 $S_{\omega}^{-1}S_{b}$ 的特征值,而投影方向就是这个特征值对应的特征向量**
77+
78+
> 由于 $(\mu_{1}-\mu_{2})^{T}\omega$ 是个标量(因为 $\mu_{1}-\mu_{2}$ 和 $\omega$ 同向时才能保证类间距离最大),
79+
>
80+
> 所以,对于 $S_{b}\omega=(\mu_{1}-\mu_{2})(\mu_{1}-\mu_{2})^{T}\omega$ 而言,可以看出 $S_{b}\omega$ 始终与 $(\mu_{1}-\mu_{2})$ 的方向一致
81+
82+
因此,如果只考虑 $\omega$ 的长度而不考虑方向,则由:
83+
$$
84+
S_{\omega}^{-1}S_{b}\omega=\lambda \omega \qquad => \qquad \omega=S_{\omega}^{-1}(\mu_{1}-\mu_{2})
85+
$$
86+
**也就是说,我们只需求出样本的均值和类内的散度矩阵(即类内方差),即可求出投影方向。**
87+
88+
89+
90+
## LDA算法流程(推广至高维)
91+
92+
1.计算每类样本的均值向量 $\mu_{i}$。
93+
94+
2.计算类间散度矩阵 $S_{\omega}$ 和类内散度矩阵 $S_{b}$ 。
95+
96+
3.求矩阵 $S_{\omega}^{-1}S_{b}$ 的特征值即对应的特征向量,从大到小排序。
97+
98+
4.将特征值由大到小排列,取出前 k 个特征值对应的特征向量。
99+
100+
5.将 n 维样本映射到 k 维,实现降维处理。
101+
$$
102+
x_{i}^{'}=\begin{bmatrix}\omega_{1}^{T}x_{i}\\\omega_{2}^{T}x_{i}\\\vdots \\\omega_{k}^{T}x_{i} \end{bmatrix}\\
103+
$$
104+
105+
## 总结
106+
107+
● LDA是线性的、有监督的降维方法,其优点是善于对有类别信息的数据进行降维处理(与PCA的不同)。
108+
109+
● LDA因为是线性模型,对噪声的鲁棒性较好,但由于模型简单,对数据特征的表达能力不足。
110+
111+
● LDA对数据的分布做了一些很强的假设,比如每个类别都是高斯分布、各个类别的协方差相等,实际中这些假设很难完全满足。
112+
113+
> 关于LDA与PCA的区别,请看下回分解。
114+
115+
116+
117+
## 参考资料
118+
119+
周志华《机器学习》
120+
121+
葫芦娃《百面机器学习》

机器学习/46_PCA与LDA比较.md

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
## 问题
2+
3+
在前面总结的机器学习问题44和45中已经分别总结了 `PCA``LDA` 两种降维方法,接下来就对这两种方法一起做个对比和总结吧。
4+
5+
## PCA与LDA的比较
6+
7+
### 异同点
8+
9+
#### ● 相同点:
10+
11+
① 均是降维方法
12+
13+
② 降维时均使用了矩阵特征分解的思想
14+
15+
③ 两者都假设数据符合高斯分布
16+
17+
#### ● 不同点:
18+
19+
① PCA是无监督的降维方法,而LDA是有监督的降维方法
20+
21+
② LDA除了可以降维,还可以用于分类
22+
23+
③ LDA降维最多降到类别数 `k-1`的维数(k是样本类别的个数),而PCA没有这个限制。
24+
25+
④ LDA选择的是分类性能最好的投影方向,而PCA选择样本点投影具有最大方差的方向
26+
27+
> ● 关于第3个点:
28+
>
29+
> 可能不太好理解,如果要搞清楚的话,可以参考文末的博客中 **第4小节-多类LDA原理** 中的最后一段。
30+
>
31+
> ● 关于第4点,可以这样理解:
32+
>
33+
> LDA在降维过程中最小化类内距离,即同类样本的方差尽可能小,同时最大化类间距离,即异类样本尽可能分离,这本身是也为分类任务服务的;而PCA是无监督的降维方法,其假设方差越大,信息量越多,因此会选择样本点投影具有最大方差的方向。
34+
35+
36+
37+
### 优缺点
38+
39+
#### ● LDA优点:
40+
41+
① 降维过程中可以使用类别的先验知识(有监督的),而PCA是无监督的
42+
43+
② 在样本分类信息依赖均值而不是方差的时候,LDA算法优于PCA算法
44+
45+
#### ● LDA缺点:
46+
47+
① LDA不适合对非高斯分布样本进行降维,PCA也有这个问题。
48+
49+
② LDA在样本分类信息依赖方差而不是均值的时候,降维效果不好。
50+
51+
③ LDA降维最多降到类别数k-1的维数,如果我们降维的维度大于k-1,则不能使用LDA。
52+
53+
④ LDA可能过度拟合数据。
54+
55+
56+
57+
#### ● PCA优点:
58+
59+
①它是无监督学习算法,完全无参数限制。
60+
61+
② 在样本分类信息依赖方差而不是均值的时候,PCA算法优于LDA算法
62+
63+
#### ● PCA缺点:
64+
65+
①特征值分解有一些局限性,比如变换的矩阵必须是方阵
66+
67+
②如果用户对观测对象有一定的先验知识,掌握了数据的一些特征,却无法通过参数化等方法对处理过程进行干预,可能会得不到预期的效果,效率也不高
68+
69+
70+
71+
## 参考资料
72+
73+
[线性判别分析LDA原理总结](https://www.cnblogs.com/pinard/p/6244265.html) https://www.cnblogs.com/pinard/p/6244265.html

0 commit comments

Comments
 (0)