文章目录
- 前置知识
- PCA
- 均值和协方差
- 均值
- 协方差矩阵
- 主成分分析
- 变量代换
- 多维数据的降维
- 算法步骤
- 代码实现
- 特征值分解
- 奇异值分解
前置知识
- 二次型
- 对角化
- 奇异值分解
- 施密特正交化
PCA
主成分分析是一种从原始数据中消除冗余信息,只需要一个或者几个属性合成的属性就可以提供大部分信息的方法。大概过程是找出一个特殊的线性组合,给要分析的元素赋予一个权值,综合得到一个新的数据。
假设每一个样本有p个属性,一共有n个样本,那么这些向量可以构成一个的矩阵,称为观测矩阵。
主成分分析实际上相当于变换坐标轴,并降低维度。
如一个二维数据集如下图:
经过PCA进行降维之后可以使用一个维度进行表示,如下图
均值和协方差
均值
令为一个观测矩阵,则其样本平均值M为:
令
则新矩阵
具有零样本均值,这种矩阵
被称为
平均偏差形式
协方差矩阵
协方差矩阵是一个的矩阵,其定义为
由于任何具有形式的矩阵都是半正定的,所以也是半正定的。
PS: 虽然协方差矩阵是半正定矩阵,但是由于计算误差,算出来的特征值可能是负数。
其中的对角线元素称为的方差。方差用来度量的分散性。
数据的总方差被称为矩阵的迹,即的对角线元素之和,记做
中的元素称为和的协方差。若协方差为0,则称和是无关的。当协方差矩阵是对角阵或几乎是对角阵时,中多变量分析可以简化。
主成分分析
变量代换
设矩阵已经称为平均偏差形式,主成分分析的目标是找到一个的正交矩阵,确定一个变量代换,或
满足新的变量两两无关,并保证整理后的方差具有递减顺序。
变量正交变换说明,每一个观测向量得到一个新”名称“,即是以为基的坐标。
易得对任何正交矩阵,的协方差是,于是可以构造符合要求的P。设是对角矩阵且的特征值在的对角线上,重新整理使得即
找到正交矩阵,它的列对应单位特征向量,且有。
协方差矩阵的单位特征向量称为(观测矩阵中)数据的主成分。第一主成分是中最大特征值对应的特征向量,第二主成分以此类推。
设为中的元素,第一主成分可以通过公式来确定新变量,可以看出是原变量的线性组合。通过同样的方式,可以确定等。
通过这种方式,可以将变量进行代换,但是优点并不明显。但是如果在对角矩阵中,前个方差和比其他方差大得多,那么我们就可以近似的把数据当成维数据而不是维的。
多维数据的降维
选取一个重构阈值,选取使得下式成立的最小值
PCA仅需保留
和样本均值
即可将新样本投影到低维空间。转换过程不可避免的造成数据的损失,但是舍弃这部分信息往往是必要的。一方面降维之后可以使样本的采样密度增大,这也是降维的主要动机,其次可以在一定程度上起到降噪的效果,因为最小的特征值对应的特征向量往往与噪声有关。
算法步骤
input
样本集,重构阈值
process
- 进行去中心化,得到矩阵
- 计算样本的协方差矩阵(常用对输入矩阵的奇异值分解代替特征值分解)
- 对协方差矩阵进行特征值分解
- 取出最大的个特征值对应的特征向量
Output
投影矩阵 = []
代码实现
特征值分解
from numpy import *
def PCA( data, t ):
m, n = data.shape
M = data.sum(1) / n
M = tile(M,(1,n))
B = data - M
D, P = linalg.eig( B*B.T /(n - 1) )
index = argsort(-D)
D = D[index]; P = P[index];D[D<0] = 0
denominator = sum(D); numerator = 0
for i in range(len(D)):
numerator += D[i]
if numerator / denominator >= t:
return diag(D[:i + 1]),P[:,:i + 1], M
return diag(D), P, M
奇异值分解
from numpy import *
def PCA( data, k ):
m, n = data.shape
M = data.sum(1) / n
M = tile(M,(1,n))
B = data - M
U, S, V = linalg.svd( B*B.T /(n - 1) )
return U[:,:k+1], S[:,:k+1]