[PYTHON] Nicht negative Matrixfaktorisierung (NMF) mit Scikit-Learn

NMF ist eine Methode zur Reduzierung von Abmessungen und soll die Genauigkeit von Empfehlungen verbessern können. Sie können NMF auch problemlos mit der Opportunity Learning Library "scikit-learn" verwenden. Dieses Mal besteht der Zweck darin, es mit einem konkreten Beispiel zu versuchen und NMF intuitiv zu verstehen. Der Artikel Was ist Matrixfaktorisierung? ist leicht zu verstehen.

Was ist NMF?

Um eine grobe Vorstellung von Matrix Factorization als Empfehlung zu bekommen, obwohl es auf Englisch ist, sind die folgenden Materialien leicht zu verstehen. Matrix Factorization Techniques For Recommender Systems

Ich werde das Bild kurz erklären, indem ich die Abbildung auf dieser Folie zitiere. Angenommen, Sie nehmen den Netflix-Preis an, bei dem die NMF-Methode so populär geworden ist, und Sie erhalten eine Matrix, die zeigt, wie viele Punkte der Benutzer und die Person welchem Video gegeben haben (Bewertungsmatrix links). Wenn der Benutzer das Video bewertet hat, wurde es mit 1 bis 5 bewertet, und wenn es nicht bewertet wurde, wurde 0 eingegeben. Die Tatsache, dass 0 enthalten ist, ist das Herzstück dieses Problems, und wir sagen den wahren Wert dieser 0 voraus. Diese Bewertungsmatrix wird in zwei Matrizen zerlegt: "Feature x Benutzer" und "Feature x Film". Grob gesagt ist NMF eine Methode, um die Matrixzerlegung gut durchzuführen.

Screen Shot 2016-12-23 at 01.21.41.png

NMF-Formulierung

\mathbf{R}:Rating Matrix \mathbf{P}:User Feature Matrix \mathbf{Q}:Movie Feature Matrix Wenn, wird es so zerlegt, dass der Fehler zwischen $ \ mathbf {R} $ und $ \ mathbf {P} \ times \ mathbf {Q} ^ T $ klein ist.

\mathbf{R} \approx \mathbf{P} \times \mathbf{Q}^T = \hat{\mathbf{R}}

Der Fehler kann als $ e_ {ij} ^ 2 $ ausgedrückt werden.


e_{ij}^2 = (r_{ij} - \hat{r}_{ij})^2 = (r_{ij} - \sum_{k=1}^K{p_{ik}q_{kj}})^2

Die ungefähren $ \ hat {\ mathbf {R}} $ -Elemente sind jedoch wie folgt

\hat{r}_{ij} = p_i^T q_j = \sum_{k=1}^k{p_{ik}q_{kj}}
0.5 * ||X - WH||_Fro^2
+ alpha * l1\_ratio * ||vec(W)||_1
+ alpha * l1\_ratio * ||vec(H)||_1
+ 0.5 * alpha * (1 - l1\_ratio) * ||W||_Fro^2
+ 0.5 * alpha * (1 - l1\_ratio) * ||H||_Fro^2

||A||_Fro^2 = \sum_{i,j} A_{ij}^2 (Frobenius norm)
||vec(A)||_1 = \sum_{i,j} abs(A_{ij}) (Elementwise L1 norm)

Implementierung mit scikit-learn

Es ist einfach anzurufen. Beispielsweise lautet der Code, wenn die Bewertungsmatrix R und die Merkmalsdimension 2 ist, wie folgt.

from sklearn.decomposition import NMF
model = NMF(n_components=2, init='random', random_state=0) # n_Geben Sie die Feature-Dimension mit Komponenten an
P = model.fit_transform(R) #Lernen
Q = model.components_

Konkretes Beispiel

