[PYTHON] Factorisation matricielle non négative (NMF) avec scikit-learn

La NMF est une méthode de réduction de dimension et on dit qu'elle est capable d'améliorer la précision des recommandations. Vous pouvez également utiliser facilement NMF avec la bibliothèque d'apprentissage d'opportunités scikit-learn. Cette fois, le but est de l'essayer avec un exemple concret et de comprendre NMF intuitivement. L'article Qu'est-ce que la factorisation matricielle? est facile à comprendre.

Qu'est-ce que NMF

Pour avoir une idée approximative de la factorisation matricielle en tant que recommandation, bien qu'elle soit en anglais, les matériaux suivants sont faciles à comprendre. Matrix Factorization Techniques For Recommender Systems

J'expliquerai brièvement l'image en citant la figure de cette diapositive. En supposant le prix Netflix, où la méthode NMF est devenue célèbre, une matrice est donnée qui montre l'utilisateur et combien de points l'utilisateur a donné à quelle vidéo (matrice de notation à gauche). Si l'utilisateur a noté la vidéo, elle a été notée de 1 à 5, et si elle n'était pas notée, 0 a été saisi. Le fait que 0 soit inclus est au cœur de ce problème, et nous prédisons la vraie valeur de ce 0. Cette matrice de notation est décomposée en deux matrices, «fonctionnalité x utilisateur» et «fonctionnalité x film». En gros, NMF est une méthode pour bien effectuer la décomposition matricielle.

Screen Shot 2016-12-23 at 01.21.41.png

Formulation NMF

\mathbf{R}:Rating Matrix \mathbf{P}:User Feature Matrix \mathbf{Q}:Movie Feature Matrix Quand, il est décomposé pour que l'erreur entre $ \ mathbf {R} $ et $ \ mathbf {P} \ times \ mathbf {Q} ^ T $ soit petite.

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

L'erreur peut être exprimée par $ e_ {ij} ^ 2 $.


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

Cependant, les éléments approximatifs $ \ hat {\ mathbf {R}} $ sont les suivants

\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)

Implémentation avec scikit-learn

C'est facile d'appeler. Par exemple, le code lorsque la matrice de notation est R et la dimension d'entité est 2 est le suivant.

from sklearn.decomposition import NMF
model = NMF(n_components=2, init='random', random_state=0) # n_Spécifiez la dimension de la fonction avec les composants
P = model.fit_transform(R) #Apprentissage
Q = model.components_

Exemple concret

Supposons que R est une matrice 5x4 comme celle-ci: Les nombres de cette matrice sont utilisés sur ce site. J'ai évoqué l'exemple.

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

#La partie 0 est inconnue
R = np.array([
        [5, 3, 0, 1],
        [4, 0, 0, 1],
        [1, 1, 0, 5],
        [1, 0, 0, 4],
        [0, 1, 5, 4],
        ]
    )

#Essayez de changer la cote de la fonction k de 1 à 3
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 est")
    print(P)
    print("Q^T est")
    print(Q)
    print("P×Q^T est")
    print(np.dot(P,Q))
    print("R-P×Q^T est")
    print(model.reconstruction_err_ )

Le résultat de sortie est le suivant.

****************************
k: 1
P est
[[ 0.95446553]
 [ 0.64922245]
 [ 1.12694515]
 [ 0.87376625]
 [ 1.18572187]]
Q^T est
[[ 1.96356213  1.0846958   1.24239928  3.24322704]]
P×Q^T est
[[ 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 est
7.511859871919941
****************************
k: 2
P est
[[ 0.          1.69547254]
 [ 0.          1.13044637]
 [ 1.38593123  0.42353044]
 [ 1.08595617  0.3165454 ]
 [ 2.01891156  0.        ]]
Q^T est
[[ 0.          0.32199795  1.40668938  2.58501889]
 [ 3.09992487  1.17556787  0.          0.85823043]]
P×Q^T est
[[ 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 est
4.2765298341191516
****************************
k: 3
P est
[[ 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 est
[[ 0.          0.38636917  1.90213535  1.02176621]
 [ 2.62017626  1.02934221  0.          0.08629708]
 [ 0.          0.02388804  0.          1.43875694]]
P×Q^T est
[[ 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 est
1.8626938982246695

La matrice d'observation R était une matrice 5 × 4. Lorsque vous essayez différents k, vous pouvez voir que P est une matrice 5 × k et Q ^ T est une matrice k × 4.

De plus, dans P × Q ^ T, on estime qu'il était 0 dans R. Par exemple, lorsque k = 2, le $ \ hat {\ mathbf {R}} $ suivant est complété. (La partie où les lettres en gras sont prédites)

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

Quelle valeur k devrait être est un problème difficile, et on dit que cela dépend des données d'entrée (R).

Dans ce cas, comment déterminer quel k est meilleur? (Veuillez enseigner si vous savez)

Lien

Recommended Posts

Factorisation matricielle non négative (NMF) avec scikit-learn
J'ai essayé la décomposition matricielle non négative (NMF) avec TensorFlow
Visualisation de l'apprentissage NMF (Non-Negative Matrix Factor Decomposition)
Problème de valeur initiale de NMF (Décomposition en facteurs matriciels non négatifs)
J'ai essayé de refaire la factorisation matricielle non négative (NMF)
Isomap avec Scikit-learn
DBSCAN avec scikit-learn
Clustering avec scikit-learn (1)
Clustering avec scikit-learn (2)
PCA avec Scikit-learn
kmeans ++ avec scikit-learn
Validation croisée avec scikit-learn
SVM multi-classes avec scikit-learn
Clustering avec scikit-learn + DBSCAN
Apprentissage Scikit-Learn avec la chimioinfomatique
Mise en œuvre de la factorisation matricielle (python)
DBSCAN (clustering) avec scikit-learn
Concaténation de matrices avec Numpy
Installez scikit.learn avec pip
Calculer tf-idf avec scikit-learn
Système de recommandation utilisant la décomposition matricielle [Apprentissage non supervisé avec python Chapitre 10]
Réseau de neurones avec Python (scikit-learn)
Essayez l'opération matricielle avec NumPy
Traitement parallèle avec Parallel de scikit-learn
[Python] Régression linéaire avec scicit-learn
Factorisation prime avec O (n ^ (1/4))
Régression linéaire robuste avec scikit-learn