当我运行下面的代码时,我看到了“pca.explained_variance_ratio_
”和一个直方图,它显示了为每个特征解释的方差比例。
import statsmodels.api as sm
import numpy as np
import pandas as pd
import statsmodels.formula.api as smf
from statsmodels.stats import anova
mtcars = sm.datasets.get_rdataset("mtcars", "datasets", cache=True).data
df = pd.DataFrame(mtcars)
x = df.iloc[:,2:]
from sklearn.preprocessing import StandardScaler
pca = PCA(n_components=11)
principalComponents = pca.fit_transform(df)
# Plotting the variances for each PC
PC = range(1, pca.n_components_+1)
plt.bar(PC, pca.explained_variance_ratio_, color='gold')
plt.xlabel('Principal Components')
plt.ylabel('Variance %')
plt.xticks(PC)
如何将 PCA 1 和 2 映射回数据框中的原始特征?
最佳答案
每个 PC 都是您的变量的线性组合。例如 PC1 将是(其中 X1、X2 代表每个因变量):
所以 w11、w22 将是您的负载,它们将代表每个功能对相关 PC 的影响。基本上它们会显示与您的 PC 的相关性请参阅 this post或者可能是这样的 blog获得 sklearn 的解释。
在您的示例中,您没有在 PC 之前缩放数据,因此负载最多的矢量将是幅度最大的矢量。所以让我们正确地做到这一点:
import statsmodels.api as sm
import numpy as np
import pandas as pd
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
mtcars = sm.datasets.get_rdataset("mtcars", "datasets", cache=True).data
df = pd.DataFrame(mtcars)
X = StandardScaler().fit_transform(df)
pca = PCA(n_components=11)
pca.fit(X)
# Plotting the variances for each PC
PC = range(1, pca.n_components_+1)
plt.bar(PC, pca.explained_variance_ratio_, color='gold')
plt.xlabel('Principal Components')
plt.ylabel('Variance %')
plt.xticks(PC)
这些是载荷:
PCnames = ['PC'+str(i+1) for i in range(pca.n_components_)]
Loadings = pd.DataFrame(pca.components_,columns=PCnames,index=df.columns)
Loadings.iloc[:,:2]
PC1 PC2
mpg 0.362531 -0.373916
cyl 0.016124 0.043744
disp -0.225744 -0.175311
hp -0.022540 -0.002592
drat 0.102845 0.058484
wt -0.108797 0.168554
qsec 0.367724 0.057278
vs 0.754091 0.230825
am -0.235702 -0.054035
gear 0.139285 -0.846419
carb 0.124896 0.140695
粗略地说,这意味着具有高 vs
的观察结果将在第一个组件 (PC1) 上获得更高的分数,而那些具有高 am
的观察结果同样将具有低分数。你可以检查他们的影响:
Loadings["PC1"].sort_values().plot.barh()
关于python - 如何将主成分分析的结果映射回输入模型的实际特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67585809/