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.
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.
Bevor Sie anfangen, bei NMF zu lernen
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.
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()
[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