PCA (). Fit () использует неправильную ось для ввода данных - PullRequest
1 голос
/ 27 мая 2020

Я использую sklearn.decomposition.PCA для предварительной обработки некоторых обучающих данных для модели машинного обучения. Имеется 247 точек данных с 4095 измерениями, импортированных из файла csv с использованием pandas. Затем я масштабирую данные

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, но это не повлияло на результат. Я также пробовал изменить n_components в аргументе функции PCA, но настойчиво утверждает, что может быть только 247.

Это может быть глупый вопрос, но я новичок в такого рода обработка данных. Спасибо.

1 Ответ

1 голос
/ 27 мая 2020

Вы сказали:

«но он должен иметь длину 4095, чтобы я мог вычислить дисперсию каждого измерения, а не дисперсию каждой точки данных».

Нет. Это верно только в том случае, если вы оцениваете 4095 компонентов с помощью pca = PCA(n_components=4095).


С другой стороны, вы определяете:

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

, поэтому n_components устанавливается на None.


Когда это происходит, мы имеем (см. Документацию здесь ):

n_components == min(n_samples, n_features)

Таким образом, в вашем случае у вас есть min(247, 4095) = 247 компонентов.

Итак, pca.explained_variance_. будет вектором с формой 247, поскольку у вас есть размеры 247 P C.


Почему у нас n_components == min(n_samples, n_features)?

Это связано с рангом ковариационной / корреляционной матрицы. Имея матрицу данных X с формой [247,4095], ковариационная / корреляционная матрица будет [4095,4095] с максимальным рангом = min (n_samples, n_features). Таким образом, у вас есть не более min (n_samples, n_features) значимых P C компонентов / размеров.

...