5

Ben Şimdiye kadar var PCA 10 900 boyutları azaltarak gerçekleştirmek çalışıyorum: labels karakter (1-26) için 1x699 etiketlerdirPCA Boyut Azaltma

covariancex = cov(labels); 
[V, d] = eigs(covariancex, 40); 

pcatrain = (trainingData - repmat(mean(traingData), 699, 1)) * V; 
pcatest = (test - repmat(mean(trainingData), 225, 1)) * V; 

. trainingData, 699 karakterlik görüntüler için 699x900, 900 boyutlu verilerdir. test, 225x900, 225 900 boyutlu karakterlerdir.

Temel olarak bunu 225x10 yani 10 boyuta indirmek istiyorum ancak bu noktada sıkışmış durumdayım.

cevap

8

kovaryans için boyut azaltmak istiyorsanız eigs(covariancex,N) arandığında, bu Dahası [i,j] == [j,i].

olarak bir köşegen matris olmalıdır, N 10 yerine 40 olmalıdır senin trainingData:

X = bsxfun(@minus, trainingData, mean(trainingData,1));   
covariancex = (X'*X)./(size(X,1)-1);     

[V D] = eigs(covariancex, 10); % reduce to 10 dimension 

Xtest = bsxfun(@minus, test, mean(trainingData,1)); 
pcatest = Xtest*V; 
+0

Bu harika çok teşekkür ederim! – user3094936

+0

çok hoş geldiniz! – lennon310

+0

Sadece bir şey daha var, neden 40'ı neden kullandığımı hatırlıyorum (buna çok ihtiyacım yok), çünkü öğretim elemanına göre, 1:10 yerine 2:11 boyutlarını almak daha iyidir, bunu nasıl başarabilirim? – user3094936

1

Kodunuzdan, trainingData değil labels kovaryansını alıyorsunuz gibi görünüyor. PCA noktasının, verilerinizin bazı N (N = 10 burada) sayısı alt aralığındaki en büyük varyansı belirlemede olduğuna inanıyorum.

Kişisel kovaryans matrisi (900 her resmin boyutu sanırım sahip 30x30 piksel görüntü sonucu olup olmadığını.) Diyagonal elemanlar covaraincex ait [i,i] tüm eğitim örnekler için o pikselin varyansını verir Nerede 900x900 olmalı ve diyagonal [i,j] kapalı piksel i ve piksel j arasındaki kovaryansı verir. Eğer uygulanan gerekiyordu 10.

+0

Maalesef 40'ı neden kullandığımı hatırlıyorum (buna çok ihtiyacım olmamasına rağmen) çünkü öğretim elemanına göre 1:10 yerine 2:11 boyutlarını almak daha iyidir, bunu nasıl başarabilirim? – user3094936