2013-04-06 42 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