05-03 主成分分析(PCA)

摘要:
目录主成分分析(PCA)I、维度灾难和维度缩减II、主成分分析学习目标III、,主成分分析细节3.1主成分分析的两个条件3.2基于最近重建的PCA推导2.1主成分分析目标函数3.2.2主成分分析目的函数优化3.3基于最大可分性的PCA推导4核心主成分分析(KPCA)IV主成分分析过程4.1输入4.2输出4.3过程V主成分分析优点和缺点5.1优点和缺点5.2缺点6.摘要更新,更完整的机器学习更新网站,更多pyth

目录

更新、更全的《机器学习》的更新网站,更有python、go、数据结构与算法、爬虫、人工智能教学等着你:https://www.cnblogs.com/nickchen121/p/11686958.html 主成分分析(PCA) 一、维数灾难和降维

在KNN算法中曾讲到,对于高维数据,会出现数据样本稀疏、距离计算困难等问题。但是这种问题并不是仅仅针对KNN算法,只是在KNN算法中这种问题会被放大,而其他的机器学习算法也会因为高维数据对训练模型造成极大的障碍,这种问题一般被称为维数灾难(curse of dimensionality)。

解决维数灾难最常用的方法是降维(dimension reduction),即通过某种数学变换将原始高维特征空间转变为一个低维子空间,在这个子空间中样本密度大幅提高,距离计算也变得更容易。

# 维数灾难和降维图例
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
from sklearn.decomposition import PCA
%matplotlib inline
font = FontProperties(fname='/Library/Fonts/Heiti.ttc')

np.random.seed(0)
X = np.empty((100, 2))
X[:, 0] = np.random.uniform(0, 100, size=100)
X[:, 1] = 0.75 * X[:, 0] + 3. + np.random.normal(0, 10, size=100)
pca = PCA(n_components=1)
X_reduction = pca.fit_transform(X)
X_restore = pca.inverse_transform(X_reduction)

plt.scatter(X[:, 0], X[:, 1], color='g', label='原始数据')
plt.scatter(X_restore[:, 0], X_restore[:, 1],
            color='r', label='降维后的数据')
plt.annotate(s='',xytext=(40,60),xy=(65,30),arrowprops=dict(arrowstyle='-',color='b',linewidth=5))
plt.legend(prop=font)
plt.show()

png

如上图所示,绿点即原始高维空间中的样本点,红点即我们降维后的样本点。由于图中的高维是二维,低维是一维,所以样本在低维空间是一条直线。

接下来我们的目标就是聊一聊如何做到把高维空间样本点映射到低维空间,即各种降维算法。

二、主成分分析学习目标
  1. 维数灾难和降维
  2. 主成分分析两个条件
  3. 基于主成分分析两个条件推导主成分分析
  4. 核主成分分析
  5. 主成分分析优缺点
三、主成分分析详解

主成分分析(principal component analysis,PCA)是最常用的一种降维方法,我们已经利用“维数灾难和降维图例”解释了降维的过程,PCA的降维过程则是尽可能的使用数据最主要的特征来代表数据原有的所有特征。但是有没有同学想过为什么使用PCA降维是上图的红点组成的线而不是蓝线呢?这里就需要说到我们PCA的两个条件了。

3.1 主成分分析两个条件

对于“维数灾难和降维图例”中的红线和蓝线我们可以把它看成一个超平面(S),理论上红线和蓝线构成的超平面都可以做到对样本特征的降维,但是一般我们希望这种能够做到降维的超平面满足以下两个条件

  1. 最近重构性:样本点到这个超平面的距离都足够近
  2. 最大可分性:样本点到这个超平面上的投影尽可能分开

基于最近重构性和最大可分性,就可以得到主成分分析的两种等价推导。

3.2 基于最近重构性推导PCA

3.2.1 主成分分析目标函数

我们首先从最近重构性推导PCA,即样本点到这个超平面的距离足够近。

假设(m)(n)维数据((x^{(1)},x^{(2)},cdots,x^{(m)}))都已经进行了中心化,即(sum_{i=1}^mx^{(i)}=0);在假设投影变换后得到的新坐标系为({w_1,w_2,cdots,w_n}),其中(w_i)是标准正交基向量,即(||w_i||=1,w_i^Tw_j=0),其中(i eq{j})

