Scikit-learn PCA .fit_transform 形状不一致 (n_samples << m_attributes)

我在使用 sklearn 进行主成分分析时得到了不同的形状。为什么我的转换没有像文档中所说的那样生成相同维度的数组?

fit_transform(X, y=None)Fit the model with X and apply the dimensionality reduction on X.Parameters: X : array-like, shape (n_samples, n_features)Training data, where n_samples is the number of samples and n_features is the number of features.Returns:    X_new : array-like, shape (n_samples, n_components)

让我们用鸢尾花数据集来检查一下,它的形状是 (150, 4),我正在创建4个主成分:

import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom sklearn.datasets import load_irisfrom sklearn.preprocessing import StandardScalerfrom sklearn import decompositionimport seaborn as sns; sns.set_style("whitegrid", {'axes.grid' : False})%matplotlib inlinenp.random.seed(0)# Iris datasetDF_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 = 1DF_standard = pd.DataFrame(StandardScaler().fit_transform(DF_data),                            index = DF_data.index,                           columns = DF_data.columns)# Sklearn for Principal Componenet Analysis# Dimsm = DF_standard.shape[1]K = m# PCA (How I tend to set it up)M_PCA = decomposition.PCA()A_components = M_PCA.fit_transform(DF_standard)#DF_standard.shape, A_components.shape#((150, 4), (150, 4))

但是当我对我的实际数据集 (76, 1989) 使用完全相同的方法时,即 76个样本1989个属性/维度,我得到的是一个 (76, 76) 的数组,而不是 (76, 1989)

DF_centered = normalize(DF_mydata, method="center", axis=0)m = DF_centered.shape[1]# print(m)# 1989M_PCA = decomposition.PCA(n_components=m)A_components = M_PCA.fit_transform(DF_centered)DF_centered.shape, A_components.shape# ((76, 1989), (76, 76))

normalize 只是我编写的从每个维度中减去 mean 的一个包装器。


回答:

(注意:本答案改编自我在 Cross Validated 上的回答:为什么如果维数大于或等于n,n个数据点只有n−1个主成分?)

主成分分析(通常运行的方式)通过以下步骤创建一个新的坐标系统:

  1. 将原点移动到数据的中心点,
  2. 压缩和/或拉伸轴使它们长度相等,
  3. 将轴旋转到一个新的方向。

(更多细节请参见这个优秀的CV讨论:理解主成分分析、特征向量和特征值。)然而,第 3 步以一种非常特定的方式旋转你的轴。你的新X1(现在称为“PC1”,即第一个主成分)朝向数据最大变化的方向。第二个主成分朝向与第一个主成分正交的下一个最大变化方向。其余的主成分也是这样形成的。

考虑到这一点,让我们来看一个简单的例子(由 @amoeba 在一个 评论 中建议)。这是一个数据矩阵,包含三维空间中的两个点:

X = [ 1 1 1       2 2 2 ]

让我们在(伪)三维散点图中查看这些点:

enter image description here

所以让我们按照上面列出的步骤进行。(1)新坐标系统的原点将位于(1.5,1.5,1.5)。(2)轴已经相等。(3)第一个主成分将从原来的(0,0,0)对角线方向延伸到原来的(3,3,3),这是这些数据最大变化的方向。现在,第二个主成分必须与第一个主成分正交,并且应该朝向剩余最大变化的方向。但是那个方向是什么?是从(0,0,3)到(3,3,0),还是从(0,3,0)到(3,0,3),还是其他?没有剩余的变化,因此不能有更多的主成分。

对于N=2个数据,我们最多可以拟合N−1=1个主成分。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注