【问题标题】:Python - Principal component analysis (PCA) errorPython - 主成分分析 (PCA) 错误
【发布时间】:2013-03-31 05:21:49
【问题描述】:

我正在尝试使用 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: could not broadcast input array from shape (2760) into shape (112)

谁能帮帮我?

【问题讨论】:

    标签: python arrays numpy matplotlib pca


    【解决方案1】:

    如果您更改为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 的维度,在其上创建整数循环列表,然后重新访问 images。 enumerate 返回带有一对(索引,值)的迭代器。优点是它只返回您需要的元素,然后您不必在循环中直接访问images。

    可能你也不需要创建images,但我不知道PIL,所以我无法帮助你。在这种情况下,您可以简单地使用类似

    的方式获取尺寸
    d1,d2,d3 = len(img), img[0].shape
    

    编辑

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

    据记录,这是numpy.asarray。

    【讨论】:

    • 感谢您的帮助。我明白了你的意思,我觉得它更合乎逻辑,但是在尝试你建议摆脱第二个错误的代码时,我遇到了另一个错误:AttributeError: flatten
    • 我假设 img 的元素是 numpy 数组。查看我的编辑
    • 我又遇到了类似于第二个错误的错误:ValueError: could not broadcast input array from shape (10304) into shape (2760)
    • 我笨。如果您使用您的代码并将results = PCA(b) 替换为result = PCA(b.T),会发生什么?
    • 很高兴能提供帮助。那我会编辑我的答案。你能检查一下是否需要创建images 或者使用enumerate(img) 可以吗?
    猜你喜欢
    • 2012-10-24
    • 1970-01-01
    • 2013-04-07
    • 2015-07-29
    • 2013-03-28
    • 2013-03-28
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多