PCA для KNN в numpy - PullRequest
       8

PCA для KNN в numpy

1 голос
/ 30 марта 2020

Мне было поручено реализовать мой код PCA для преобразования данных в 2d-поле для назначения KNN. Мой код PCA создает массив с собственными векторами, называемыми PCevecs.

def __PCA(data):
   #Normalize data
   data_cent = data-np.mean(data)

   #calculate covariance
   covarianceMatrix = np.cov(data_cent, bias=True)

   #Find eigenvector and eigenvalue
   eigenvalue, eigenvector= np.linalg.eigh(covarianceMatrix)

   #Sorting the eigenvectors and eigenvalues:
   PCevals = eigenvalue[::-1]
   PCevecs = eigenvector[:,::-1]

   return PCevals, PCevecs

Назначение преобразует обучающие данные с использованием PCA. Возвращенный PCevecs имеет форму (88, 88), заданную вызовом print (PCevecs.shape). Форма данных тренировки (88, 4).

np.dot(trainingFeatures, PCevecs[:, 0:2])

Когда код работает, я получаю сообщение об ошибке «ValueError: shape (88,4) и (88,2) не выровнены: 4 (dim 1)! = 88 (dim 0)» , Я вижу, что массивы не совпадают, но я не вижу, что я сделал что-то не так с реализацией PCA. Я попытался взглянуть на подобные проблемы на Stackoverflow. Я не видел, чтобы кто-нибудь сортировал собственные векторы и собственные значения одинаково.

1 Ответ

0 голосов
/ 30 марта 2020

( EDITED с дополнительной информацией из комментариев)

Хотя реализация PCA в целом нормальна, вы можете либо вычислить ее на основе транспонированных данных, либо сделать убедитесь, что вы указали np.cov() по какой оси ваша размерность через параметр rowvar.

Следующее будет работать так, как вы ожидаете:

import numpy as np


def __PCA_fixed(data, rowvar=False):
   # Normalize data
   data_cent = data - np.mean(data)

   # calculate covariance (pass `rowvar` to `np.cov()`)
   covarianceMatrix = np.cov(data_cent, rowvar=rowvar, bias=True)  
   # Find eigenvector and eigenvalue
   eigenvalue, eigenvector= np.linalg.eigh(covarianceMatrix)

   # Sorting the eigenvectors and eigenvalues:
   PCevals = eigenvalue[::-1]
   PCevecs = eigenvector[:,::-1]

   return PCevals, PCevecs

Тестирование это с некоторыми случайными числами:

data = np.random.randint(0, 100, (100, 10))
PCevals, PCevecs = __PCA_fixed(data)
print(PCevecs.shape)
# (10, 10)

Также обратите внимание, что, в более общих чертах, разложение по сингулярным значениям (np.linalg.svd() в NumPy) может быть лучшим подходом для анализа главных компонентов простой взаимосвязью с разложением собственных значений , которое вы используете и транспонируете).


Как общий стиль кодирования обратите внимание, что может быть хорошей идеей следовать советам PEP-8 , многие из которых можно легко проверить с помощью какого-либо автоматизированного инструмента, например, autopep8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...