如果把数据从(n)维降到(n')维,即丢弃新坐标系中的部分坐标,则新的坐标系为({w_1,w_2,cdots,w_{n'}}),则样本点(x^{(i)})(n')维坐标系中的投影为

[z_{i} = (z_{i1},z_{i2},cdots,z_{id'})^T ]

其中(z_{ij}=w_j^Tx_i),是(x_i)在低维坐标系下第(j)维的坐标。

如果我们用(z^{(i)})重构(x^{(i)}),则可以恢复的原始数据为

[hat{x_i}=sum_{j=1}^{d'}z_{ij}w_j ]

现在考虑整个样本集,既可以获得原样本点(x_i)到基于投影重构的样本点(hat{x_i})之间的距离为

[egin{align} sum_{i=1}^m{||hat{x_i}-x_i||}^2 & = sum_{i=1}^m{||Wz_i-x_i||}^2 \ & = sum_{i=1}^m(Wz_i)^T(Wz_i)-2sum_{i=1}^m(Wz_i)^Tx_i+sum_{i=1}^mx_i^Tx_i \ & = sum_{i=1}^mz_i^Tz_i - 2sum_{i=1}^mz_i^TW^Tx_i+sum_{i=1}^mx_i^Tx_i \ & = sum_{i=1}^mz_i^Tz_i-2sum_{i=1}^mz_i^Tz_i+sum_{i=1}^mx_i^Tx_i \ & = -sum_{i=1}^mz_i^Tz_i + sum_{i=1}^mx_i^Tx_i \ & = -tr(W^T(sum_{i=1}^mx_ix_i^T)W)+sum_{i=1}^mx_i^Tx_i \ & = -tr(W^TXX^TW)+sum_{i=1}^mx_i^Tx_i end{align} ]

由于涉及过多矩阵推导,此处不多赘述,看不懂的可以跳过。

其中(W=(w_1,w_2,cdots,w_d)),其中(sum_{i=1}^mx_i^Tx_i)是数据集的协方差矩阵,(W)的每一个向量(w_j)是标准正交基,而(sum_{i=1}^mx_i^Tx_i)是一个常量,最小化上式等价于

[egin{align} & underbrace{min}_W\,-tr(W^TXX^TW) \ & s.t.\,W^TW=I end{align} ]

3.2.2 主成分分析目标函数优化

主成分分析目标函数为

[egin{align} & underbrace{min}_W\,-tr(W^TXX^TW) \ & s.t.\,W^TW=I end{align} ]

最小化该目标函数其实并不难,可以发现最小化目标函数对应的(W)由协方差矩阵(XX^T)最大的(n')个特征值对应的特征向量组成,利用拉格朗日乘子法可得

[J(W)=-tr(W^TXX^TW+lambda_i(W^TW-I)) ]

(W)求导等于0即可得

[egin{align} & -XX^TW+lambda{W}=0 \ & XX^TW = lambda{W} end{align} ]

从上式可以看出,(W)(XX^T)(n')个特征向量组成的矩阵,而(lambda)有若干个特征值组成的矩阵,特征值在对角线上,其余位置为0。当我们将数据集从(n)维降到(n')维时,需要找到最大的(n')个特征值对应的特征向量。这个(n')个特征向量组成的矩阵(W)即我们需要的矩阵。对于原始数据集,我们只需要用(z_i=W^Tx_i),就可以把原始数据集降到最小投影距离的(n')维数据集。

3.3 基于最大可分性推导PCA

从最大可分性出发,样本点(x_i)在新空间中超平面的投影是(W^Tx_i),如果所有样本点的投影尽可能分开,则应该使投影后样本点的方差最大化。

投影后样本点的方差是(sum_{i=1}^mW^Tx_ix_i^TW),因此目标函数可以写成

[egin{align} & underbrace{max}_W\,-tr(W^TXX^TW) \ & s.t.\,W^TW=I end{align} ]

上式其实和基于最近重构性推导PCA的目标函数其实差不多,其中一个是加负号的最小化,一个是最大化。
对基于最大可分性推导得到的目标函数最大化,利用拉格朗日乘子法可以得到

[XX^TW = -lambda{W} ]

3.4 核主成分分析(KPCA)

PCA中,我们假设存在一个线性的超平面,可以对数据投影,但工业上大多数时候数据都是线性不可分的,这里就需要用到和核SVM一样的思想,即核主成分分析(kernelized PCA,KPCA),是基于核技巧对非线性可分数据进行降维。

KPCA首先会把数据从(n)维映射到更高的(N)维,让数据线性可分后又会把数据映射回低维(n'),即(n'<n<N)

假设我们将在高维特征空间把数据投影到由(W=(w_1,w_2,cdots,w_d))确定的超平面上,则(W)

[ZZ^TW = (sum_{i=1}^mz_iz_i^T)W=lambda{W} ]

其中(z_i)是样本点再高维特征空间中的像,即特征分解问题变为

[egin{align} W & = {frac{1}{lambda}}(sum_{i=1}^mz_iz_i^T)W \ & = sum_{i=1}^mz_i{frac{z_i^TW}{lambda}} \ & = sum_{i=1}^mz_ialpha_i^j end{align} ]

其中(a_i^j={frac{1}{lambda}}z_i^TW)(alpha_i)的第(j)个分量。

假设(z_i)是由原始样本点(x_i)通过映射(phi)产生,即(z_i=phi(x_i)),则特征分解问题变为

[(sum_{i=1}^mphi(x_i)phi(x_i)^T)W = lambda{W} ]

(W)变为

[W=sum_{i=1}^mphi(x_i)alpha_i^j ]

由于我们并不知道(phi)是什么,一般情况下(phi)不需要显示计算,通过核函数转换即可。因此引入核函数

[k(x_i,x_j)=phi(x_i)^Tphi(x_j) ]

将核函数和(w_j)代入特征分解问题,可得

[Kalpha^j=lambdaalpha^j ]

其中(K)(k)对应的核矩阵,对于上述特征值分解问题,去(K)最大的(d')个特征值对应的特征向量即可。

对于新样本(x),他投影后的第(jquad(j=1,2,cdots,d'))维坐标为

[egin{align} z_j & = W^Tphi(x) \ & = sum_{i=1}^malpha_i^jphi(x_i)^Tphi(x) \ & = sum_{i=1}^malpha_i^jk(x_i,x) end{align} ]

从上述特征分解可以看出,KPCA需要对所有样本求和,因此它的计算开销较大。

四、主成分分析流程

4.1 输入

样本集(D={x_1,x_2,cdots,x_n});低维空间维数(n')

4.2 输出

降维后的样本集(D')

4.3 流程

  1. 对所有样本进行中心化:(x_ileftarrow{x_i}-{frac{1}{m}}sum_{i=1}^m{x_i})
  2. 计算样本的协方差矩阵(XX^T)
  3. 对协方差矩阵(XX^T)做特征值分解
  4. 取最大的(n')个特征值所对应的特征向量((w_1,w_2,cdots,w_{n'})),将所有的特征向量标准化后,组成特征向量矩阵(W)
  5. 对样本集中的每一个样本(x^{(i)}),转化为新的样本(z^{(i)}=W^Tx^{(i)})
  6. 得到输出样本集(n'=(z^{(1)},z^{(2)},cdots,z^{(m)}))

降维后低维空间的维数(n')通常是用户事先指定的,一般选择使用交叉验证的方法选择最好的(n')值。对于PCA,有时候也会从重构的角度指定一个降维到的主成分比重阈值(t),这个阈值的范围一般是((0,1]),然后选取使下式成立的最小(n')

[{frac{sum_{i=1}^{n'}lambda_i}{sum_{i=1}^{n}lambda_i}}geq{t} ]
五、主成分分析优缺点

5.1 优点

  1. 只需要以方差衡量信息量,不受数据集以外的因素影响
  2. 主要计算是特征值分解,计算简单,易于实现

5.2 缺点

  1. 主成分由于是降维得到,没有原始样本那样较强的解释性
  2. 由于PCA降维会丢掉不少的信息,可能对后续的数据处理有影响
六、小结

PCA作为一个无监督学习的降维方法,只需要对特征值分解,就可以压缩数据,对数据去噪声。但是PCA还是有不少缺点的,针对PCA的缺点,也出现了很多PCA的变种,如解决非线性数据降维的KPCA;解决内存限制的增量的Incremental PCA;解决稀疏数据降维的Sparse PCA等。

由于PCA涉及过多的数学公式,以及有着较强逻辑和空间处理。如果不是很懂可以结合代码然后多看几遍。

免责声明:文章转载自《05-03 主成分分析(PCA)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Qt之QCryptographicHash安装特定版本的OpenSSL下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

c# lambda distinct

在写程序的时候会遇见这样的问题,那就是去重,有什么方法更快呢。当去重时,首先想到的是自己写代码,代码大概如下: private static void distinctListIntTest() { Console.WriteLine("未去重"); List<int> li...

Java之lambda表达式

一、lambda表达式的写法 packagetest; //构造线程的两种方式:1、实现Runnable接口 2、继承Thread类 public classTest14 { public static voidmain(String[] args) { Thread thread = new Thread(newMyThrea...

python tkinter 学生信息管理系统

使用tkinter模块,python3.6,主要功能有添加,查询,删除,修改学生信息 使用模版: 1 from tkinter import * 2 import tkinter.font as tkFont 3 import tkinter as tk 4 from tkinter import ttk 最主要也是最难做的是,实现不同功能的界面在同一TK...

xgboost和gbdt区别

1. xgboost在目标函数中加入了正则化项,当正则化项为0时与传统的GDBT的目标函数相同2. xgboost在迭代优化的时候使用了目标函数的泰勒展开的二阶近似,paper中说能加快优化的过程!!xgboost可自定义目标函数,但是目标函数必须二阶可导也是因为这个。GDBT中只用了一阶导数。3. xgboost寻找最佳分割点时,考虑到传统贪心法效率比...

Java 8:掌握 Lambda 表达式

本文将介绍 Java 8 新增的 Lambda 表达式,包括 Lambda 表达式的常见用法以及方法引用的用法,并对 Lambda 表达式的原理进行分析,最后对 Lambda 表达式的优缺点进行一个总结。 ​ 1. 概述 Java 8 引入的 Lambda 表达式的主要作用就是简化部分匿名内部类的写法。 能够使用 Lambda 表达式的一个重要依据是必须...

Lambda 表达式

目录 Lambda 表达式 1. 为何需要 Lambda 表达式 2. Lambda 表达式作用 3. Java Lambda 概要 4. Lambda 表达式作用 5. Java Lamdba 基本语法 6. Java Lambda 示例 8. Java Lambda 结构 大例子 外部迭代 内部迭代 使用 Lambda 表达式 更近一步 方...