主成分分析(PCA)是一种对数据进行降维,并尽可能保留更多信息的方法。在PCA中,衡量信息的多少的指标是变量的 “分散” 程度。例如,考虑以下数据:
X轴上的分散程度远远大于Y轴上的,因此我们认为X轴上蕴含的信息比Y轴上要多。而为了衡量数据在某个轴上的分散程度,一个自然的想法是求出数据在该轴上的方差。而PCA的思想,就是建立一个新的 维坐标系,使得在新坐标系各坐标轴上数据的方差尽量大。
数学推导
设有一列数据 ,那么问题转化为,求出一个单位向量 ,使得这些数据在这个向量方向上的投影长度的方差最大。由于 是单位向量, 在 方向上投影的长度就是 。 因此可以列式如下:
其中涉及到 ,为了计算方便,不妨对 进行去中心化: 。则式子变成下面的形式:
其中, 是 的协方差矩阵,不妨记作 ,则问题转化为在 的条件下,求 的最大值。因此使用拉格朗日乘子法,列出拉格朗日方程如下:
求出偏导数并使其为 :
因此:
不难发现, 就是 的特征向量,而 就是对应的特征值。带回到方差算式中: ,因此对 作特征值分解后,取前 大的特征值对应的特征向量,由于 是对称的矩阵,因此特征向量间相互正交,那么将数据投影到这些向量的方向上就完成了PCA的过程。
numpy实现
import numpy as np
def PCA(data):
data = data - data.mean(axis = 1, keepdims = True)
C = np.dot(data,data.T)
u,v,d = np.linalg.svd(C)
return np.dot(u[:,:k].T, data)
Comments NOTHING