总是看到网上的面经有提到大厂面他们的时候,会问一些机器学习的问题,很多其实都是数学问题,乍一看,好晕啊,什么贝叶斯概率,似然函数什么的。但是怎么说,这是必须要过的一关,而且我对自己的数学还是相当有信心的。
以下的这些,都不是我作参考的文献,是后期补充的一些链接。参考的文献,在正文中有写。
机器学习和深度学习中值得弄清楚的一些问题 这个是更深层的一些解释
机器学习常用算法总结 一些简单的问题,算是一个小补充吧
机器学习连载系列 分为23个,具体还包括python的实现
各种机器学习算法的应用场景分别是什么(比如朴素贝叶斯、决策树、K 近邻、SVM、逻辑回归最大熵模型)?
目录
随机森林(bagging是将多个模型的预测结果简单地加权平均或者投票。)、
基本概念
[直观理解] 特征值、特征向量、矩阵、投影矩阵、线性变换
https://www.jiqizhixin.com/articles/2017-07-05-2【最好的解释】
矩阵可以用特征值(速度)和特征向量(运动方向)来表示。
矩阵与线性变换的关系:矩阵 A 对输入向量 v 执行了一次线性变换,且线性变换结果为 b
下图展示了矩阵 A 如何将更短更低的向量 v 映射到更长更高的向量 b:
假设所有的输入向量 V 可以排列为一个标准表格
矩阵相当于对输入向量进行了线性变换,将其进行投影(投影方向就是:特征向量)得到输出向量
如果假设矩阵就是一阵风,它通过有形的力量得出可见的结果。
而这一阵风所吹向的方向就是特征向量,因此特征向量就表明矩阵所要变换的方向。
如上图所示,特 矩阵 A 和标量λ,若有向量 x 且满足以下关系式,那么 x 就为特征向量、λ为特征值。
输入向量沿着特征向量(这些轴)进行压缩延伸(投影),一般的,n 阶方阵有 n 个特征向量,每一个特征向量表征一个维度上的线性变换方向。
因为特征向量提取出了矩阵变换的主要信息,因此它在矩阵分解中十分重要,即沿着特征向量对角化矩阵。
矩阵分解最常见的是特征分解(eigen-decomposition),即我们将矩阵分解为一系列的特征向量和特征值。
先验概率
P(A)是A的先验概率(或边缘概率)。之所以称为"先验"是因为它不考虑任何B方面的因素。
后验概率
P(A|B)是已知B发生后A的条件概率,也由于得自B的取值而被称作A的后验概率。
贝叶斯定理(垃圾邮件过滤,单词纠正事件)
描述 P(A|B)和P(B|A)的关系
通常,事件A在事件B已发生的条件下发生的概率,与事件B在事件A已发生的条件下发生的概率是不一样的。然而,这两者是有确定的关系的,贝叶斯定理就是这种关系的陈述。
对于给定观测数据,一个猜测是好是坏后验概率,取决于“这个猜测本身独立的可能性大小(先验概率,Prior )”和“这个猜测生成我们观测到的数据的可能性大小。
P(B|A)/P(B)称作是标准似然度,所以 A的后验概率 = A的先验概率 * 标准似然度
垃圾邮件过滤
P(d2|d1,h+)表示是垃圾邮件,里面含有d1的情况下,也有d2的概率。
我们看上面的例子,证明了贝叶斯的用处。
拼写纠正
朴素贝叶斯
在原始的贝叶斯基础上,假设了我们特征之间是相互独立,互不影响的。
在机器学习中,朴素贝叶斯分类器是一系列以假设特征之间强(朴素)独立下运用贝叶斯定理为基础的简单概率分类器。
概率质量函数
概率质量函数(probability mass function,简写为pmf)是离散随机变量在各特定取值上的概率。概率质量函数和概率密度函数不同之处在于:概率质量函数是对离散随机变量定义的,本身代表该值的概率;概率密度函数是对连续随机变量定义的,本身不是概率,只有对连续随机变量的概率密度函数在某区间内进行积分后才是概率。
似然性
似然函数可以理解为条件概率的逆反。
条件概率:用于在已知一些参数的情况下,预测结果;
P(y|w) w是权重参数,已知权重,预测此时的wx得到的y的概率
似然性:则是用于在已知某些观测所得到的结果时,参数估值,使得不断逼近于观测所得到的结果。
P(w|y) 已知了真实y,然后估计此时的权重w,神经网络不就这样的吗,已知了真实的y,然后通过不断估计(更改)w使得P(w|y) 越大(越接近于真实y)
似然函数
似然函数:是一种关于统计模型中的参数的函数,表示模型参数中的似然性
最大似然估计
我们可以在的所有可能取值中寻找一个值使得似然函数取到最大值。这个使可能性最大的值即称为的最大似然估计。由定义,最大似然估计是样本的函数。
奥卡姆剃刀
先验概率大的模型更好,比如线性回归的时候,一阶的函数最常见,所以最好。
交叉验证
-
什么是交叉验证法?
它的基本思想就是将原始数据(dataset)进行分组,一部分做为训练集来训练模型,另一部分做为测试集来评价模型。
-
为什么用交叉验证法?
- 交叉验证用于评估模型的预测性能,尤其是训练好的模型在新数据上的表现,可以在一定程度上减小过拟合[泛化误差的估计]。【你想比如K交叉检验,用不同的数据作为测试集,来评估预测性能,预测泛化误差,肯定更准】
- 还可以从有限的数据中获取尽可能多的有效信息[充分利用数据]。
-
主要有哪些方法?优缺点?
1. 留出法 (holdout cross validation)
就是普通的trian val test
2. k 折交叉验证(k-fold cross validation)加以改进:
k 折交叉验证通过对 k 个不同分组训练的结果进行平均来减少方差,因此模型的性能对数据的划分就不那么敏感。
k 一般取 10,
数据量小的时候,k 可以设大一点,这样训练集占整体比例就比较大,不过同时训练的模型个数也增多。
数据量大的时候,k 可以设小一点。
3. 当 k=m 即样本总数时,叫做 留一法(Leave one out cross validation),每次的测试集都只有一个样本,要进行 m 次训练和预测。 这个方法用于训练的数据只比整体数据集少了一个样本,因此最接近原始样本的分布。 但是训练复杂度增加了,因为模型的数量与原始数据样本数量相同。 一般在数据缺乏时使用。
此外:
多次 k 折交叉验证再求均值,例如:10 次 10 折交叉验证,以求更精确一点。
划分时有多种方法,例如对非平衡数据可以用分层采样,就是在每一份子集中都保持和原始数据集相同的类别比例。
模型训练过程的所有步骤,包括模型选择,特征选择等都是在单个折叠 fold 中独立执行的。
还有一种比较特殊的交叉验证方式,Bootstrapping: 通过自助采样法,即在含有 m 个样本的数据集中,每次随机挑选一个样本,再放回到数据集中,再随机挑选一个样本,这样有放回地进行抽样 m 次,组成了新的数据集作为训练集。
这里会有重复多次的样本,也会有一次都没有出现的样本,原数据集中大概有 36.8% 的样本不会出现在新组数据集中。
优点是训练集的样本总数和原数据集一样都是 m,并且仍有约 1/3 的数据不被训练而可以作为测试集。
缺点是这样产生的训练集的数据分布和原数据集的不一样了,会引入估计偏差。
此种方法不是很常用,除非数据量真的很少。
https://blog.csdn.net/aliceyangxi1987/article/details/73532651
线性回归
目标函数的由来
说白了,线性回归和逻辑回归,不都是已经结果,回归参数吗?所以一开始都是找似然函数,通过似然函数,推导目标函数,然后再优化目标函数~
首先得到误差的概率质量函数(高斯正态分布),转换求似然函数最大(y固定已知了,估计w权重(更改权重)使得wx接近于y的概率),然后把m个不同样本的P相乘,再转换log似然函数,发现最小,似然函数就最大,因此得到了成本函数。
再说几句梯度下降的直观理解,就是通过不断求梯度,在梯度方向上更新w,使得成本函数J最小。
逻辑回归(LR分类 0-1 sigmod分类)
首先逻辑回归是01分类问题
他的成本函数和线性回归的是一样的道理,主要注意的是刚开始P是怎么得到的,也就是已知y=1是对w进行估计(更新)使得估计值y’就是概率值,已知y=0是对w进行估计(更新),使得1-估计值y’就是概率值,然后相互相乘结合。
从log似然函数中得到。
逻辑回归与朴素贝叶斯有什么区别?(判别模型VS生成模型)
有监督机器学习方法可以分为生成方法和判别方法(常见的生成方法有LDA主题模型、朴素贝叶斯算法和隐式马尔科夫模型等,常见的判别方法有SVM、LR等),生成方法学习出的是生成模型,判别方法学习出的是判别模型。
首先逻辑回归,说白了,就是一个交叉熵损失函数,然后梯度下降。
1) 朴素贝叶斯是生成模型, 逻辑回归是判别模型, 所以生成和判别的所有区别它们都有。
- Naive Bayes是一个生成模型,在计算P(y|x)之前,先要从训练数据中计算P(x|y)和P(y)的概率(贝叶斯)
- Logistic Regression是一个判别模型,它通过在训练数据集上最大化判别函数(最大似然)P(y|x),不需要知道P(x|y)和P(y)。
2) 朴素贝叶斯属于贝叶斯, 逻辑回归是最大似然, 两种概率哲学间的区别。
3) 朴素贝叶斯需要独立假设。
4) 逻辑回归需要求特征参数间是线性的。
LDA线性判别分析
一种经典的有监督的降维方法,还可以用于分类。
主要思想:将n维的数据,最多投影到 c-1 维(总共 c 类),使得投影后的类间方差最大,类内方差最小。
主要步骤:
- 类间散度Sb
- 类内散度Sw
- Sw(-1)Sb的记录最大的d个特征值对应的特征向量W,因为特征值越大,变换后的幅度变换越大,方向上元素的差异也越大。
- Wt*x就是输出的样本
PCA算法
https://blog.csdn.net/dongyanwen6036/article/details/78311071
可以看出来PCA是一种线性变化,通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量。
PCA主要是从特征的协方差角度,去找到比较好的投影方式,即投影到具有最大方差的方向(这样信噪比最大);
从图可看出, u1比u2好, 为什么呢? 有以下两个主要评价指标:
1) 样本点到这个直线的距离足够近。
2) 样本点在这个直线上的投影能尽可能的分开。
如果我们需要降维的目标维数是其他任意维, 则:
1) 样本点到这个超平面的距离足够近。
2) 样本点在这个超平面上的投影能尽可能的分开
从上面的图也能看出来,和LDA就是特征分解的的时候不一样,LDA是考虑了类内方差和类间方差等类别标签信息,所以投影到了分类性能最好的方向,而PCA只是根据样本的特征,投影到了样本特征方差最大的方向(前面说过,方差越大,可区分性越好,但这里是盲目的做了可区分,因为标签都没得)
KPCA 与 PCA 的区别?
k指的是kernel,应用 PCA 算法的前提是假设存在一个线性的超平面, 进而投影。 那如果数据不是线性的呢? 该怎么办? 这时候就需要 KPCA,数据集从 n 维映射到线性可分的高维 N ,然后再从 N维降维到一个低维度 n' N>n>n'
LDA与PCA区别
https://blog.csdn.net/dongyanwen6036/article/details/78311071
上图左侧是PCA的降维思想,它所作的只是将整组数据整体映射到最方便表示这组数据的坐标轴上,映射时没有利用任何数据内部的分类信息。因此,虽然PCA后的数据在表示上更加方便(降低了维数并能最大限度的保持原有信息),但在分类上也许会变得更加困难;上图右侧是LDA的降维思想,可以看到LDA充分利用了数据的分类信息,将两组数据映射到了另外一个坐标轴上,使得数据更易区分了(在低维上就可以区分,减少了运算量)。
决策树与随机森林
熵(信息熵)
表示的是混乱程度,混乱程度越大,熵越大。
log 2省略了
当p=0.5时,H(p)=1,此时随机变量的不确定性最大
条件熵
乘以了发生的概率,比如判断西瓜的好坏,特征里面有一个特征是色泽(绿,黑,白)。如何求色泽对于好坏瓜的条件熵呢?
黑的里面,好瓜有4个,坏瓜有2个,所以色泽里黑的熵为下面的0.918
然后色泽里乌黑的瓜6/17,所以乌黑的信息熵(针对好坏瓜而言)是0.918,乌黑(针对好坏瓜而言)条件熵为6/17*0.918
信息增益 ID3
表示特征X使得类Y的不确定性减少的程度。
(分类后的专一性,希望分类后的结果是同类在一起)
色泽的信息增益(针对结果:好坏瓜) = 原始好坏瓜的信息熵 - 色泽的条件熵(针对结果:好坏瓜)
表示加入色泽后使得好坏瓜的不确定性减少了多少
信息增益率 C4.5
单独使用信息增益作为评估的话,会偏近于取值分类多的特征,作为根节点,比如ID,每一个样本一个ID。
所以诞生了信息增益率
Gain_Ratio(D,a) = Gain(D,a) / IV(a)
IV(a)表示的是不再是以针对原本结果好坏瓜的熵,而是针对a为结果目标的熵,比如说是色泽,我们把色泽看成是最终的分类结果,得到色泽的信息熵 (里面的概率就是乌黑所占的比例)
这样一来,如果还是以ID的话,ID本身的熵是很大的,除以她Gain_Ratio(D,a)就变小了。
Gain_Ratio(D,a),偏近于取值分类少的特征,作为根节点
结合信息增益和信息增益率
Gain(D,a) , 偏近于取值分类多的特征,作为根节点
Gain_Ratio(D,a),偏近于取值分类少的特征,作为根节点
所以一般是先用Gain选出超过平均的,然后再用Gain_Ratio(D,a)判断。结合两个的优势
基尼系数 CART
预裁剪
一边训练,一边裁剪,优点是速度快,不容易导致过拟合,但是相对于后裁剪而言,容易造成欠拟合
预备裁剪是提前停止的意思,比如限制深度,叶子节点个数,叶子节点样本数,信息增益量等
后裁剪
全部训练完后,从底向上一次裁剪,是对所有的非叶子节点进行运算,看是否要把当前的非叶子节点变成叶子结点。
C是基尼系数
下面的图中,一个节点下面有三个叶子结点,然后依次求出,比较。
随机森林(bagging是将多个模型的预测结果简单地加权平均或者投票。)、
随机:数据采样随机(去燥),特征选择随机(去争议的特征)
数据随机,是指不同的树采样了0.6(比如)的总数据。
森林:多棵树并行处理。
- 重复K次
- 有放回地重复抽样建模
- 训练子模型
2.模型融合
- 分类问题:voting
- 回归问题:average
Bagging算法不用我们自己实现,随机森林就是基于Bagging算法的一个典型例子,采用的基分类器是决策树。R和python都集成好了,直接调用。
gbdt
内容在xgboost里面,只不过是利用的泰勒级数展开的是一阶项,且没有正则项,每次使用的是全部的样本,全部的特征,这样构造出目标函数之后,利用梯度下降法,求目标函数的最小。
xgboost
可以分类,可以回归,例如分类问题中用 cross entropy,回归问题用 mean squared error。
应用的是Gradient boosting算法 就是通过加入新的弱学习器,来努力纠正前面所有弱学习器的残差,最终这样多个学习器相加在一起用来进行最终预测,准确率就会比单独的一个要高。之所以称为 Gradient,是因为在添加新模型时使用了梯度下降算法来最小化的损失。
那么不断集成弱分类器最后得到强的,如何保证这一点呢?
通过目标函数的设计:
以均方差+惩罚项(以树为例)为目标函数,把前t-1个模型构成的结果固定住,通过调整新加进来的模型,使得目标函数变小,这样就导致了越来越好了!
我们看到这里还是不能把前面t-1个模型构成的结果固定住,需要利用下图中的泰勒级数展开,就可以了。
最后就是使目标函数最小的问题了,这里用的是梯度下降的方式。
xgboost的剪枝:
XGBoost 采用的是后剪枝的策略,建每棵树的时候会一直分裂到指定的最大深度(max_depth),然后递归地从叶结点向上进行剪枝,对之前每个分裂进行考察,如果该分裂之后的 Gain⩽0,则咔咔掉。
传统 GBDT 在损失不再减少时会停止分裂,这是一种预剪枝的贪心策略,容易欠拟合。XGBoost采用的是后剪枝的策略,先分裂到指定的最大深度 (max_depth) 再进行剪枝。而且和一般的后剪枝不同, XGBoost 的后剪枝是不需要验证集的。 不过我并不觉得这是“纯粹”的后剪枝,因为一般还是要预先限制最大深度的呵呵。
特征缺失处理:
对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向
XGBoost 添加了对稀疏数据的支持,在计算分裂增益时不会考虑带有缺失值的样本,这样就减少了时间开销。在分裂点确定了之后,将带有缺失值的样本分别放在左子树和右子树,比较两者分裂增益,选择增益较大的那一边作为默认分裂方向。
xgboost与GBDT的区别
adaBoost
通过多分类器,按照分类器的精度作为权重,最后做决定。后面的分类器是由前面的分类器分错的样本增大权重,新生成的分类器,具体的公式就不摆了。
stacking
https://zhuanlan.zhihu.com/p/25836678(模型融合好文)
https://www.cnblogs.com/gczr/p/7144508.html
https://www.leiphone.com/news/201709/zYIOJqMzR0mJARzj.html
http://www.zhongruitech.com/228422191.html
如果把Bagging看作是多个基分类器的线性组合,那么Stacking就是多个基分类器的非线性组合。Stacking可以很灵活,它可以将学习器一层一层地堆砌起来。总体感觉就是,比如第一层有三个模型 m1,m2,m3,利用5-fold验证方法,相当于总共跑15次训练和预测,第一层就得到了三个模型对于trian的预测和对于test的预测,然后将这个分别作为第二层输入和预测的输入。
RF模型和XGB模型一样,再来一次。这样就生成了2份train数据和2份test数据(XGB重新表达的数据和RF重新表达的数据),然后用LR模型,进一步做融合,得到最终的预测结果。注意:上图最后的label应该是最终的预测的结果。
对于每一轮的 5-fold,Model 1都要做满5次的训练和预测。
Titanic 栗子:
Train Data有890行。(请对应图中的上层部分)
每1次的fold,都会生成 713行 小train, 178行 小test。我们用Model 1来训练 713行的小train,然后预测 178行 小test。预测的结果是长度为 178 的预测值。
这样的动作走5次! 长度为178 的预测值 X 5 = 890 预测值,刚好和Train data长度吻合。这个890预测值是Model 1产生的,我们先存着,因为,一会让它将是第二层模型的训练来源。
重点:这一步产生的预测值我们可以转成 890 X 1 (890 行,1列),记作 P1 (大写P)
接着说 Test Data 有 418 行。(请对应图中的下层部分,对对对,绿绿的那些框框)
每1次的fold,713行 小train训练出来的Model 1要去预测我们全部的Test Data(全部!因为Test Data没有加入5-fold,所以每次都是全部!)。此时,Model 1的预测结果是长度为418的预测值。
这样的动作走5次!我们可以得到一个 5 X 418 的预测值矩阵。然后我们根据行来就平均值,最后得到一个 1 X 418 的平均预测值。
重点:这一步产生的预测值我们可以转成 418 X 1 (418行,1列),记作 p1 (小写p)
走到这里,你的第一层的Model 1完成了它的使命。
第一层还会有其他Model的,比如Model 2,同样的走一遍, 我们有可以得到 890 X 1 (P2) 和 418 X 1 (p2) 列预测值。
这样吧,假设你第一层有3个模型,这样你就会得到:
来自5-fold的预测值矩阵 890 X 3,(P1,P2, P3) 和 来自Test Data预测值矩阵 418 X 3, (p1, p2, p3)。
-----------------------------------------
到第二层了..................
来自5-fold的预测值矩阵 890 X 3 作为你的Train Data,训练第二层的模型
来自Test Data预测值矩阵 418 X 3 就是你的Test Data,用训练好的模型来预测他们吧。
---------------------------------------
最后 ,放出一张Python的Code,在网上为数不多的stacking内容里, 这个几行的code你也早就看过了吧,我之前一直卡在这里,现在加上一点点注解,希望对你有帮助:
为什嚒stacking能提高精度?
可以这么理解,原本的多个模型训练的精度已经到达了一个程度,上不去了。几个模型的精度达到了上限,从原始数据到target已经很困难了,无法在提高了,那我们就不训练原始数据了,直接从上一个模型的输出的直接去拟合target。就是这么作弊的一个东西。
ROC与PR
ROC与PR的区别
首先,概念上PR的xy轴分别是查准率与查全率。
- 查准率
- 查全率
ROC曲线的xy轴分别是真正率和假正率。ROC研究学习器的泛化性能。
真正率 TPR 预测正确是正例/所有正例
假正率 FPR 预测错误是正例,其实是负例/所有负例
ROC曲线有助于比较不同分类器的相对性能,当FPR小于0.36时M1浩宇M2,而大于0.36是M2较好。
ROC曲线小猫的面积为AUC(area under curve),其面积越大则分类的性能越好,理想的分类器auc=1。
至于绘制ROC与PR的曲线都是针对0-1上设置阈值,以此判定正负,然后得到的点,构成的线。
怎么确定用哪一个?
其实,两者主要的差别在于样本不均衡的时候,以及样本类别重要程度不同的角度。
ROC曲线对于样本不均衡的问题,不敏感,均不均衡他都那样,但是PR曲线就很敏感。
所以可以看出如果你的数据是,不均衡的等权重的数据,那肯定是要ROC曲线。
如果你的数据是不均衡的不等权重的数据里面的一部分,比如说欺诈数据,正例是欺诈,负例是没欺诈,正例很重要,但是很少,负例不重要,但是很多,像这种,用PR曲线合适,这时候要的是对于欺诈的敏感。
下面节选自:What is the difference between a ROC curve and a precision-recall curve? When should I use each?
Particularly, if true negative is not much valuable to the problem, or negative examples are abundant. Then, PR-curve is typically more appropriate. For example, if the class is highly imbalanced and positive samples are very rare, then use PR-curve. One example may be fraud detection, where non-fraud sample may be 10000 and fraud sample may be below 100.
In other cases, ROC curve will be more helpful.
PR曲线适用于:
- TN,正确预测为负例,不重要的时候。
- 负样本特别多的时候且不重要,正样本很少,而且很重要,样本不均衡
比如说在诈骗交易的检测中,大部分没有欺诈(负样本)的,但是少量欺诈(正样本)确很重要。
Let’s take an example of fraud detection problem where there are 100 frauds out of 2 million samples.
Algorithm 1: 90 relevant out of 100 identified TP=90 FP=10 TN=1,999,090 FN=10
Algorithm 2: 90 relevant out of 1000 identified TP=90 FP=910 TN=1,998,990 FN=10
Evidently, algorithm 1 is more preferable because it identified less number of false positive.
In the context of ROC curve,
Algorithm 1: TPR=90/100=0.9, FPR= 10/1,999,900=0.00000500025
Algorithm 2: TPR=90/100=0.9, FPR=910/1,999,900=0.00045502275
The FPR difference is 0.0004500225
For PR, Curve
Algorithm 1: precision=0.9, recall=0.9
Algorithm 2: Precision=90/1000=0.09, recall= 0.9
Precision difference= 0.81
可以看到在正样本非常少的情况下,PR表现的效果会更好。
ROC曲线:
- 除去以上,其他的适用于ROC曲线。
ROC曲线有个很好的特性:当测试集中的正负样本的分布变换的时候,ROC曲线能够保持不变。在实际的数据集中经常会出现样本类不平衡,即正负样本比例差距较大,而且测试数据中的正负样本也可能随着时间变化。下图是ROC曲线和Presision-Recall曲线的对比:
在上图中,(a)和(c)为Roc曲线,(b)和(d)为Precision-Recall曲线。
(a)和(b)展示的是分类其在原始测试集(正负样本分布平衡)的结果,(c)(d)是将测试集中负样本的数量增加到原来的10倍后,分类器的结果,可以明显的看出,ROC曲线基本保持原貌,而Precision-Recall曲线变化较大。
https://blog.csdn.net/taoyanqi8932/article/details/54409314
http://news.moore.ren/industry/27714.htm
聚类和降维的区别与联系
聚类 事先不知道样本的属性范围,只能凭借样本在特征空间的分布来分析样本的属性。聚类是针对的数据点,看哪些数据点,在特定距离上离得比较近,分为一类。
这种问题一般更复杂。而常用的算法包括 k-means (K-均值), GMM (高斯混合模型) 等。
降维 是机器学习另一个重要的领域, 降维有很多重要的应用, 特征的维数过高, 会增加训练的负担与存储空间, 降维就是希望去除特征的冗余, 用更加少的维数来表示特征.降维算法最基础的就是PCA了, 后面的很多算法都是以PCA为基础演化而来。