Trouver le nombre de composantes optimal pour NMF

FerhatYous Messages postés 20 Date d'inscription   Statut Membre Dernière intervention   -  
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Je veux réaliser une NMF (non negative matrix factorization) sur mes données, mais pour ça il me faut un nombre de composantes.
Pour trouver le bon nombre de composantes, j'essaie de calculer les erreur de construction pour un k allant de 1 a 10 puis j'affiche le graphique.
Le problème c'est que le coude n'est pas vraiment visible sur mon graphique, par conséquent je peux pas choisir un k optimal.
J'ai pensé à l'idée de tracer une ligne entre le début et la fin de ma courbe, puis calculer la distance la plus éloignée entre la ligne et la courbe et projeter le point sur les abscisses mais j'arrive pas à le réaliser..
Y'a t-il une autre méthode que celle la ?


Voici le code pour tracer ma courbe ( Docterm c'est ma matrice) :

import matplotlib.pyplot as plt
sse = {}
for k in range(1, 10):
print("itération..")
model = NMF(n_components=k,init = "nndsvda", beta_loss="kullback-leibler", solver="mu")
W = model.fit_transform(DocTerm)
H = model.components_

sse[k] = model.reconstruction_err_
plt.figure()
plt.plot(list(sse.keys()), list(sse.values()))
plt.xlabel("Number of cluster")
plt.ylabel("SSE")
plt.show()


Je vous remercie.
A voir également:

2 réponses

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonjour,
quel souci as-tu rencontré avec ton idée?
1
FerhatYous Messages postés 20 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour,
Enfaite, je cherche un point sur la courbe tel que la distance entre ce point et la ligne reliant le point 1 au point 2 soit maximale. Puis je projette sur l'axe des abscisses. Le problème c'est que j'arrive pas a trouver ce point sur la courbe
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > FerhatYous Messages postés 20 Date d'inscription   Statut Membre Dernière intervention  
 
Qu'as-tu fait pour trouver ce point?
Sais-tu comment calculer la distance entre un point et une droite?
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
Quand je teste ton code, j'ai une erreur à propos de NMF.
As-tu partagé un code que nous pouvons tester?
0
FerhatYous Messages postés 20 Date d'inscription   Statut Membre Dernière intervention  
 
Je vous remercie pour votre retour.
Voici le code ci-dessous :


center_box = (100, 700) # defines the box that cluster centres are allowed to be in
standard_dev = 15 # defines the standard deviation of clusters
X, y = make_blobs(n_samples=200, n_features=50, center_box=center_box, cluster_std=standard_dev)


import matplotlib.pyplot as plt
ssee = {}
for kk in range(1, 5):
print("itération..")
modell = NMF(n_components=kk,init = "nndsvda", beta_loss="kullback-leibler", solver="mu")
WW = modell.fit_transform(X)
HH = modell.components_

ssee[kk] = modell.reconstruction_err_
plt.figure()
plt.plot(list(ssee.keys()), list(ssee.values()))
plt.xlabel("Number of cluster")
plt.ylabel("SSE")


plt.show()


print(ssee)


p1 = (1, 797.6556650730292)
p2 = (4, 88.41821321102876)


plt.figure()
plt.plot(list(ssee.keys()), list(ssee.values()))
plt.xlabel("Number of cluster")
plt.ylabel("SSE")
x_values = [p1[0], p2[0]]
y_values = [p1[1], p2[1]]
plt.plot(x_values, y_values, 'r', linestyle="-")
plt.text(p1[0], p1[1], "Point1")
plt.text(p2[0], p2[1], "Point2")
plt.show()




Juste Pour p1 et p2 (ils représentent les points de début et de fin de la courbe, que vous pouvez visualiser avec "print(ssee)" ) il vont être différents pour vous car les données sont générées aléatoirement.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > FerhatYous Messages postés 20 Date d'inscription   Statut Membre Dernière intervention  
 
name 'make_blobs' is not defined
0
FerhatYous Messages postés 20 Date d'inscription   Statut Membre Dernière intervention   > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
Rajoutez ça pour l'importer :

from sklearn.datasets import make_blobs
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > FerhatYous Messages postés 20 Date d'inscription   Statut Membre Dernière intervention  
 
Merci de partager un code que nous pouvons tester.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
name 'NMF' is not defined
0