2013-10-16 3 views
5

Ich versuche, Hauptkomponentenanalyse auf Datensätzen mit Bildern durchzuführen, aber immer, wenn ich pca.transform aus dem Modul sklearn.decomposition anwenden möchte, bekomme ich diesen Fehler: * AttributeError: 'PCA' Objekt hat kein Attribut 'mean _' *. Ich weiß, was dieser Fehler bedeutet, aber ich habe keine Ahnung, wie ich das beheben soll. Ich denke, einige von euch wissen, wie man das repariert.Principal Component Analysis funktioniert nicht

Vielen Dank für Ihre Hilfe

Mein Code:

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) 

Vollzurückverfolgungs:

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: Also habe ich versucht, bevor die Umwandlung es um das Modell zu passen, und jetzt bekomme ich einen noch seltsameren Fehler. Ich habe nachgesehen, und es geht um f2py, ein Modul, das Fortran zu Python portiert, das Teil der Numpy-Bibliothek ist.

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:

So habe ich geprüft, ob meine train_set und DATA_SET alle Daten enthalten sind, und sie tun es nicht. Ich habe meine image_dirs überprüft, und sie enthalten die richtigen Orte (nur für die Klarheit, ich habe sie, indem ich auf die tatsächlichen Dateien, Blick auf die Eigenschaften eines der Bilder und kopiert den Standort). Der Fehler sollte woanders liegen.

+0

Sie sollten vollständige Rückverfolgung bereitstellen. – zero323

+0

Wahr. Ich werde, gib mir eine Sekunde. – Learner

+1

vielleicht sollten Sie 'fit()' zuerst? – joaquin

Antwort

6

sollten Sie passen das Modell vor verwandeln:

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) 

bearbeiten

Zweiter Fehler anzuzeigen, dass Ihre train_set leer. Es kann leicht mit diesem Code wiedergegeben werden:

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

Ich denke, ein Problem in flatten_image Funktion ist. Ich kann mich irren, aber diese Linie wird AttributeError

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

erhöhen Es kann ersetzt werden durch:

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

Diese Linie ist problematisch zu:

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

lesen http://docs.python.org/2/library/stdtypes.html#string-formatting-operations für mehr Details, aber values must be a tuple.So wollen Sie diese stattdessen:

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

Ein weiteres bearbeiten

Endlich Sie Schleifen ersetzen aftert "Loop over all images in files and modify them" mit:

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

Gerade jetzt rufen Sie file_open so wird es für Dateien im Pfad suchen so: "C:\Users\private\Desktop\K FOLDER\private\train\C:\Users\private\Desktop\K FOLDER\private\train\foo.jpg" und Sie erhalten eine leere Liste anstelle des Dateinamens.

+0

Ich habe dies zuvor mit pca.transform versucht und bekam einen noch seltsameren Fehler. Ich habe es im Internet nachgeschlagen, und es ging um eine Bibliothek, die Fortran-Code in Python portiert. Ich werde eine Bearbeitung für weitere Informationen vornehmen. – Learner

+0

Dieser ist nicht komisch. 'mean_' ist gesetzt, wenn Sie' PCA.fit' aufrufen, damit es vorher gesetzt werden kann. Sie können immer 'fit_transform' wie @jabaldonedo, wie unten vorgeschlagen, verwenden. – zero323

+0

Vielen Dank, dass Sie darauf hingewiesen haben. Allerdings bekomme ich immer noch den Fehler, also liegt es woanders. Ich habe über meine Lambda-Funktion nachgedacht, bin mir aber nicht sicher. – Learner

3

Ich denke, Sie möchten fit_transform statt transform anwenden. Sie müssen das Modell entweder mit fit oder fit_transform erstellen. Diese

ist, was Dokumentation sagt über jede Methode:

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.

Sie bewerben sich transform direkt so hat kein Modell bereits generiert.

+0

Siehe meine Bearbeitung für weitere Informationen – Learner

+0

Scheint ein Problem mit Ihrem Dataset, haben Sie überprüft, dass X-und Y-Daten die gleiche Anzahl von Proben haben und sie nicht leer sind? – jabaldonedo

+0

Siehe meine zweite Bearbeitung für weitere Informationen – Learner