降维
将样本从d维降为d'维。有时候样本维度太大,计算量很大,通过降维的方式,可以减小计算量(但会保持样本间的相对距离不变)。
降维方式
给定输入X维度为d维,即Xi={x1,x2,...,xd},先要对X进行降维,使得它的维度变为d'维。假设样本数数为m,即将d*m的矩阵X(每列是一个数据点)转化为d'*m的矩阵:
可以推出 , 所以我们的目标就是构造出一个d*d'的矩阵W。W由X所在空间的d'个向量组成。
主成分分析方法
PCA(Principal Component Analysis)
。我们在输入X所在空间找到d'个正交向量,这些正交向量构成一个超平面。
把样本点Xi投影到超平面上得到投影点Zi
什么样的投影超平面是PCA想要的呢?显然是:
- 最大重构性:样本点到这个超平面的距离都足够近
- 最大可分性:样本点在这个超平面上的投影尽可能分开。(即方差越大越好)
Example
对于下图,原输入为 2维,现希望将其降维成1维,即投影到一条直线上。
图中给出的两条直线及样本点在其上的投影,并计算出方差,可知红色直线上的投影点方差更大,所以我们选择红色线作为我们的投影面。
PCA算法流程
样本集D={X1,X2,...,Xd} , 低维空间维数d'
- 对所有样本点去中心化:
- 求样本的协方差矩阵:
- 对协方差矩阵
做特征值分解
- 取最大的d'个特征值所对应的特征向量
- 输出
数学原理
首先方差计算式为:
将样本去中心化(均值=0),投影到超平面后,方差为:
所以我们的优化目标为
采用拉格朗日算子法可得
只需对协方差矩阵 进行特征值分解,并将求得的特征值排序:
,再取前d'个特征值对应的特征向量构成
,这就是主成分分析的解。
code
- PCA的sklearn调用
from sklearn.decomposition import PCA
###PCA开始
####自己定义rawdata
pca = PCA(n_components=1)#将数据降维
X_r = pca.fit_transform(rawdata)#得到降维的结果
plt.figure()
plt.scatter(X_r,[1.0]*len(X_r))