2013-08-22 8 views
6

Partial Least Squares (PLS) algoritmo è implementato nella libreria scikit-learn, come documentato qui: http://scikit-learn.org/0.12/auto_examples/plot_pls.html Nel caso in cui y è un vettore binario, una variante di questo algoritmo viene utilizzato , l'algoritmo Partial least squares Discriminant Analysis (PLS-DA). Il modulo PLSRegression in sklearn.pls implementa anche questo caso binario? In caso contrario, dove posso trovare un'implementazione Python per questo? Nel mio caso binario, io sto cercando di utilizzare il PLSRegression:PLS-DA algoritmo in pitone

pls = PLSRegression(n_components=10) 
pls.fit(x, y) 
x_r, y_r = pls.transform(x, y, copy=True) 

Nella funzione di trasformazione, il codice ottiene un'eccezione in questa linea:

y_scores = np.dot(Yc, self.y_rotations_) 

Il messaggio di errore è "ValueError: matrici non sono allineati ". Yc è il vettore y normalizzato e self.y_rotations_ = [1.]. Nella funzione di adattamento, self.y_rotations_ = np.ones (1) se l'originale y è un vettore univariato (y.shape 1 = 1).

+2

Hai mai risolto questo? Ho provato lo stesso metodo (usando l'ultima versione di scikit-learn) e sembra fare perfettamente PLS-DA. La chiave è di etichettare le classi con 1 e 0 (per la stessa/altra classe). Se ancora non riesci a farlo funzionare, puoi pubblicare i tuoi dati? – mfitzp

+0

Non ho ancora risolto, ma proverò la soluzione user3178149. Grazie per aver offerto il tuo aiuto! –

+0

@mfitzp La regressione dei minimi quadrati è uguale all'analisi discriminante parziale dei minimi quadrati? Sto cercando di capire come ottenere trame dai primi due componenti. –

risposta

0

Non è esattamente quello che stai cercando, ma si checkout questi due thread su come chiamare ad un nativo (C/C++ di codice) da un pitone e un C++ PLS librerie implementazione:

Partial Least Squares Library

Calling C/C++ from python?

è possibile utilizzare boost.python per incorporare il codice C++ in python. Ecco un esempio tratto da official site:

Seguendo la tradizione C/C++, iniziamo con "ciao, mondo". A ++ Funzione C:

char const* greet() 
{ 
    return "hello, world"; 
} 

possono essere esposti a Python scrivendo un wrapper Boost.Python:

#include <boost/python.hpp> 

BOOST_PYTHON_MODULE(hello_ext) 
{ 
    using namespace boost::python; 
    def("greet", greet); 
} 

Questo è tutto. Sono state fatte. Ora possiamo costruirlo come una libreria condivisa. La DLL risultante è ora visibile a Python. Ecco un esempio di sessione Python:

>>> import hello_ext 
>>> print hello_ext.greet() 
hello, world 
13

PLS-DA è in realtà un "trucco" da utilizzare per i risultati PLS categoriche invece del solito continua vettore/matrice. Il trucco consiste nel creare una fittizia matrice di identità di zeri/uno che rappresenta l'appartenenza a ciascuna delle categorie. Quindi, se si prevede un risultato binario (cioè maschio/femmina, sì/no, ecc.) La matrice fittizia avrà DUE colonne che rappresentano l'appartenenza a una delle due categorie.

Ad esempio, considerare il genere di esito per quattro persone: 2 maschi e 2 femmine.La matrice fittizio dovrebbe essere codificato come:

import numpy as np 
dummy=np.array([[1,1,0,0],[0,0,1,1]]).T 

, in cui ogni colonna rappresenta l'appartenenza ai due categorie (maschio, femmina)

Poi vostro modello di dati variabili Xdata (figura 4 righe, colonne arbitrarie) sarebbe:

myplsda=PLSRegression().fit(X=Xdata,Y=dummy) 

le categorie previste possono essere estratti dal confronto delle due variabili indicatore in mypred:

mypred= myplsda.predict(Xdata) 

Per ogni riga/caso il sesso previsto è quello con l'appartenenza prevista più alta.

+1

Se i tuoi dati contengono solo due classi, è meglio presentare y come una singola colonna, quindi eseguire la regressione e identificare la classe utilizzando la soglia del mezzo valore del valore della due classe, ad esempio, se 1 è per la classe uno e -1 per l'altra classe, la soglia è 0. Esistono problemi se si utilizza una matrice di y. Questo è anche il motivo per cui PLSDA non è raccomandato per il problema multiclasse. Vedi la carta _Analisi discriminante parziale dei minimi quadrati: togliere la magia_ per una discussione dettagliata. – Elkan