2012-05-02 7 views
3

Iam пытается вычислить PCA матрицы.сложные собственные значения при вычислении PCA

Иногда в результате собственных значений/векторы комплексных значений поэтому при попытке спроецировать точку на нижний план измерения пути умножения собственного вектор матрицы с точкой координат я получаю следующее предупреждение

ComplexWarning: Casting complex values to real discards the imaginary part 

В том строка кода np.dot(self.u[0:components,:],vector)

весь код, который я использовал для расчета PCA

import numpy as np 
import numpy.linalg as la 

class PCA: 
    def __init__(self,inputData): 
     data = inputData.copy() 
     #m = no of points 
     #n = no of features per point 
     self.m = data.shape[0] 
     self.n = data.shape[1] 
     #mean center the data 
     data -= np.mean(data,axis=0) 

     # calculate the covariance matrix 
     c = np.cov(data, rowvar=0) 

     # get the eigenvalues/eigenvectors of c 
     eval, evec = la.eig(c) 
     # u = eigen vectors (transposed) 
     self.u = evec.transpose() 

    def getPCA(self,vector,components): 
     if components > self.n: 
      raise Exception("components must be > 0 and <= n") 
     return np.dot(self.u[0:components,:],vector) 

ответ

7

Ковариационная матрица симметрична и, следовательно, имеет реальные собственные значения. Из-за численной ошибки вы можете увидеть небольшую мнимую часть в некоторых собственных значениях. Мнимые части обычно можно игнорировать.

+0

@ Micael J. Barber, какие числовые ошибки могут привести к такой аномалии? –

2

Вы можете использовать ТСМ наборы библиотеки python для PCA, это example о том, как его использовать