sklearn.decomposition.PCA 的简单特征向量图

Posted

技术标签:

【中文标题】sklearn.decomposition.PCA 的简单特征向量图【英文标题】:Simple plots of eigenvectors for sklearn.decomposition.PCA 【发布时间】:2016-10-24 21:34:44 【问题描述】:

我正在尝试了解 Principal Component Analysis 的工作原理,我正在 sklearn.datasets.load_iris 数据集上对其进行测试。我了解每个步骤的工作原理(例如,标准化数据、协方差、特征分解、排序以获得最高特征值、使用 K 选定维度将原始数据转换为新轴)。

下一步是可视化这些eigenvectors 在数据集上的投影位置(在PC1 vs. PC2 plot 上,对吗?)。

谁能解释如何在降维数据集的 3D 图上绘制 [PC1, PC2, PC3] 特征向量?

另外,我是否正确绘制了这个 2D 版本?我不确定为什么我的第一个特征向量的长度更短。我应该乘以特征值吗?


以下是我为此所做的一些研究:

我遵循的 PCA 方法来自: https://plot.ly/ipython-notebooks/principal-component-analysis/#Shortcut---PCA-in-scikit-learn(虽然我不想用plotly。我想坚持用pandas, numpy, sklearn, matplotlib, scipy, and seaborn

我一直在按照本教程绘制特征向量,它看起来很简单:Basic example for PCA with matplotlib 但我似乎无法用我的数据复制结果。

我发现了这个,但对于我正在尝试做的事情来说似乎过于复杂,我不想创建一个 FancyArrowPatch:plotting the eigenvector of covariance matrix using matplotlib and np.linalg


我已尝试使我的代码尽可能简单,以遵循其他教程:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn import decomposition
import seaborn as sns; sns.set_style("whitegrid", 'axes.grid' : False)

%matplotlib inline
np.random.seed(0)

# Iris dataset
DF_data = pd.DataFrame(load_iris().data, 
                       index = ["iris_%d" % i for i in range(load_iris().data.shape[0])],
                       columns = load_iris().feature_names)

Se_targets = pd.Series(load_iris().target, 
                       index = ["iris_%d" % i for i in range(load_iris().data.shape[0])], 
                       name = "Species")

# Scaling mean = 0, var = 1
DF_standard = pd.DataFrame(StandardScaler().fit_transform(DF_data), 
                           index = DF_data.index,
                           columns = DF_data.columns)

# Sklearn for Principal Componenet Analysis

# Dims
m = DF_standard.shape[1]
K = 2

# PCA (How I tend to set it up)
M_PCA = decomposition.PCA(n_components=m)
DF_PCA = pd.DataFrame(M_PCA.fit_transform(DF_standard), 
                columns=["PC%d" % k for k in range(1,m + 1)]).iloc[:,:K]


# Plot the eigenvectors
#https://***.com/questions/18299523/basic-example-for-pca-with-matplotlib

# This is where stuff gets weird...
data = DF_standard

mu = data.mean(axis=0)
eigenvectors, eigenvalues = M_PCA.components_, M_PCA.explained_variance_ #eigenvectors, eigenvalues, V = np.linalg.svd(data.T, full_matrices=False)
projected_data = DF_PCA #np.dot(data, eigenvectors)

sigma = projected_data.std(axis=0).mean()

fig, ax = plt.subplots(figsize=(10,10))
ax.scatter(projected_data["PC1"], projected_data["PC2"])
for axis, color in zip(eigenvectors[:K], ["red","green"]):
#     start, end = mu, mu + sigma * axis ### leads to "ValueError: too many values to unpack (expected 2)"

    # So I tried this but I don't think it's correct
    start, end = (mu)[:K], (mu + sigma * axis)[:K] 
    ax.annotate('', xy=end,xytext=start, arrowprops=dict(facecolor=color, width=1.0))
    
ax.set_aspect('equal')
plt.show()

【问题讨论】:

【参考方案1】:

我认为你问错了问题。特征向量是主要成分(PC1、PC2 等)。因此,在 [PC1, PC2, PC3] 3D 图中绘制特征向量只是在绘制该图的三个正交轴。

您可能想要可视化特征向量在原始坐标系中的外观。这是您在第二个链接中讨论的内容:Basic example for PCA with matplotlib。

【讨论】:

是的,这就是我的意思,在尺寸减小后将它们绘制在原始轴上。我认为您发布的示例是我使用的示例。我可以让它为我的数据正常工作 感谢您澄清我将解决问题??

以上是关于sklearn.decomposition.PCA 的简单特征向量图的主要内容,如果未能解决你的问题,请参考以下文章

机器学习Sklearn库主成分分析PCA降维的运用实战

用scikit-learn学习主成分分析(PCA)

sklearn PCA 如何在数据帧上工作?

scikit-learn 内核 PCA 解释方差

原理详解:PCA(explained_variance_ratio_与explained_variance_)

超过40个功能导致kernelpca scikit学习错误