特征工程-主成分分析PCA

2022-11-30 11:17:43 浏览数 (1)

简介


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

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

上图摘自https://blog.csdn.net/qq_35164554/article/details/101058673

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

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

步骤


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

x1

x2

1

2

5

3

均值

求每个特征的均值:

overline{x_1}=frac{1 5}{2}=3
overline{x_2}=frac{2 3}{2}=2.5

协方差矩阵

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

减去均值:

x-overline{x}=begin{pmatrix} -2 & -0.5 \ 2 & 0.5 end{pmatrix}

计算协方差s:

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.5end{pmatrix}\=begin{pmatrix}8&2\2&0.5end{pmatrix}

特征值和特征向量

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

求特征值

lambda

: 令

|s-lambda E|=begin{vmatrix}8-lambda&2\2&0.5-lambda end{vmatrix}=0
(8-lambda)(0.5-lambda)-4=0

lambda_1=0,lambda_2=8.5

lambda_1=0

带回

|s-lambda E|=
begin{pmatrix}8&2\2&0.5end{pmatrix}

,正交单位化得特征向量

e_1=(frac{1}{sqrt{17}},frac{-4}{sqrt{17}})^T

lambda_2=8.5

带回

|s-lambda E|=
begin{pmatrix}-0.5&2\2&-8end{pmatrix}

,正交单位化得特征向量

e_2=(frac{4}{sqrt{17}},frac{1}{sqrt{17}})^T

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

第一主成分

将特征向量从大到小排序

(lambda_2>lambda_1)

,依次得到第N主成分。

如第一主成分为

Y_1=e_2^Tx=frac{4}{sqrt{17}}x_1 frac{1}{sqrt{17}}x_2

第二主成分为

Y_1=e_1^Tx=frac{1}{sqrt{17}}x_1-frac{4}{sqrt{17}}x_2

第一主成分

Y_1

贡献率为

frac{lambda_2}{lambda_1 lambda_2}=frac{8.5}{8.5 0}=100%

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

第一主成分贡献率很大,取k=1即可,将二维特征降维一维,即用第一主成分,计算降维后的数据: 样品1新特征:

frac{4}{sqrt{17}}×1 frac{1}{sqrt{17}}×2≈1.46

样品2新特征:

frac{4}{sqrt{17}}×5 frac{1}{sqrt{17}}×3≈5.78

python代码


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

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

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

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

代码语言:javascript复制
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)

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

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

代码语言:javascript复制
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)

原创不易,请勿转载本不富裕的访问量雪上加霜 ) 博主首页:https://wzlodq.blog.csdn.net/ 来都来了,不评论两句吗

0 人点赞