Python - 主成分分析(PCA)错误

标签 python arrays numpy matplotlib pca

我正在尝试使用 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([d2*d3, d1]) 替换 b = np.zeros([d1,d2*d3]) 我得到 ValueError:无法将输入数组从形状 (2760) 广播到形状 (112)

谁能帮帮我?

最佳答案

如果您更改为 b = np.zeros([d2*d3, d1]) 您之后还应该更改循环,否则您会尝试放置一个 d1 维度数组转换为 d2*d3 一个。

你应该摆脱第二个错误

你可以简单地转置b

# Step2: create 2D flattened version of 3D input array
d1,d2,d3 = images.shape
b = np.empty([d1,d2*d3])  #if you know that you are filling the whole array it's faster that using np.zeros or np.ones
for i, im in enumerate(images): 
    b[i,:] = im.flatten()

#Step 3: PCA
results = PCA(b.T)

我还用我认为更好的版本替换了你的 for 循环:在你的实现中,你首先找到 images 的维度,创建一个整数列表循环它然后重新 -访问图像enumerate 返回带有一对 (index, value) 的迭代器。优点是它只返回您需要的元素,然后您不必在循环中直接访问 images

可能你也不需要创建images,但我不知道PIL,所以我帮不了你。在这种情况下,您可以简单地使用类似的方法获取尺寸

d1,d2,d3 = len(img), img[0].shape

编辑

如果你愿意,你也可以在阅读文件时将文件内容转换为 numpy。

根据记录,这是 numpy.asarray .

关于Python - 主成分分析(PCA)错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15890765/

相关文章:

python - Apache:动态解释静态文件

javascript - 如何取出双数组中的对象

java - 当我尝试访问多维数组时应用程序崩溃

python - 如何创建一个在复选框右侧显示复选框标签的 Django 表单?

Python 列表与 C 数组 : 100x slower?

python - 如果执行多个 runcron 会发生什么

python - 基于另一个相同形状的 2D 数组对 2D numpy 数组(按行)进行排序

python - Pandas :如何将列表转换为按列分组的矩阵?

python - Perfplot bench() raises "TypeError: ufunc ' isfinite' not supported for the input types, and the input types"

python - numpy中另一个数组过滤数组元素