2013-10-16 22 views
5

Resim içeren veri kümeleri üzerinde temel bileşen analizi yapmaya çalışıyorum, ancak sklearn.decomposition modülünden pca.transform uygulamak istediğimde şu hatayı alıyorum: * AttributeError: 'PCA' nesnenin "ortalama _" * özniteliği yoktur. Bu hatanın ne anlama geldiğini biliyorum, ama nasıl düzelteceğime dair hiçbir fikrim yok. Sanırım bazılarınız bunu nasıl çözeceğimizi biliyorsunuz. Temel Bileşen Analizi çalışmıyor

Yardımlarınız için teşekkür ederim

Kodum:

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) 

Tam geri izleme:

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: Ben onu dönüştürerek önce modelini tespit etmek için çalıştı ve şimdi bile garip bir hata alıyorum. Ben baktım, ve bu F2py, Numran Kütüphanesi'nin bir parçası olan Fortran'ı Python'a bağlayan bir modül içerir.

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: my train_set ve data_set herhangi bir veri içerdiği ve onlar yoksa yüzden

kontrol ettirin. image_dir'leri kontrol ettim ve doğru yerleri içerdiler (sadece açıklık için, gerçek dosyalara gidip, görüntülerin özelliklerine bakarak ve konumu kopyaladım). Arıza başka bir yerde yatmalı.

+0

Tam geri izleme sağlamalısınız. – zero323

+0

Doğru. Ben, bana bir saniye vereceğim. – Learner

+1

belki ilk olarak fit() 'yapmalısın? – joaquin

cevap

6

Daha önce modeli dönüşümü sığmalı:

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) 

düzenle

İkinci hata senin train_set boş olduğunu göstermektedir. Kolayca bu kodu kullanarak yeniden olabilir:

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

Bir sorun flatten_image işlevinde olduğunu düşünüyorum. Yanlış olabilir ama bu satırları o değiştirilebilir AttributeError

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

yükseltecektir: sorunlu çok olduğu

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

Bu hat:

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

Oku http://docs.python.org/2/library/stdtypes.html#string-formatting-operations daha fazla ayrıntı için, ancak values must be a tuple.Yani bunun yerine istiyorum:

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

Birlikte "Loop over all images in files and modify them" aftert döngüler yerine Sonunda başka düzenleme

: Hemen, bu yüzden yolda dosyaları arar file_open diyoruz

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

Bu gibi: "C:\Users\private\Desktop\K FOLDER\private\train\C:\Users\private\Desktop\K FOLDER\private\train\foo.jpg" ve dosya adı yerine boş bir liste olsun.

+0

Bunu daha önce pca.transform ile denedim ve daha da garip bir hata aldım. İnternete baktım ve F2py, Fortran kodunu Python'a bağlayan bir kütüphaneyi içeriyordu. Daha fazla bilgi için bir düzenleme yapacağım. – Learner

+0

Bu bir garip değil. 'PCA.fit 'dediğinizde' mean_' alanı ayarlanır, böylece daha önce ayarlanabilir. Aşağıda önerilen {fit_transform 'gibi @jabaldonedo'yu kullanabilirsiniz. – zero323

+0

Bunu işaret ettiğiniz için teşekkür ederiz. Ancak, hala hatayı alıyorum, bu yüzden başka bir yerde yatıyor. Lambda fonksiyonumu düşünüyordum ama emin değilim. – Learner

3

yerine fit_transform uygulamak istediğinizi düşünüyorum. Modeli fit veya fit_transform kullanarak oluşturmanız gerekir.

Bu belgeler her yöntem için söyledikleridir: Doğrudan transform başvurduğunuz

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.

hiçbir model zaten oluşturuldu.

+0

Daha fazla bilgi için benim düzenleme bölümüne bakın – Learner

+0

Veri kümenizde bir sorun var, X ve y verilerinin aynı sayıda numuneye sahip olduğunu ve boş olmadığını kontrol ettiniz mi? – jabaldonedo

+0

Daha fazla bilgi için ikinci düzenlemeye bakın – Learner