Principal Component Analysis(PCA)算法。
降维是对高维数据去除不重要特征与噪声,只保留重要特征的方法,会损失一定信息。
目录
优点:
减少变量数量,有利于发现规律。
高维空间具有稀疏性,希望数据变得更加稠密,降低计算开销。
某种程度上去除一些噪声。
基本原理
PCA是最简单的以特征量分析多元统计分布的方法,又名主成分分析法。他将数据从原来的坐标系转换到新的坐标系表示。一个多元数据集能够在一个高维数据空间坐标系中被显现出来,那么PCA就能够提供一幅比较低维度的图像,这幅图像即为在讯息最多的点上原对象的一个‘投影’。这样就可以利用少量的主成分使得数据的维度降低了。
上图来自:https://www.cnblogs.com/pinard/p/6239403.html
说白了,就是希望用某一维表示之前的两维或多维。上图点为二维点,希望降为一维点,有两个候选的投影直线,u1与u2。直观看u1好些,解释有两种:1 样本点到这个直线的距离较小,2样本点投影到直线上后分布相对稀疏。这两种解释其实也就对应PCA的两种推导方式
PCA推导
基于最大化投影后方差
基于最小投影距离
基本思想是最小化 “降维后的点与原始的点之间的距离的平方和” 的平均值。推导结果最后的式子同于上面的推导结果。我暂时不想手推了。推导的话参考
http://www.cnblogs.com/LeftNotEasy/archive/2011/01/08/lda-and-pca-machine-learning.html 与 https://www.cnblogs.com/pinard/p/6239403.html
PCA Code(python)
import numpy as np
from sklearn.decomposition import PCA as SKPCA
def PCA(X,dim):
'''
对X PCA分解,降到dim空间中,并输出降维结果
params:
X第一维是数据编号,第二维为每个数据各分量
如
X = np.array([ [-1,-1,0,2,1],
[2,0,0,-1,-1],
[2,0,1,1,0]] )
dim为指定的低维空间维数
return
X_low = [ [ 2.6838453 -0.36098161]
[-2.09303664 -0.78689112]
[-0.59080867 1.14787272]]
'''
#data_size = X.shape[0] #向量数量
#data_channel = X.shape[1] #降维前 向量的维度
## 1.特征标准化 { X = X - X_mean ) }
X_col_mean = np.mean(X,axis=0)
X_std = X - X_col_mean
## 2.计算协方差矩阵cc { 1/m * sum{ (x^i)(x^i)^T } = np.cov(X_std,rowvar=0) }
cc = np.cov(X_std,rowvar=0) # == np.dot(X_std.T,X_std) / (data_size - 1)
## 3.计算cc的特征值与特征向量, vec一列为一特征向量
val ,vec = np.linalg.eigh(np.mat(cc))
## 4.抽取前 dim 大的特征向量组成变换矩阵
val_ind = np.argsort(val)
val_ind_select = val_ind[-1:-(dim+1):-1]
vec_trans = vec[:,val_ind_select] #一列为一特征向量
## 5.变换 vec_trans * X
X_low = np.dot(X_std,vec_trans)
## 6.重建 X ,此项默认不开启
#X_recon = X_low * vec_trans.T + X_col_mean
return X_low
# 辅助函数
def check_precentage_to_n(val,precent):
'''
依据保留信息百分比参数precent计算PCA应该保留的维度n
params:
val 特征值
precent 保留百分比
return:
n 应该保留的维度
'''
sortArr = np.sort(val)
sortArr = sortArr[-1::-1]
ArrSum = np.sum(sortArr)
tmp = 0
n = 0
for x in sortArr:
tmp += x
n += 1
if tmp >= ArrSum * precent:
return n
if __name__ == "__main__":
X = np.array([ [-1,-1,0,2,1],
[2,0,0,-1,-1],
[2,0,1,1,0]] )
X_ = PCA(X,2)
print("自定义PCA\n",X_)
# PCA by Scikit-learn
pca = SKPCA(n_components=2)
pca.fit(X) #输入数据
print('PCA Scikit-learn')
print(pca.fit_transform(X))
Ref
【1】.PCA算法
https://www.cnblogs.com/xingshansi/p/6445625.html
【2.】 机器学习中的数学(4)-线性判别分析(LDA), 主成分分析(PCA)
http://www.cnblogs.com/LeftNotEasy/archive/2011/01/08/lda-and-pca-machine-learning.html
主成分分析(PCA)原理总结
https://www.cnblogs.com/pinard/p/6239403.html
主成分分析(PCA)原理及推导
https://www.jianshu.com/p/19e75707654a
PCA(主成分分析)
三种方法实现PCA算法(Python)
https://www.cnblogs.com/jclian91/p/8024101.html