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.
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.
Avant de commencer à apprendre à NMF
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.
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()
[1] http://scgroup.hpclab.ceid.upatras.gr/faculty/stratis/Papers/HPCLAB020107.pdf [2] https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.NMF.html