[PYTHON] Problème de valeur initiale de NMF (Décomposition en facteurs matriciels non négatifs)

Cet article est le 11ème jour du Furukawa Lab Advent_calendar. Cet article a été rédigé par un étudiant du Furukawa Lab dans le cadre de leur apprentissage. Le contenu peut être ambigu ou l'expression peut être légèrement différente.

introduction

Article précédent Qu'est-ce que NMF? C'était un article pour ceux qui étudient la NMF pour la première fois. Dans cet article, nous allons implémenter la bibliothèque NMF de sklearn et voir la différence d'erreur en fonction de la valeur initiale.

Problème de valeur initiale NMF

Avant de commencer à apprendre à NMFW,HVous devez définir la valeur initiale de. La figure ci-dessous montre le cas où la valeur initiale du premier apprentissage est aléatoire.W,HValeur estimée du premier apprentissage en appliquant une valeur aléatoire à\hat{Y}Calculer. Puis les données originalesYCalculez l'erreur avec||Y-\hat{Y}||Être plus petitW,HSera mis à jour. Pour cette valeur initiale aléatoire, la valeur estimée après l'entraînement\hat{Y}Dépend de la valeur aléatoire. En d'autres termes, une valeur estimée qui diffère à chaque fois en fonction de la valeur aléatoire\hat{Y}Il y a un problème qui surgit. Il existe de nombreuses façons de résoudre le problème de la valeur initiale NMF, mais une certaine estimation\hat{Y}En plus de l'initialisation aléatoire dans la bibliothèque NMF de sklearn pour obtenir nndsvd,nndsvda,Vous pouvez sélectionner nndsvdar et l'initialiser avec ces méthodes pour obtenir une estimation constante. Document de référence pour nndsvd[1]Jetez un œil à ceci.

image.png

sklearn.decomposition.NMF Dans NMF de sklearn, vous pouvez sélectionner 5 types de méthodes d'initialisation. Cette fois, nous comparerons quatre types de méthodes (nndsvd, nndsvda, nndsvdar, random) autres que la valeur initiale personnalisée. L'erreur utilise Frobenius. Le résultat de la comparaison est le suivant.

image.png

aléatoire montre l'erreur moyenne de 10 fois. Après avoir appris 100 fois, l'erreur des autres méthodes est inférieure à la valeur initiale aléatoire. On peut également voir que l'erreur dans nndsvd et nndsvdar au stade initial de l'apprentissage est plus petite que aléatoire. Par conséquent, il semble préférable d'utiliser nndsvd comme valeur initiale pour ces données.

Python code

from sklearn.decomposition import NMF
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(1)
X = np.random.rand(100, 10)
x_plot=np.arange(1,11,1)
time=100
x_plot_t = np.arange(1, time+1, 1)

loss_t = np.ones(time)
loss_t1 = np.empty((time,100))
loss_t2 = np.empty(time)
loss_t3 = np.empty(time)


for j in range(time):



    model_t = NMF(n_components= 10, init='nndsvd', random_state=1, max_iter=j+1, beta_loss=2,solver='cd')# ,l1_ratio=1,alpha=0.7)
    Wt = model_t.fit_transform(X)
    Ht = model_t.components_
    loss_t[j] = model_t.reconstruction_err_


    model_t2 = NMF(n_components=10, init='nndsvda', random_state=1, max_iter=j + 1, beta_loss=2,solver='cd' )#,l1_ratio=1,alpha=0.7)
    Wt2 = model_t2.fit_transform(X)
    Ht2 = model_t2.components_
    loss_t2[j] = model_t2.reconstruction_err_

    model_t3 = NMF(n_components=10, init='nndsvdar', random_state=1, max_iter=j + 1, beta_loss=2,solver='cd')# ,l1_ratio=1,alpha=0.7)
    Wt3 = model_t3.fit_transform(X)
    Ht3 = model_t3.components_
    loss_t3[j] = model_t3.reconstruction_err_
    
for j in range(100):
    
    for r in range(10):
        model_t1 = NMF(n_components=10, init='random', random_state=r, max_iter=j+1, beta_loss=2,solver='cd')#, l1_ratio=1, alpha=0.7)
        Wt1 = model_t1.fit_transform(X)
        Ht1 = model_t1.components_
        loss_t1[j,r] = model_t1.reconstruction_err_
    
    
    
    
loss_t1 = np.sum(loss_t1, axis=1) * 0.1
plt.plot(x_plot_t,loss_t,label="nndsvd",color='b')
plt.plot(x_plot_t, loss_t1,color='red',label="random")
plt.plot(x_plot_t, loss_t2,label="nndsvda",color='orange')
plt.plot(x_plot_t, loss_t3,label="nndsvdar",color='g')


plt.xlabel("epoch")
plt.ylabel("error")
plt.legend()
plt.show()

Les références

[1] http://scgroup.hpclab.ceid.upatras.gr/faculty/stratis/Papers/HPCLAB020107.pdf [2] https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.NMF.html

Recommended Posts

Problème de valeur initiale de NMF (Décomposition en facteurs matriciels non négatifs)
Visualisation de l'apprentissage NMF (Non-Negative Matrix Factor Decomposition)
Factorisation matricielle non négative (NMF) avec scikit-learn
J'ai essayé la décomposition matricielle non négative (NMF) avec TensorFlow
J'ai essayé de refaire la factorisation matricielle non négative (NMF)
Résolution du problème de la valeur initiale des équations différentielles ordinaires avec JModelica
Essayez de décomposer la matrice daimyo par valeur singulière
[Calcul scientifique / technique par Python] Solution numérique d'équations différentielles ordinaires du premier ordre, problème de valeur initiale, calcul numérique
[Calcul scientifique / technique par Python] Solution numérique d'une équation différentielle ordinaire du second ordre, problème de valeur initiale, calcul numérique