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.
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.
\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)
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_
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)
Scikit lernen Referenz
Was ist Matrixfaktorisierung (leicht verständliche Qiita)
Matrixfaktorisierungstechniken für Empfehlungssysteme
Recommended Posts