2013-04-06 40 views
0

我是一名Python初學者,我正在使用python實現主成分分析(PCA),但我有一個計算平均值的問題。 這裏是我的代碼:主成分分析(PCA)使用python計算平均值

import Image 
import os 
from PIL import Image 
from numpy import * 
import numpy as np 


#import images 
dirname = "C:\\Users\\Karim\\Downloads\\att_faces\\New folder" 
X = [np.asarray(Image.open(os.path.join(dirname, fn))) for fn in os.listdir(dirname)] 

#get number of images and dimentions 
path, dirs, files = os.walk(dirname).next() 
num_images = len(files) 
image_file = "C:\\Users\\Karim\\Downloads\\att_faces\\New folder\\2.pgm" 
img = Image.open(image_file) 
width, height = img.size 

print width 
print height 
print num_images 

M = (X-mean(X.T,axis=1)).T # subtract the mean (along columns) 

我得到的錯誤:

AttributeError: 'list' object has no attribute 'T' 

回答

2

的問題是X.T在你的上線,因爲X是一個Python列表,而不是一個numpy.ndarray。目前還不清楚你要在這裏做什麼,但如果你想將所有的圖像數組合成一個numpy數組,你可以在最後一行之前轉換X = np.array(X)

同樣,除非你特別希望推出自己的PCA實現,你可以更輕鬆地與numpy的使用np.cov(協方差計算)和np.linalg.eig(計算協方差矩陣的特徵值和特徵向量)做到這一點。

+1

當我試圖np.cov(X)我得到這個錯誤: ValueError異常:對象不對齊 – user2229953 2013-04-06 19:07:49

+1

很難診斷此沒有看到創建'X'的代碼。它是一個ndarray?如果是這樣,它的形狀是什麼?我的猜測是,「X」不是一個ndarray或者你的圖像陣列不是全部相同的長度。如果圖像數組的長度不一樣,那麼嘗試計算協方差(有或沒有numpy)會有不同的問題。 – bogatron 2013-04-06 20:41:11

+0

@ user2229953看起來'X'是'PIL'圖像生成的'np.arrays'列表。可能應該在'X'的每個元素上進行分析,而不是在'np.asarray(X)'上進行分析。 – askewchan 2013-04-07 00:07:16