【问题标题】:PCA().fit() is using the wrong axis for data inputPCA().fit() 使用错误的轴进行数据输入
【发布时间】:2020-05-27 13:59:54
【问题描述】:

我正在使用sklearn.decomposition.PCA 为机器学习模型预处理一些训练数据。有 4095 个维度的 247 个数据点,使用 pandascsv 文件导入。然后我缩放数据

training_data = StandardScaler().fit_transform(training[:,1:4096])

在调用PCA算法获取每个维度的方差之前,

pca = PCA(n_components)

pca.fit(training_data).

输出是一个长度为 247 的向量,但它的长度应该是 4095,这样我才能计算出每个维度的方差,而不是每个数据点的方差。

我的代码如下:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA

test = np.array(pd.read_csv("testing.csv", sep=','))
training = np.array(pd.read_csv("training.csv", sep=','))
# ID Number = [0]
# features = [1:4096]

training_data = StandardScaler().fit_transform(training[:,1:4096])
test_data = StandardScaler().fit_transform(test[:,1:4096])
training_labels = training[:,4609]

pca = PCA()
pca.fit(training_data)
pca_variance = pca.explained_variance_.

我已经尝试对training_data 进行转置,但这并没有改变输出。我也尝试在PCA函数的参数中更改n_components,但坚持只能有247个维度。

这可能是一个愚蠢的问题,但我对这种数据处理非常陌生。谢谢。

【问题讨论】:

  • 您的数据有问题。 print(training_data.shape)return 是什么意思?
  • @seralouk 返回(247, 4095)
  • 看我的回答干杯

标签: python scikit-learn pca decomposition


【解决方案1】:

你说:

" 但它的长度应该是 4095 以便我可以计算出 每个维度,而不是每个数据点的方差。”

没有。仅当您使用 pca = PCA(n_components=4095) 估计 4095 个组件时,这才是正确的。


另一方面,您定义:

pca = PCA() # this is actually PCA(n_components=None)

所以n_components 设置为None


当这种情况发生时,我们有(见documentation here):

n_components == min(n_samples, n_features)

因此,在您的情况下,您有 min(247, 4095) = 247 组件。

所以,pca.explained_variance_. 将是一个形状为 247 的向量,因为您有 247 个 PC 维度。


为什么我们有n_components == min(n_samples, n_features)

这与协方差/相关矩阵的秩有关。具有形状为[247,4095] 的数据矩阵X,协方差/相关矩阵将为[4095,4095],最大秩= min(n_samples,n_features)。因此,您最多有 min(n_samples, n_features) 个有意义的 PC 组件/维度。

【讨论】:

  • 好的,我想我明白了。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-20
  • 1970-01-01
  • 2015-03-09
  • 2017-12-24
  • 2013-03-18
  • 2013-11-09
  • 2013-09-30
相关资源
最近更新 更多