• 特征工程-主成分分析PCA


    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站

    简介


    主成分分析(Principle Component Analysis,PCA)是常用的降维方法,用较少的互不相关的新变量来反映原变量所表示的大部分信息,有效解决维度灾难问题。

    一种直观的解释是,主成分是对所有样本点的一种投影,且我们希望投影后可以尽可能的分开,即使得投影后样本点的方差最大化。不难理解,方差越大,越能反映数据特征。

    请添加图片描述
    上图摘自https://blog.csdn.net/qq_35164554/article/details/101058673

    主成分分析包括如下几个步骤:

    1. 计算均值
    2. 计算协方差
    3. 计算协方差矩阵对应的特征值和特征向量
    4. 计算第n主成分及其贡献率

    步骤


    为方便说明,以如下数据集为例:

    x1x2
    12
    53

    均值

    求每个特征的均值:
    x 1 ‾ = 1 + 5 2 = 3 \overline{x_1}=\frac{1+5}{2}=3 x1=21+5=3

    x 2 ‾ = 2 + 3 2 = 2.5 \overline{x_2}=\frac{2+3}{2}=2.5 x2=22+3=2.5

    协方差矩阵

    协方差是用来表示两个变量的相关性的,比如正相关(x增大则y增大)、负相关(x增大y减小)和不相关。更多细节安利这个b站讲解如何通俗地解释协方差

    减去均值:
    x − x ‾ = ( − 2 − 0.5 2 0.5 ) x-\overline{x}=\begin{pmatrix} -2 & -0.5 \\ 2 & 0.5 \end{pmatrix} xx=(220.50.5)

    计算协方差s:
    s = 1 n − 1 ( x − x ‾ ) T ( x − x ‾ ) = 1 2 − 1 ( − 2 − 0.5 2 0.5 ) ( − 2 − 0.5 2 0.5 ) = ( 8 2 2 0.5 ) s=\frac{1}{n-1}(x-\overline{x})^T(x-\overline{x})\\=\frac{1}{2-1}\begin{pmatrix}-2&-0.5\\2&0.5 \end{pmatrix}\begin{pmatrix}-2&-0.5\\2&0.5\end{pmatrix}\\=\begin{pmatrix}8&2\\2&0.5\end{pmatrix} s=n11(xx)T(xx)=211(220.50.5)(220.50.5)=(8220.5)

    特征值和特征向量

    需要亿点点线性代数知识,计算特征值和特征向量。

    求特征值 λ \lambda λ
    ∣ s − λ E ∣ = ∣ 8 − λ 2 2 0.5 − λ ∣ = 0 |s-\lambda E|=\begin{vmatrix}8-\lambda&2\\2&0.5-\lambda \end{vmatrix}=0 sλE=8λ220.5λ=0
    ( 8 − λ ) ( 0.5 − λ ) − 4 = 0 (8-\lambda)(0.5-\lambda)-4=0 (8λ)(0.5λ)4=0

    λ 1 = 0 , λ 2 = 8.5 \lambda_1=0,\lambda_2=8.5 λ1=0,λ2=8.5

    λ 1 = 0 \lambda_1=0 λ1=0带回 ∣ s − λ E ∣ = |s-\lambda E|= sλE= ( 8 2 2 0.5 ) \begin{pmatrix}8&2\\2&0.5\end{pmatrix} (8220.5),正交单位化得特征向量 e 1 = ( 1 17 , − 4 17 ) T e_1=(\frac{1}{\sqrt{17}},\frac{-4}{\sqrt{17}})^T e1=(17 1,17 4)T

    λ 2 = 8.5 \lambda_2=8.5 λ2=8.5带回 ∣ s − λ E ∣ = |s-\lambda E|= sλE= ( − 0.5 2 2 − 8 ) \begin{pmatrix}-0.5&2\\2&-8\end{pmatrix} (0.5228),正交单位化得特征向量 e 2 = ( 4 17 , 1 17 ) T e_2=(\frac{4}{\sqrt{17}},\frac{1}{\sqrt{17}})^T e2=(17 4,17 1)T

    插播反爬信息 )博主CSDN地址:https://wzlodq.blog.csdn.net/

    第一主成分

    将特征向量从大到小排序 ( λ 2 > λ 1 ) (\lambda_2>\lambda_1) (λ2>λ1),依次得到第N主成分。

    如第一主成分为 Y 1 = e 2 T x = 4 17 x 1 + 1 17 x 2 Y_1=e_2^Tx=\frac{4}{\sqrt{17}}x_1+\frac{1}{\sqrt{17}}x_2 Y1=e2Tx=17 4x1+17 1x2

    第二主成分为 Y 1 = e 1 T x = 1 17 x 1 − 4 17 x 2 Y_1=e_1^Tx=\frac{1}{\sqrt{17}}x_1-\frac{4}{\sqrt{17}}x_2 Y1=e1Tx=17 1x117 4x2

    第一主成分 Y 1 Y_1 Y1贡献率为 λ 2 λ 1 + λ 2 = 8.5 8.5 + 0 = 100 % \frac{\lambda_2}{\lambda_1+\lambda_2}=\frac{8.5}{8.5+0}=100\% λ1+λ2λ2=8.5+08.5=100%

    也就是根据特征值从大到小,选择前k个对应的特征向量,将数据降为k维。

    第一主成分贡献率很大,取k=1即可,将二维特征降维一维,即用第一主成分,计算降维后的数据:
    样品1新特征: 4 17 × 1 + 1 17 × 2 ≈ 1.46 \frac{4}{\sqrt{17}}×1+\frac{1}{\sqrt{17}}×2≈1.46 17 4×1+17 1×21.46
    样品2新特征: 4 17 × 5 + 1 17 × 3 ≈ 5.78 \frac{4}{\sqrt{17}}×5+\frac{1}{\sqrt{17}}×3≈5.78 17 4×5+17 1×35.78

    python代码


    使用sklearn库中的PCA()函数进行主成分分析。

    可以使用参数n_components定义需要保留的特征维数,降到多少维,默认1,可以置为‘mle’自适应取值。

    可以使用fit_transform方法训练数据,同时返回降维后结果。
    等价于先使用fit方法后,再使用transform方法。

    还可以使用inverse_transform方法将降维数据还原为原始数据。
    使用explained_variance_ratio_查看贡献率等。

    import pandas as pd
    from sklearn.decomposition import PCA
    
    data = [[1, 2], [5, 3]]
    data = pd.DataFrame(data)
    print("协方差矩阵:\n", data.cov())
    
    pca = PCA(n_components='mle')
    result = pca.fit_transform(data)
    print("各样本主成分的贡献率为:\n", pca.explained_variance_ratio_)
    print("降维后:\n", result)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    此处调用函数结果降维为-2.06和2.06,与我们手算的1.46和5.78不同,原因是函数还对数据进行了标准化处理,使得降维数据的期望为0,可以看出2.06与-2.06的差,与5.78和1.46的差近似。

    再如将以下数据降维为二维数据:

    import pandas as pd
    from sklearn.decomposition import PCA
    
    data = [[18.25, 6.25, 12],
            [18.21, 6.34, 11.87],
            [20.91, 6.36, 14.55],
            [22.28, 6.6, 15.68],
            [20.19, 6.9, 13.29],
            [19.9, 6.82, 13.08],
            [21.04, 6.78, 14.26],
            [22.43, 6.86, 15.57],
            [23.33, 6.72, 16.61],
            [22.37, 6.64, 15.73],
            [21.58, 6.54, 15.04],
            [21.06, 6.67, 14.39],
            [19.68, 6.7, 12.98],
            [18.24, 6.64, 11.6],
            [18.09, 6.64, 11.45],
            [17.7, 6.49, 11.21],
            [17.12, 6.57, 10.55],
            [16.98, 6.56, 10.42],
            [16.57, 6.51, 10.06],
            [15.64, 6.5, 9.14],
            [14.64, 6.46, 8.18],
            [14.03, 6.45, 7.58],
            [13.38, 6.43, 6.93],
            [12.86, 6.41, 6.45],
            [12.41, 6.4, 6.01],
            [12.29, 6.42, 5.87],
            [12.4, 6.51, 5.89],
            [12.09, 6.81, 5.28]]
    data = pd.DataFrame(data, columns=["出生率", "死亡率", "自然增长率"])
    model = PCA(n_components=2)
    y = model.fit_transform(data)
    print("各样本主成分的贡献率为:", model.explained_variance_ratio_)
    print("降维后:\n", y)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    在这里插入图片描述

    原创不易,请勿转载本不富裕的访问量雪上加霜
    博主首页:https://wzlodq.blog.csdn.net/
    来都来了,不评论两句吗👀
    如果文章对你有帮助,记得一键三连❤

  • 相关阅读:
    【FPGA教程案例45】图像案例5——基于FPGA的图像均值滤波verilog实现,通过MATLAB进行辅助验证
    透过等待看数据库
    python 里面对于字典进行key或value排序输出
    HTML大学班级活动网页设计 、大学校园HTML实例网页代码 、本实例适合于初学HTML的同学
    GIS学习笔记(六):3D数据可视化
    GitHub 基本操作
    2023年【四川省安全员A证】考试资料及四川省安全员A证考试试卷
    Verilog & Matlab 联合仿真
    私域运营对于企业的重要性
    子集和数问题
  • 原文地址:https://blog.csdn.net/qq_45034708/article/details/127849293