2013-08-22 10 views
6

częściowych najmniejszych kwadratów (PLS) Algorytm realizowany w bibliotece scikit-learn jak udokumentowane: http://scikit-learn.org/0.12/auto_examples/plot_pls.html W przypadku, w którym y oznacza wektor binarny, wariant ten algorytm jest stosowany , algorytm Discriminant Analysis (PLS-DA) dla najmniejszych kwadratów. Czy moduł PLSRegression w sklearn.pl implementuje również ten przypadek binarny? Jeśli nie, to gdzie mogę znaleźć dla niego implementację pythona? W moim przypadku binarnego, Próbuję użyć PLSRegression:PLS-DA algorytm pytona

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

W funkcji transformacji, kod dostaje wyjątek w tej linii:

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

Komunikat o błędzie jest „ValueError: macierze nie są wyrównane ". Yc to znormalizowany wektor y, a self.y_rotations_ = [1.]. W funkcji dopasowania self.y_rotations_ = np.ones (1), jeśli pierwotny y jest jednoczynnikowym wektorem (y.shape 1 = 1).

+2

Czy kiedykolwiek to rozwiązałeś? Próbowałem tej samej metody (używając najnowszej wersji scikit-learn) i wydaje się, że doskonale działa PLS-DA. Kluczem jest oznaczenie klas klasami 1 i 0 (dla tej samej/innej klasy). Jeśli nadal nie możesz go uruchomić, czy możesz opublikować swoje dane? – mfitzp

+0

Nie rozwiązałem go jeszcze, ale spróbuję rozwiązania user3178149. Dziękujemy za Twoją pomoc! –

+0

@mfitzp Czy częściowa regresja metodą najmniejszych kwadratów jest taka sama, jak analiza dyskryminacyjna metodą najmniejszych kwadratów? Próbuję dowiedzieć się, jak uzyskać wykresy z dwóch pierwszych składników. –

Odpowiedz

0

Nie dokładnie to, czego szukasz, ale kasy te dwa wątki o tym, jak zadzwonić do rodzimych (C/C++ code) od Python i C++ PLS libs realizacji:

Partial Least Squares Library

Calling C/C++ from python?

można użyć boost.python do osadzenia kodu C++ w pythonie. Oto przykład zaczerpnięty z tradycji następujących C/C++, zacznijmy od "cześć, świat". C++ Funkcja:

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

mogą być narażone na Pythonie pisząc owijkę Boost.Python:

#include <boost/python.hpp> 

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

To wszystko. Skończyliśmy. Możemy teraz zbudować to jako wspólną bibliotekę. Wynikowa biblioteka DLL jest teraz widoczna dla języka Python. Oto próbka sesji Python:

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

PLS-DA jest naprawdę „trick”, by użyć PLS dla kategorycznych wyników zamiast zwykłego ciągłego wektor/matrycy. Sztuczka polega na tworzeniu pozornej matrycy tożsamości zer/jedynek, która reprezentuje przynależność do każdej z kategorii. Jeśli masz przewidywany wynik binarny (np. Męski/żeński, tak/nie itd.), Twoja matryca będzie posiadała DWIE kolumny reprezentujące członkostwo w każdej z tych kategorii.

Weźmy na przykład płeć wynikową dla czterech osób: 2 mężczyzn i 2 kobiety.Manekina matrycy powinna być zakodowana jako:

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

, w którym każda kolumna reprezentuje przynależność do dwóch kategorii (męski, żeński)

Następnie dany model danych o zmiennej xdata (kształt 4 rzędy, dowolne kolumny) to:

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

Przewidziane kategorie mogą być ekstrahowane z porównania dwóch zmiennych wskaźnika w mypred:

mypred= myplsda.predict(Xdata) 

Dla każdego wiersza/przypadku przewidywana płeć ma najwyższą przewidywaną liczbę członków.

+1

Jeśli dane zawierają tylko dwie klasy, lepiej jest przedstawić y jako pojedynczą kolumnę, a następnie zignorować i określić klasę przy użyciu progu połowy wartości dwóch wartości klasy, na przykład, jeśli 1 jest dla klasy 1 i -1 dla drugiej klasy próg to 0. Występują problemy, jeśli używana jest macierz y. Właśnie dlatego PLSDA nie jest zalecany do problemu wieloklasowego. Zobacz artykuł _Partialna analiza dyskryminacyjna najmniejszych kwadratów: odejmowanie magii_ dla szczegółowej dyskusji. – Elkan