2013-10-16 32 views
5

私は画像を含むデータセットの主成分分析をしようとしていますが、sklearn.decompositionモジュールからpca.transformを適用したいときはいつも、私はこのエラーを受け取り続けています:* AttributeError: 'PCA'オブジェクトには '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_' 

EDIT1:だから私はそれを変換する前にモデルを合わせてみました 、および今私はさらに奇妙なエラーが発生しています。私はそれを見て、それはf2py、Numpyライブラリの一部であるFortranをPythonに移植するモジュールを含んでいます。

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,) 

EDIT2:私のtrain_setとdata_setは、任意のデータを含んでおり、そうでないのであれば、私は

をチェックしています。 私は自分のimage_dirをチェックしました。正しい場所が含まれています(わかりやすくするため、実際のファイルに移動してイメージのプロパティを見て、場所をコピーしました)。障害はどこかにあるはずです。

+0

完全なトレースバックを提供する必要があります。 – zero323

+0

真。私は、私に秒を与えます。 – Learner

+1

最初に 'fit()'するべきでしょうか? – joaquin

答えて

6

あなたは、変換前のモデルに適合しなければならない:

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) 

を編集 2番目のエラーをあなたのtrain_setが空であることを示しています。これは、簡単にこのコードを使用して再現することができます:私は1つの問題はflatten_image機能である

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

と思います。私は間違っているかもしれないが、この行はそれを置き換えることができる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" aftertループを置き換える:今あなたはそれがパス内のファイルを探しますfile_openを呼び出す

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

"C:\Users\private\Desktop\K FOLDER\private\train\C:\Users\private\Desktop\K FOLDER\private\train\foo.jpg"のようになり、ファイル名の代わりに空のリストが表示されます。

+0

私はpca.transformでこれを試してみたところ、さらに奇妙なエラーがありました。私はインターネット上でそれを調べ、FortranコードをPythonに移植するライブラリf2pyを使用しました。私はより多くの情報を編集します。 – Learner

+0

これは奇妙ではありません。 'mean_'フィールドは' PCA.fit'を呼び出すときに設定されていますので、前に設定することができます。以下の@jabaldonedoのように 'fit_transform'を使うことができます。 – zero323

+0

それを指摘していただきありがとうございます。しかし、私はまだエラーが発生しているので、それは他の場所にあります。私はラムダ機能について考えていましたが、わかりません。 – Learner

3

transformの代わりにfit_transformを適用したいと思います。 fitまたはfit_transformのいずれかを使用してモデルを生成する必要があります。

これは、ドキュメントがそれぞれの方法についてこう言われる、あなたが直接transformを適用している

fit(X, y=None) Fit the model with X.

fit_transform(X, y=None) Fit the model with X and apply the dimensionality reduction on X.

ので、何のモデルは既に生成されていません。

+0

詳細は私の編集を参照 – Learner

+0

あなたのデータセットに問題がありますが、XとYのデータのサンプル数が同じで、空ではないことを確認しましたか? – jabaldonedo

+0

詳細は私の2回目の編集を見てください – Learner

関連する問題