sklearn上的PCA - 如何解释pca.components_

Die*_*ego 13 python math pca scikit-learn

我使用这个简单的代码在具有10个功能的数据框架上运行PCA:

pca = PCA()
fit = pca.fit(dfPca)
Run Code Online (Sandbox Code Playgroud)

结果pca.explained_variance_ratio_显示:

array([  5.01173322e-01,   2.98421951e-01,   1.00968655e-01,
         4.28813755e-02,   2.46887288e-02,   1.40976609e-02,
         1.24905823e-02,   3.43255532e-03,   1.84516942e-03,
         4.50314168e-16])
Run Code Online (Sandbox Code Playgroud)

我认为这意味着第一台PC解释了52%的差异,第二部分解释了29%等等......

我不明白的是输出pca.components_.如果我执行以下操作:

df = pd.DataFrame(pca.components_, columns=list(dfPca.columns))
Run Code Online (Sandbox Code Playgroud)

我得到的数据框低于每一行是主要成分.我想要了解的是如何解释该表.我知道如果我对每个组件的所有功能进行平方并对它们求和,我得到1,但PC1上的-0.56是什么意思?它告诉了一些关于"特征E"的东西,因为它是一个解释了52%方差的组件的最高等级?

在此输入图像描述

谢谢

mak*_*kis 15

首先,PCA的结果通常用组件得分来讨论,有时称为因子得分(对应于特定数据点的转换变量值)和加载(每个标准化原始变量应该乘以的权重)得到组件得分).


可以在此处找到一个简单的解释:https://www.youtube.com/watch?v = _UVHneBUBW0


在您的情况下,功能E的值-0.56是PC1上此功能的分数.该值告诉我们该功能对PC有多大影响(在我们的例子中是PC1).

因此,绝对值越高,对主成分的影响越大.

在执行PCA分析之后,人们通常绘制已知的"双标图"以查看N维(在我们的例子中为2)和原始变量(特征)中的变换特征.

我写了一个函数来绘制这个.


使用虹膜数据的示例:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

iris = datasets.load_iris()
X = iris.data
y = iris.target

#In general it is a good idea to scale the data
scaler = StandardScaler()
scaler.fit(X)
X=scaler.transform(X)

pca = PCA()
pca.fit(X,y)
x_new = pca.transform(X)   

def myplot(score,coeff,labels=None):
    xs = score[:,0]
    ys = score[:,1]
    n = coeff.shape[0]

    plt.scatter(xs ,ys, c = y) #without scaling
    for i in range(n):
        plt.arrow(0, 0, coeff[i,0], coeff[i,1],color = 'r',alpha = 0.5)
        if labels is None:
            plt.text(coeff[i,0]* 1.15, coeff[i,1] * 1.15, "Var"+str(i+1), color = 'g', ha = 'center', va = 'center')
        else:
            plt.text(coeff[i,0]* 1.15, coeff[i,1] * 1.15, labels[i], color = 'g', ha = 'center', va = 'center')

plt.xlabel("PC{}".format(1))
plt.ylabel("PC{}".format(2))
plt.grid()

#Call the function. 
myplot(x_new[:,0:2], pca. components_) 
plt.show()
Run Code Online (Sandbox Code Playgroud)

结果

在此输入图像描述


Tat*_*ota 8

基本理念

原理组件按您所具有的特征细分基本上会告诉您每个主要组件在特征方向上指向的"方向".

在每个主要组件中,具有更大绝对重量的特征将主要组件"拉"到该特征的方向上.

例如,我们可以说在PC1中,由于特征A,特征B,特征I和特征J具有相对较低的权重(绝对值),因此PC1没有指向特征空间中这些特征的方向.PC1将指向功能E相对于其他方向的方向.

低维可视化

有关此内容的可视化,请查看此处此处的以下数据:

以下显示了在相关数据上运行PCA的示例. 在此输入图像描述

我们可以直观地看到,从PCA得到的两个特征向量都在特征1和特征2方向上被"拉".因此,如果我们要制作一个像您一样的主要组件分解表,我们可以期望从功能1和功能2中看到一些解释PC1和PC2的重量.

接下来,我们有一个不相关数据的例子.

在此输入图像描述

让我们将绿色原理组件称为PC1,将粉红色原则组件称为PC2.很明显,PC1没有被拉向特征x'的方向,并且在特征y'的方向上不是PC2.因此,在我们的表中,对于PC1中的特征x',我们必须具有0的权重,对于PC2中的特征y',权重为0.

我希望这会让你知道你在桌子上看到了什么.