python - 主成分分析不起作用

标签 python numpy machine-learning scipy scikit-learn

我正在尝试对包含图像的数据集进行主成分分析,但每当我想从 sklearn.decomposition 模块应用 pca.transform 时,我都会收到此错误:*AttributeError: 'PCA' object has no属性“mean_”*。我知道这个错误意味着什么,但我不知道如何解决它。我想你们中的一些人知道如何解决这个问题。

谢谢你的帮助

我的代码:

from sklearn import svm
import numpy as np
import glob
import os
from PIL import Image
from sklearn.decomposition import PCA

image_dir1 = "C:\Users\private\Desktop\K FOLDER\private\train"
image_dir2 = "C:\Users\private\Desktop\K FOLDER\private\test1"
Standard_size = (300,200)
pca = PCA(n_components = 10)
file_open = lambda x,y: glob.glob(os.path.join(x,y))


def matrix_image(image_path):
    "opens image and converts it to a m*n matrix" 
    image = Image.open(image_path)
    print("changing size from %s to %s" % (str(image.size), str(Standard_size)))
    image = image.resize(Standard_size)
    image = list(image.getdata())
    image = map(list,image)
    image = np.array(image)
    return image
def flatten_image(image):  
    """
    takes in a n*m numpy array and flattens it to 
    an array of the size (1,m*n)
    """
    s = image.shape[0] * image.shape[1]
    image_wide = image.reshape(1,s)
    return image_wide[0]

if __name__ == "__main__":
    train_images = file_open(image_dir1,"*.jpg")
    test_images = file_open(image_dir2,"*.jpg")
    train_set = []
    test_set = []

    "Loop over all images in files and modify them"
    train_set = [flatten_image(matrix_image(image)) for image in train_images]
    test_set = [flatten_image(matrix_image(image)) for image in test_images]
    train_set = np.array(train_set)
    test_set = np.array(test_set)
    train_set = pca.fit_transform(train_set) "line where error occurs"
    test_set = pca.fit_transform(test_set)

完整回溯:

Traceback (most recent call last):
  File "C:\Users\Private\workspace\final_submission\src\d.py", line 54, in <module>
    train_set = pca.transform(train_set)
  File "C:\Python27\lib\site-packages\sklearn\decomposition\pca.py", line 298, in transform
    if self.mean_ is not None:
AttributeError: 'PCA' object has no attribute 'mean_'

编辑1: 所以我试图在转换之前拟合模型,现在我遇到了一个更奇怪的错误。我查了一下,它涉及到 f2py,这是一个将 Fortran 移植到 Python 的模块,它是 Numpy 库的一部分。

File "C:\Users\Private\workspace\final_submission\src\d.py", line 54, in <module>
    pca.fit(train_set)
  File "C:\Python27\lib\site-packages\sklearn\decomposition\pca.py", line 200, in fit
    self._fit(X)
  File "C:\Python27\lib\site-packages\sklearn\decomposition\pca.py", line 249, in _fit
    U, S, V = linalg.svd(X, full_matrices=False)
  File "C:\Python27\lib\site-packages\scipy\linalg\decomp_svd.py", line 100, in svd
    full_matrices=full_matrices, overwrite_a = overwrite_a)
ValueError: failed to create intent(cache|hide)|optional array-- must have defined dimensions but got (0,)

编辑2:

所以我检查了我的 train_set 和 data_set 是否包含任何数据,但它们没有。 我已经检查了我的 image_dirs,它们包含正确的位置(为了清楚起见,我通过转到实际文件、查看其中一个图像的属性并复制位置来获得它们)。故障应该出在其他地方。

最佳答案

你应该在转换之前拟合模型:

train_set = np.array(train_set)
test_set = np.array(test_set)

pca.fit(train_set)
pca.fit(test_set)

train_set = pca.transform(train_set) "line where error occurs"
test_set = pca.transform(test_set)

编辑

第二个错误表明您的 train_set 是空的。可以使用此代码轻松复制它:

train_set = np.array([[]])
pca.fit(train_set)

我认为 flatten_image 函数有一个问题。我可能错了,但这一行会引发 AttributeError

image.wide = image.reshape(1,s)

可以替换为:

image_wide = image.reshape(1,s)
return image_wide[0]

这一行也有问题:

print("changing size from %s to %s" % str(image.size), str(Standard_size))

阅读http://docs.python.org/2/library/stdtypes.html#string-formatting-operations了解更多详情,但值必须是一个元组。所以你想要这个:

print("changing size from %s to %s" % (str(image.size), str(Standard_size)))

另一个编辑

最后,您将 “遍历文件中的所有图像并修改它们” 之后的循环替换为:

train_set = [flatten_image(matrix_image(image)) for image in train_images]
test_set = [flatten_image(matrix_image(image)) for image in test_images]

现在您调用 file_open,它会在这样的路径中查找文件:"C:\Users\private\Desktop\K FOLDER\private\train\C:\Users\private\Desktop\K FOLDER\private\train\foo.jpg" 你得到的是空列表而不是文件名。

关于python - 主成分分析不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19410491/

相关文章:

python - 绘制 scikit-learn (sklearn) SVM 决策边界/曲面

python - 将 pandas 数据帧的 'tabulated' 字符串转换回数据帧

python - 使用欧几里得距离的 Numpy 数组的邻接矩阵

python - 来自二维概率 numpy 数组的样本?

python - 适用于 Windows python 2.7 的 NumPy

python - Keras 看不到训练和验证文件夹中的所有图像

python - 属性错误: 'str' object has no attribute 'fit'

python - sqlalchemy 查询 : result column names

python - 使用 lambda 进行复杂排序

python - 如何使用 python 查看目录中每个文件的第一行