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 -
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) :
Je vous remercie.
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:
- Trouver le nombre de composantes optimal pour NMF
- Trouver adresse mac - Guide
- Comment trouver le mot de passe wifi sur son téléphone - Guide
- Connaitre les composants de son pc - Guide
- Trouver un film sans le titre - Télécharger - Divers TV & Vidéo
- Nombre de jours entre deux dates excel - Guide
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?
quel souci as-tu rencontré avec ton idée?
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?
As-tu partagé un code que nous pouvons tester?
Je vous remercie pour votre retour.
Voici le code ci-dessous :
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.
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.
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
Sais-tu comment calculer la distance entre un point et une droite?