Angenommen, R ist eine 5x4-Matrix wie folgt: Die Zahlen in dieser Matrix werden auf [dieser Website] verwendet (http://www.quuxlabs.com/blog/2010/09/matrix-factorization-a-simple-tutorial-and-implementation-in-python/). Ich habe mich auf das Beispiel bezogen.

D1 D2 D3 D4
U1 5 3 - 1
U2 4 - - 1
U3 1 1 - 5
U4 1 - - 4
U5 - 1 5 4
from sklearn.decomposition import NMF
import numpy as np

#Der 0-Teil ist unbekannt
R = np.array([
        [5, 3, 0, 1],
        [4, 0, 0, 1],
        [1, 1, 0, 5],
        [1, 0, 0, 4],
        [0, 1, 5, 4],
        ]
    )

#Versuchen Sie, die Feature-Dimension k von 1 auf 3 zu ändern
for k in range(1,4):
    model = NMF(n_components=k, init='random', random_state=0)
    P = model.fit_transform(R)
    Q = model.components_
    print("****************************")
    print("k:",k)
    print("P ist")
    print(P)
    print("Q^T ist")
    print(Q)
    print("P×Q^T ist")
    print(np.dot(P,Q))
    print("R-P×Q^T ist")
    print(model.reconstruction_err_ )

Das Ausgabeergebnis ist wie folgt.

****************************
k: 1
P ist
[[ 0.95446553]
 [ 0.64922245]
 [ 1.12694515]
 [ 0.87376625]
 [ 1.18572187]]
Q^T ist
[[ 1.96356213  1.0846958   1.24239928  3.24322704]]
P×Q^T ist
[[ 1.87415238  1.03530476  1.18582729  3.09554842]
 [ 1.27478862  0.70420887  0.8065935   2.10557581]
 [ 2.21282681  1.22239267  1.40011583  3.65493896]
 [ 1.71569432  0.94777058  1.08556656  2.83382232]
 [ 2.32823857  1.28614754  1.47314     3.84556523]]
R-P×Q^T ist
7.511859871919941
****************************
k: 2
P ist
[[ 0.          1.69547254]
 [ 0.          1.13044637]
 [ 1.38593123  0.42353044]
 [ 1.08595617  0.3165454 ]
 [ 2.01891156  0.        ]]
Q^T ist
[[ 0.          0.32199795  1.40668938  2.58501889]
 [ 3.09992487  1.17556787  0.          0.85823043]]
P×Q^T ist
[[ 5.25583751  1.99314304  0.          1.45510614]
 [ 3.50429883  1.32891643  0.          0.97018348]
 [ 1.31291255  0.9441558   1.94957474  3.94614513]
 [ 0.98126695  0.72179626  1.52760301  3.0788861 ]
 [ 0.          0.65008539  2.83998144  5.21892451]]
R-P×Q^T ist
4.2765298341191516
****************************
k: 3
P ist
[[ 0.08750151  2.03662182  0.52066139]
 [ 0.          1.32090927  0.59992585]
 [ 0.04491053  0.44753619  3.4215759 ]
 [ 0.          0.3221337   2.75625987]
 [ 2.6249395   0.          0.91559966]]
Q^T ist
[[ 0.          0.38636917  1.90213535  1.02176621]
 [ 2.62017626  1.02934221  0.          0.08629708]
 [ 0.          0.02388804  0.          1.43875694]]
P×Q^T ist
[[ 5.33630814  2.14262626  0.16643971  1.0142658 ]
 [ 3.4610151   1.37399871  0.          0.97713811]
 [ 1.17262369  0.55975468  0.08542591  5.00732522]
 [ 0.84404708  0.39742747  0.          3.99338722]
 [ 0.          1.03606758  4.99299022  3.99939987]]
R-P×Q^T ist
1.8626938982246695

Die Beobachtungsmatrix R war eine 5 × 4-Matrix. Wenn Sie ein anderes k ausprobieren, können Sie sehen, dass P eine 5 × k-Matrix und Q ^ T eine k × 4-Matrix ist.

Außerdem wird in P × Q ^ T geschätzt, dass es in R 0 war. Wenn beispielsweise k = 2 ist, ist das folgende $ \ hat {\ mathbf {R}} $ abgeschlossen. (Der Teil, in dem fette Buchstaben vorhergesagt werden)

D1 D2 D3 D4
U1 5.25 1.99 0. 1.45
U2 3.50 1.32 0. 0.97
U3 1.31 0.94 1.94 3.94
U4 0.98 0.72 1.52 3.07
U5 0. 0.65 2.83 5.21

Welcher Wert k sein sollte, ist ein schwieriges Problem, und es wird gesagt, dass es von den Eingabedaten (R) abhängt.

Wie können wir in diesem Fall feststellen, welches k besser ist? (Bitte unterrichten Sie, wenn Sie wissen)

Verknüpfung

Recommended Posts

Nicht negative Matrixfaktorisierung (NMF) mit Scikit-Learn
Ich habe mit TensorFlow eine nicht negative Matrixzerlegung (NMF) versucht
Visualisierung des NMF-Lernens (Non-Negative Matrix Factor Decomposition)
Anfangswertproblem der NMF (nicht negative Matrixfaktorzerlegung)
Ich habe versucht, die nicht negative Matrixfaktorisierung (NMF) zu wiederholen.
Isomap mit Scikit-lernen
DBSCAN mit Scikit-Learn
Clustering mit Scikit-Learn (1)
Clustering mit Scikit-Learn (2)
PCA mit Scikit-Learn
kmeans ++ mit scikit-learn
Kreuzvalidierung mit Scikit-Learn
Mehrklassen-SVM mit Scikit-Learn
Clustering mit scikit-learn + DBSCAN
Scikit-Lernen mit Chemoinfomatik
Implementierte Matrixfaktorisierung (Python)
DBSCAN (Clustering) mit Scikit-Learn
Verkettung von Matrizen mit Numpy
Installieren Sie scikit.learn mit pip
Berechnen Sie tf-idf mit scikit-learn
Empfehlungssystem mit Matrixzerlegung [Unüberwachtes Lernen mit Python Kapitel 10]
Neuronales Netzwerk mit Python (Scikit-Learn)
Versuchen Sie die Matrixoperation mit NumPy
Parallele Verarbeitung mit Parallel von Scikit-Learn
[Python] Lineare Regression mit Scicit-Learn
Primfaktorisierung mit O (n ^ (1/4))
Robuste lineare Regression mit Scikit-Learn