[PYTHON] Anfangswertproblem der NMF (nicht negative Matrixfaktorzerlegung)

Dieser Artikel ist der 11. Tag des Furukawa Lab Advent_calendar. Dieser Artikel wurde von einem Studenten des Furukawa Lab als Teil seines Lernens geschrieben. Der Inhalt kann mehrdeutig sein oder der Ausdruck kann leicht abweichen.

Einführung

Vorheriger Artikel Was ist NMF? Es war ein Artikel für diejenigen, die zum ersten Mal NMF studieren. In diesem Artikel implementieren wir die NMF-Bibliothek von sklearn und sehen den Fehlerunterschied in Abhängigkeit vom Anfangswert.

NMF-Anfangswertproblem

Bevor Sie anfangen, bei NMF zu lernenW,HSie müssen den Anfangswert von festlegen. Die folgende Abbildung zeigt den Fall, in dem der Anfangswert des ersten Lernens zufällig ausgewählt wird.W,HGeschätzter Wert des ersten Lernens durch Anwenden eines zufälligen Wertes auf\hat{Y}Berechnen. Dann die OriginaldatenYBerechnen Sie den Fehler mit||Y-\hat{Y}||Kleiner seinW,HWird Aktualisiert. Für diesen zufälligen Anfangswert der geschätzte Wert nach dem Training\hat{Y}Kommt auf den Zufallswert an. Mit anderen Worten, ein geschätzter Wert, der sich jedes Mal in Abhängigkeit vom Zufallswert unterscheidet\hat{Y}Es kommt ein Problem heraus. Es gibt viele Möglichkeiten, das NMF-Anfangswertproblem zu lösen, aber eine bestimmte Schätzung\hat{Y}Zusätzlich zur zufälligen Initialisierung in der NMF-Bibliothek von sklearn, um nndsvd zu erhalten,nndsvda,Sie können nndsvdar auswählen und mit diesen Methoden initialisieren, um eine konstante Schätzung zu erhalten. Nachschlagewerk für nndsvd[1]Schau dir das an.

image.png

sklearn.decomposition.NMF In sklearns NMF können Sie 5 Arten von Initialisierungsmethoden auswählen. Dieses Mal werden wir vier Arten von Methoden (nndsvd, nndsvda, nndsvdar, random) außer dem benutzerdefinierten Anfangswert vergleichen. Der Fehler verwendet Frobenius. Das Vergleichsergebnis ist wie folgt.

image.png

zufällig zeigt den durchschnittlichen Fehler von 10 mal. Nach 100-maligem Lernen ist der Fehler anderer Methoden kleiner als der zufällige Anfangswert. Es ist auch ersichtlich, dass der Fehler in nndsvd und nndsvdar in der Anfangsphase des Lernens kleiner als zufällig ist. Daher scheint es besser, nndsvd als Anfangswert für diese Daten zu verwenden.

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

Verweise

[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

Anfangswertproblem der NMF (nicht negative Matrixfaktorzerlegung)
Visualisierung des NMF-Lernens (Non-Negative Matrix Factor Decomposition)
Nicht negative Matrixfaktorisierung (NMF) mit Scikit-Learn
Ich habe mit TensorFlow eine nicht negative Matrixzerlegung (NMF) versucht
Ich habe versucht, die nicht negative Matrixfaktorisierung (NMF) zu wiederholen.
Lösung des Anfangswertproblems gewöhnlicher Differentialgleichungen mit JModelica
Versuchen Sie, die Daimyo-Matrix durch einen Singularwert zu zerlegen
[Wissenschaftlich-technische Berechnung mit Python] Numerische Lösung gewöhnlicher Differentialgleichungen erster Ordnung, Anfangswertproblem, numerische Berechnung
[Wissenschaftlich-technische Berechnung mit Python] Numerische Lösung der gewöhnlichen Differentialgleichung zweiter Ordnung, Anfangswertproblem, numerische Berechnung