2013-10-16 15 views
5

Próbuję wykonać analizę głównych składników w zestawach danych zawierających obrazy, ale zawsze, gdy chcę zastosować pca.transform z modułu sklearn.decomposition, otrzymuję ten błąd: * AttributeError: 'PCA' obiekt nie ma atrybutu "mean _" *. Wiem, co ten błąd oznacza, ale nie mam pojęcia, jak to naprawić. Sądzę, że niektórzy z Was wiedzą, jak to naprawić.Analiza głównych składników nie działa

Dziękuję za pomoc

Mój kod:

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) 

Pełna traceback:

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: Więc starałem się dopasować model przed przekształceniem go i teraz dostaję jeszcze dziwniejszy błąd. Sprawdziłem to i obejmuje on f2py, moduł, który przenosi Fortran do Pythona, który jest częścią biblioteki 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,) 

Edit2:

Więc sprawdziłem czy mój train_set i data_set zawierały żadnych danych, a oni nie. Sprawdziłem moje image_dirs i zawierają one właściwe lokalizacje (dla jasności, dostałem je, przechodząc do rzeczywistych plików, patrząc na właściwości jednego z obrazów i skopiowałem lokalizację). Usterka powinna leżeć gdzie indziej.

+0

Powinieneś podać pełne informacje zwrotne. – zero323

+0

Prawda. Zaraz, daj mi chwilkę. – Learner

+1

może powinieneś 'fit()' pierwszy? – joaquin

Odpowiedz

6

Należy dopasować model przed transform:

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) 

edycję

Drugi błąd wskazuje, że train_set jest pusty. Można go łatwo odtworzyć przy użyciu tego kodu:

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

Myślę, że jednym problemem jest funkcja flatten_image. Może się mylę, ale ta linia podniesie AttributeError

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

Może być zastąpiony:

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

Linia ta jest problematyczna również:

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

Czytaj http://docs.python.org/2/library/stdtypes.html#string-formatting-operations więcej szczegółów, ale values must be a tuple.Więc chcesz to zamiast:

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

Kolejna edycja

Wreszcie wymienić pętle aftert "Loop over all images in files and modify them" z:

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

Teraz nazywasz file_open więc będzie szukać plików w ścieżce tak: "C:\Users\private\Desktop\K FOLDER\private\train\C:\Users\private\Desktop\K FOLDER\private\train\foo.jpg", a zamiast nazwy pliku otrzymasz pustą listę.

+0

Próbowałem tego wcześniej z pca.transform i otrzymałem jeszcze dziwniejszy błąd. Sprawdziłem to w Internecie i zawierałem f2py bibliotekę, która przenosi kod Fortrana do Pythona. Zrobię edycję, by uzyskać więcej informacji. – Learner

+0

Ten nie jest dziwny. Pole 'mean_' jest ustawiane, gdy wywołujesz' PCA.fit', aby można je było ustawić wcześniej. Zawsze możesz użyć 'fit_transform' takiego jak @jabaldonedo zaproponowanego poniżej. – zero323

+0

Dziękuję za wskazanie tego. Jednak nadal dostaję błąd, więc leży on gdzieś indziej. Myślałem o mojej funkcji lambda, ale nie jestem pewien. – Learner

3

Myślę, że chcesz zastosować fit_transform zamiast transform. Musisz wygenerować model za pomocą fit lub fit_transform.

To właśnie dokumentacja mówi o każdej metody:

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.

Aplikujesz transform bezpośrednio więc żaden model został już wygenerowany.

+0

Zobacz moją edycję po więcej informacji – Learner

+0

Wygląda na problem z twoim zestawem danych, czy sprawdziłeś, że dane X i y mają taką samą liczbę próbek i nie są puste? – jabaldonedo

+0

Zobacz moją drugą edycję po więcej informacji – Learner

Powiązane problemy