PCA原理及python实现

作者: 于饼喵 | 来源:发表于2021-01-10 16:59 被阅读0次

    PCA(Principal Component Analysis)又叫主成分分析,主要用于信息压缩,那么什么是信息呢?决策树中,用熵代表信息,而在PCA中,用方差来衡量信息
    从高纬度的信息中提取主要信息,以此达到压缩信息【降维】的目的,就是PCA要干的事儿~

    1.1 PCA思路

    在降维中,PCA使用的信息衡量指标就是样本方差,又称可解释性方差,方差越大,特征所带的信息越 多,让数据能够压缩到少数特征上并且总信息量不损失太多的技术就是矩阵分解,PCA找到的每个新特征向量就叫做“主成分”,而被丢弃的特征向量很有可能就是噪音

    那么PCA的原理是什么呢?首先来简单普及需要用到的数学基础

    1.1.1 内积

    向量的内积:内积的几何意义是用来表征或计算两个向量之间的夹角,以及在b向量在a向量方向上的投影
    \begin{align} \\&A = [a1,a2,...,an]; \\&B = [b1,b2,...,bn]; \\& B*A =[b1,b2,...,bn]*[a1,a2,...,an]^{T}= b1a1 + b2a2 + ...+ bnan = |B|*|A|*cos\theta \end{align}
    上式中,|B|*|A|cosØ可以看成A在B向量上的投影的|B|倍长度


    当|B|是1时,其实就是|A|cosØ,即投影

    1.1.2 基

    基可以理解为坐标系,平时我们使用的最多的坐标系就是(0,1)和(1,0)坐标系【即横纵的x轴和y轴】

    向量在不同基下的坐标怎么求呢?其实很简单,向量的坐标就是其在基上的投影。那怎么求这个投影呢?内积可以帮我们解决这个问题。通过将向量和对应基向量做内积,则可以求出对应向量在新基下的值【其实就是一个向量乘另一个向量,只不过现在有一个向量是基向量】

    因此,同一个向量在不同基下的投影是不一样的【坐标不一样】,我们要想准确的描述向量,必须要先确定基

    PCA的思路在于,将原始数据转换到新的低纬度的基,从而达到降维的目的

    假设pi是基向量,i表示第i个基;aj表示第j个原始数据
    \begin{align} \\& P = [p1,p2,...,pi] \\& a = [a1,a2,...,aj] \\& \\& \begin{bmatrix} p1 \\ p2 \\ ... \\ pi \end{bmatrix} * \begin{bmatrix} a1,a2,...,aj \end{bmatrix} = \begin{bmatrix} p1a1,p1a2,...p1aj \\ p2a1,p2a2,....p2aj \\ ... \\ pia1,pia2,....piaj \end{bmatrix} \end{align}
    结果表示的意义是指将原始数据投影到新的基中,当基的维度减少时,aj在新的基中的维度也减少,即可以达到降维的效果

    但是要降低到多少维度才能保住效果比较好呢?目前的做法是,投影后的投影值要尽可能的分散,因为越分散,样本的熵越大,熵越大包含的信息越多,因此我们还需要用方差和协方差来衡量分散程度

    1.1.3 方差和协方差

    • 方差

    Var(a) = \frac{1}{n-1} \sum_{i=1}^{n}(ai - \mu)^2

    a表示样本i的值,µ表示均值,衡量样本的波动,方差越大样本越分散,则包含的信息越多,因此优化问题变成使得所有数据变换为这个基上的坐标表示后,方差值最大

    • 协方差

    \begin{align} \\& Cov(a,b) = \frac{1}{n-1} \sum_{i=1}^{n}(a_{i} - \mu_{a})(b_{i} - \mu_{b}) \\& \ if \quad \mu_{a} = \mu_{b} = 0 ; \\&then \ Cov(a) = \frac{1}{m} \sum_{i=1}^{m}a_{i}b_{i} \end{align}

    协方差用于衡量两个随机变量的联合相关程度,当两个变量的Cov为0时,则完全独立。为了消除共线性,我们需要让变量彼此间尽可能线性不相关,因此我们选择基的时候,需要使用正交基,让投影数据经过这组正交基转化后两两之间协方差为0,并且方差尽可能大

    1.2 PCA实现

    1. 主成分个数的选取原则

    • 单个主成分解释的变异不应该小于1,比如选取3个主成分,第3个主成分解释的方差相当于一个原始变量的变异
    • 选取主成分累计的解释变异达到80%-90%,以此来选择主成分个数

    2. 主成分分析三种运用场景

    • 综合打分:只求出一个综合打分,相对于单项成绩简单加总来讲,主成分分析会赋予区分度高的单项成绩以更高的权重,

    分值更合理,不过当主成分分析不支持取一个主成分时,就不能使用该方法了

    • 对数据进行描述,描述产品情况【波士顿矩阵】子公司业务发展状况,区域投资潜力等,需要将多变量压缩到少数几个主成分进行描述,如果压缩到两个主成分是最理想的。这类分析一般还要涉及到因子分析

    • 为聚类或回归分析提供变量压缩

    3. python下的PCA实现

    from sklearn.decomposition import PCA
    from sklearn import preprocessing 
    
    corr_matrix = data.corr(method='pearson')  # 查看相关系数矩阵
    data = preprocessing.scale(data)           # pca前需要先进行标准化【此处使用中心标准化】
    pca = PCA(n_components=5)
    pca.fit(data)
    print(pca.explained_variance_)             # 打印可解释方差,选取大于1的
    print(pca.explained_variance_ratio_)       # 打印可解释方差占比,根据80%-90%原则,选取n_compnents参数
    
    data.frame(pca.components_).T.             # 查看主成分各权重
    

    PCA的代码实现不难,重点掌握其基本原理,相关运用场景以及主成分个数的选取原则即可~

    相关文章

      网友评论

        本文标题:PCA原理及python实现

        本文链接:https://www.haomeiwen.com/subject/aqxlaktx.html