Анализ PCA с учетом N-менее значимых компонентов - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь изучить основы анализа PCA в Python с использованием библиотек Scikit (в частности, sklearn.decomposition и sklearn.preprocessing).Цель состоит в том, чтобы импортировать данные из изображений в матрицу X (каждая строка представляет собой образец, каждый столбец представляет собой особенность), затем стандартизировать X, использовать PCA для извлечения основных компонентов (2 наиболее важных, 6 наиболее важных .... 6 менееважно), спроецируйте X на эти главные компоненты, отмените предыдущее преобразование и нанесите на график результат, чтобы увидеть разницу по сравнению с исходным изображением / изображениями.

Теперь давайте скажем, что я не хочу рассматривать2,3,4 ... наиболее важные основные компоненты, но я хочу рассмотреть N менее значимых компонентов, скажем, N = 6.

Как должен проводиться анализ?Я имею в виду, что я не могу просто стандартизировать, затем вызвать PCA (). Fit_transform, а затем вернуться обратно с помощью inverse_transform (), чтобы отобразить результаты.

В данный момент я делаю что-то вроде этого:

X_std = StandardScaler().fit_transform(X) # standardize original data
pca = PCA()
model = pca.fit(X_std) # create model with all components
Xprime = model.components_[range(dim-6, dim, 1),:] # get last 6 PC

А потом я останавливаюсь, потому что я знаю, что должен вызвать transform (), но я не понимаю, как это сделать ... Я пытался несколько раз, но ничего не получилось.

Есть кто-то, кто может сказать мне, еслипредыдущие шаги верны и указывают направление для следования?

Большое спасибо


РЕДАКТИРОВАТЬ: в настоящее время я адаптировал это решение, как было предложено первым ответом на мой вопрос:

model = PCA().fit(X_std)
model2pc = model 
model2pc.components_[range(2, img_count, 1), :] = 0
Xp_2pc = model2pc.transform(X_std)
Xr_2pc = model2pc.inverse_transform(Xp_2pc)

И затем я делаю то же самое для 6 шт., 60 шт., Последние 6 шт.Я заметил, что это очень много времени.Я хотел бы получить модель, непосредственно извлекающую основные компоненты, которые мне нужны (без обнуления остальных), а затем выполнить transform () и inverse_transform () для этой модели.

1 Ответ

0 голосов
/ 26 ноября 2018

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

N = 6
X_std = StandardScaler().fit_transform(X)
pca = PCA()
model = pca.fit(X_std) # create model with all components
model.components_[:-N] = 0

Затем удалить все, кроме последнего N компоненты из данных, просто выполните прямое и обратное преобразование данных:

Xprime = model.inverse_transform(model.transform(X_std))

Вот пример:

>>> X = np.random.rand(18).reshape(6, 3)
>>> model = PCA().fit(X)

Преобразование в оба конца должно вернуть оригиналdata:

>>> X
array([[0.16594796, 0.02366958, 0.8403745 ],
       [0.25219425, 0.22879029, 0.07950927],
       [0.69636084, 0.4410933 , 0.97431828],
       [0.50121079, 0.44835563, 0.95236146],
       [0.6793044 , 0.53847562, 0.27882302],
       [0.32886931, 0.0643043 , 0.10597973]])
>>> model.inverse_transform(model.transform(X))
array([[0.16594796, 0.02366958, 0.8403745 ],
       [0.25219425, 0.22879029, 0.07950927],
       [0.69636084, 0.4410933 , 0.97431828],
       [0.50121079, 0.44835563, 0.95236146],
       [0.6793044 , 0.53847562, 0.27882302],
       [0.32886931, 0.0643043 , 0.10597973]])

Теперь обнуляем первый главный компонент:

>>> model.components_
array([[ 0.22969899,  0.21209762,  0.94986998],
       [-0.67830467, -0.66500728,  0.31251894],
       [ 0.69795497, -0.71608653, -0.0088847 ]])
>>> model.components_[:-2] = 0
>>> model.components_
array([[ 0.        ,  0.        ,  0.        ],
       [-0.67830467, -0.66500728,  0.31251894],
       [ 0.69795497, -0.71608653, -0.0088847 ]])

Теперь преобразование в оба конца дает другой результат, так как мы удалили первый главный компонент (который содержитнаибольшее количество отклонений):

>>> model.inverse_transform(model.transform(X))
array([[ 0.12742811, -0.01189858,  0.68108405],
       [ 0.36513945,  0.33308073,  0.54656949],
       [ 0.58029482,  0.33392119,  0.49435263],
       [ 0.39987803,  0.35478779,  0.53332196],
       [ 0.71114004,  0.56787176,  0.41047233],
       [ 0.44000711,  0.16692583,  0.56556581]])
...