主成分分析不起作用
Posted
技术标签:
【中文标题】主成分分析不起作用【英文标题】:Principal Component Analysis not working 【发布时间】:2013-10-24 23:38:32 【问题描述】:我正在尝试对包含图像的数据集进行主成分分析,但每当我想从 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,它们包含正确的位置(为了清楚起见,我通过转到实际文件、查看图像的属性并复制位置来获取它们)。故障应该出在其他地方。
【问题讨论】:
您应该提供完整的回溯。 是的。我会的,给我一秒钟。 也许你应该先fit()
?
您的train_set
似乎是空的。你能验证它确实包含预期的数据吗?
这确实可能是问题所在。我会检查我的 image_dir 是否正确。
【参考方案1】:
你应该在转换之前拟合模型:
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 了解更多详情,但values must be a tuple
。所以你想要这个:
print("changing size from %s to %s" % (str(image.size), str(Standard_size)))
另一个修改
最后你将"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]
现在您调用file_open
,它会在如下路径中查找文件:"C:\Users\private\Desktop\K FOLDER\private\train\C:\Users\private\Desktop\K FOLDER\private\train\foo.jpg"
,您会得到空列表而不是文件名。
【讨论】:
我以前用 pca.transform 试过这个,但得到了一个更奇怪的错误。我在互联网上查找了它,它涉及 f2py 一个将 Fortran 代码移植到 Python 的库。我将进行编辑以获取更多信息。 这个并不奇怪。mean_
字段在您调用 PCA.fit
时设置,因此可以在此之前设置。您可以随时使用fit_transform
,就像下面建议的@jabaldonedo。
感谢您指出这一点。但是,我仍然收到错误,所以它位于其他地方。我在考虑我的 lambda 函数,但我不确定。
检查最后一次编辑。现在您拨打file_open
两次。第一次创建 train_images
时,第二次在 for 循环中。它会给你一个空列表。
我明白了,但我现在有点困惑。我应该删除什么?【参考方案2】:
我认为您想申请 fit_transform
而不是 transform
。您需要使用fit
或fit_transform
生成模型。
这是文档对每种方法的说明:
适合(X, y=None) 用 X 拟合模型。
fit_transform(X, y=None) 用 X 拟合模型并在 X 上应用降维。
您正在直接应用transform
,因此尚未生成任何模型。
【讨论】:
您的数据集似乎有问题,您是否检查过 X 和 y 数据具有相同数量的样本并且它们不为空?以上是关于主成分分析不起作用的主要内容,如果未能解决你的问题,请参考以下文章