2013-04-06 4 views
0

Я начинаю с python, и я реализую анализ основных компонентов (PCA) с использованием python, но у меня возникает проблема вычисления среднего значения. Вот мой код:Средство вычисления основных компонентов (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 список питон, не numpy.ndarray. Непонятно, что вы пытаетесь сделать здесь, но если вы хотите объединить все массивы изображений в один массив numpy, вы можете преобразовать X = np.array(X) перед последней строкой.

Кроме того, если вы специально не хотите свернуть свою собственную реализацию PCA, вы можете сделать это гораздо легче с NumPy помощи np.cov (для расчета ковариации) и np.linalg.eig (для вычисления собственных значений и собственных векторов ковариационной матрицы).

+1

когда я попытался np.cov (X) Я получил эту ошибку: ValueError: объекты не выровнены – user2229953

+1

Это трудно диагностировать это, не видя код, который создает 'x'. Это ndarray? Если да, то какова его форма? Я предполагаю, что либо 'X' не является ndarray, либо ваши массивы изображений не имеют одинаковой длины. Если массивы изображений не имеют одинаковой длины, тогда у вас будет другая проблема, пытающаяся вычислить ковариацию (с или без numpy). – bogatron

+0

@ user2229953 Кажется, что 'X' - это список' np.arrays', сгенерированный из изображений PIL. Вероятно, анализ должен выполняться для каждого элемента 'X', а не' np.asarray (X) ' – askewchan