Trouver le nombre de composantes optimal pour NMF

Fermé
FerhatYous Messages postés 20 Date d'inscription jeudi 24 février 2022 Statut Membre Dernière intervention 8 août 2022 - Modifié le 11 avril 2022 à 13:57
yg_be Messages postés 23325 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 - 11 avril 2022 à 20:59
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.

2 réponses

yg_be Messages postés 23325 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 Ambassadeur 1 551
Modifié le 11 avril 2022 à 16:37
bonjour,
quel souci as-tu rencontré avec ton idée?
1
FerhatYous Messages postés 20 Date d'inscription jeudi 24 février 2022 Statut Membre Dernière intervention 8 août 2022
11 avril 2022 à 16:43
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 23325 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 1 551 > FerhatYous Messages postés 20 Date d'inscription jeudi 24 février 2022 Statut Membre Dernière intervention 8 août 2022
11 avril 2022 à 17:29
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 23325 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 Ambassadeur 1 551
11 avril 2022 à 16:40
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 jeudi 24 février 2022 Statut Membre Dernière intervention 8 août 2022
Modifié le 11 avril 2022 à 17:29
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 23325 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 1 551 > FerhatYous Messages postés 20 Date d'inscription jeudi 24 février 2022 Statut Membre Dernière intervention 8 août 2022
11 avril 2022 à 17:31
name 'make_blobs' is not defined
0
FerhatYous Messages postés 20 Date d'inscription jeudi 24 février 2022 Statut Membre Dernière intervention 8 août 2022 > yg_be Messages postés 23325 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024
11 avril 2022 à 17:40
Rajoutez ça pour l'importer :

from sklearn.datasets import make_blobs
0
yg_be Messages postés 23325 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 1 551 > FerhatYous Messages postés 20 Date d'inscription jeudi 24 février 2022 Statut Membre Dernière intervention 8 août 2022
11 avril 2022 à 17:41
Merci de partager un code que nous pouvons tester.
0
yg_be Messages postés 23325 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 1 551 > yg_be Messages postés 23325 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024
11 avril 2022 à 17:42
name 'NMF' is not defined
0