2012-12-04 12 views
6

Implementuję algorytm PCA w programie MATLAB. Widzę dwa różne podejścia do obliczania macierzy kowariancji:Obliczanie macierzy kowariancji w programie Matlab

C = sampleMat.' * sampleMat ./ nSamples; 

i

C = cov(data); 

Jaka jest różnica między tymi dwoma metodami?

PS 1: Gdy używam cov(data) jest niepotrzebna:

meanSample = mean(data,1); 
data = data - repmat(data, nSamples, 1); 

PS 2:

Przy pierwszym podejściu należy używać nSamples lub nSamples - 1?

Odpowiedz

10

W skrócie: cov przede wszystkim dodaje wygody nieobrobionej formule.

Jeśli wpiszesz

edit cov 

Zobaczysz wiele rzeczy, z tych linii przez całą drogę na dole:

xc = bsxfun(@minus,x,sum(x,1)/m); % Remove mean  
if flag 
    xy = (xc' * xc)/m; 
else 
    xy = (xc' * xc)/(m-1); % DEFAULT 
end 

która jest zasadniczo taka sama, jak w pierwszym wierszu zapisać dla odjęcia kolumny-środki.

Przeczytaj the wiki na próbnych kowarianiach, aby zobaczyć, dlaczego w domyślnej ścieżce znajduje się minus jeden.

Uwaga jednak, że pierwsza linia wykorzystuje normalną transpozycję (.'), natomiast cov -version wykorzystuje sprzężonej-transpozycję ('). Spowoduje to, że dane wyjściowe cov będą różne w kontekście danych o wartościach zespolonych.

Należy również pamiętać, że cov to wywołanie funkcji do funkcji niezawierającej. Oznacza to, że podczas korzystania z pętli w trybie cov wystąpi (prawdopodobnie poważna) kara za wydajność; Kompilator JIT Matlaba nie może przyspieszać funkcji niewbudowanych.

+0

Z zastrzeżeniem, że liczby zespolone są traktowane inaczej niż kod w pytaniu. –

+0

@BenVoigt: prawda, transpozycja jest inna, dziękuję. Edycja ... –

+0

Czy według twojej edycji 2 lepiej użyć pierwszego wiersza? i który z nich jest prawidłowy lub czy są one takie same, aby zastosować transpozycyjną i transpozycyjną koniugację do obliczenia kowariancji? – kamaci