PCA

7 篇文章 0 订阅
2 篇文章 0 订阅

Principal Component Analysis(PCA)算法。

降维是对高维数据去除不重要特征与噪声,只保留重要特征的方法,会损失一定信息。

目录

优点:

基本原理

PCA推导

基于最大化投影后方差

基于最小投影距离

PCA Code(python)

Ref


优点:

减少变量数量,有利于发现规律。

高维空间具有稀疏性,希望数据变得更加稠密,降低计算开销。

某种程度上去除一些噪声。

基本原理

PCA是最简单的以特征量分析多元统计分布的方法,又名主成分分析法。他将数据从原来的坐标系转换到新的坐标系表示。一个多元数据集能够在一个高维数据空间坐标系中被显现出来,那么PCA就能够提供一幅比较低维度的图像,这幅图像即为在讯息最多的点上原对象的一个投影。这样就可以利用少量的主成分使得数据的维度降低了。

https://i-blog.csdnimg.cn/blog_migrate/4febe8f05293d765b21c974542a43f6e.png

上图来自: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.htmlhttps://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(主成分分析)

https://yoyoyohamapi.gitbooks.io/mit-ml/content/%E7%89%B9%E5%BE%81%E9%99%8D%E7%BB%B4/articles/PCA.html

 

三种方法实现PCA算法(Python)

https://www.cnblogs.com/jclian91/p/8024101.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值