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.
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.
\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)
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_
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)
référence scikit learn
Qu'est-ce que la factorisation matricielle (qiita facile à comprendre)
Techniques de factorisation matricielle pour les systèmes de recommandation
Recommended Posts