我尝试使用python进行主成分分析(PCA)。这是我的代码:
import os
from PIL import Image
import numpy as np
import glob
from matplotlib.mlab import PCA
#Step1: put database images into a 3D array
filenames = glob.glob('C:\\Users\\Karim\\Downloads\\att_faces\\New folder/*.pgm')
filenames.sort()
img = [Image.open(fn).convert('L') for fn in filenames]
images = np.dstack([np.array(im) for im in img])
# Step2: create 2D flattened version of 3D input array
d1,d2,d3 = images.shape
b = np.zeros([d1,d2*d3])
for i in range(len(images)):
b[i] = images[i].flatten()
#Step 3: PCA
results = PCA(b)
results.Wt
但是我得到一个错误RuntimeError: we assume data in a is organized with numrows>numcols
我试着用^{b = np.zeros([d1,d2*d3])
,我得到了ValueError: could not broadcast input array from shape (2760) into shape (112)
有人能帮我吗?在
如果您更改为b = np.zeros([d2*d3, d1])
,那么您还应该在之后更改循环,否则您将尝试将d1
维度数组放入d2*d3
维度数组。你应该消除第二个错误
你可以简单地转置
b
我还用我认为更好的版本替换了for循环:在您的实现中,您首先找到
images
的维度,在其上创建一个整数循环列表,然后重新访问images
。enumerate
返回一个迭代器和一对(索引,值)。优点是它只返回您需要的元素,然后您不必在循环中直接访问images
。在也许你也不需要创建},所以我帮不了你。在这种情况下,你可以简单地用
^{pr2}$images
,但我不知道{编辑
如果您愿意,您也可以在读取文件时将其内容转换为numpy。在
对于记录,这是^{} 。在
相关问题 更多 >
编程相关推荐