Ok, donc ma courbe de courant de code de montage comporte une étape qui utilise scipy.stats pour déterminer la distribution à droite sur la base des données,La production d'un MLE pour une paire de distributions en python
distributions = [st.laplace, st.norm, st.expon, st.dweibull, st.invweibull, st.lognorm, st.uniform]
mles = []
for distribution in distributions:
pars = distribution.fit(data)
mle = distribution.nnlf(pars, data)
mles.append(mle)
results = [(distribution.name, mle) for distribution, mle in zip(distributions, mles)]
for dist in sorted(zip(distributions, mles), key=lambda d: d[1]):
print dist
best_fit = sorted(zip(distributions, mles), key=lambda d: d[1])[0]
print 'Best fit reached using {}, MLE value: {}'.format(best_fit[0].name, best_fit[1])
print [mod[0].name for mod in sorted(zip(distributions, mles), key=lambda d: d[1])]
Lorsque des données est un liste de valeurs numériques. Cela fonctionne très bien jusqu'ici pour ajuster des distributions unimodales, confirmées dans un script qui génère aléatoirement des valeurs à partir de distributions aléatoires et utilise curve_fit pour redéfinir les paramètres.
Maintenant, je voudrais rendre le code capable de gérer les distributions bimodale, comme dans l'exemple ci-dessous:
Est-il possible d'obtenir un MLE pour une paire de modèles de scipy.stats afin de déterminer si une paire particulière de distributions est un bon ajustement pour les données ?, quelque chose comme
distributions = [st.laplace, st.norm, st.expon, st.dweibull, st.invweibull, st.lognorm, st.uniform]
distributionPairs = [[modelA.name, modelB.name] for modelA in distributions for modelB in distributions]
et utilisez ces paires pour obtenir une valeur MLE de cette paire de distributions correspondant aux données?
Merci beaucoup, cela semble bien fonctionner. Je ne suis pas sûr de comprendre le fonctionnement du code? Il ressemble à son itérativement deux courbes normales différentes en triant l'ensemble de données dans deux listes séparées (ou plutôt en utilisant la classification comme un indicateur numpy tableau de la catégorie de chaque point de données tombe? C'est incroyable, je ne savais pas que vous pourriez le faire avec tableaux numériques). Pour les cas où les distributions sont bien séparées, cela semble bien fonctionner: http://i.imgur.com/8Hrhd0F.png – BruceJohnJennerLawso
Pour les distributions qui ne sont pas si bien séparées, je remarque que la boucle a tendance pour essayer de forcer une solution qui est répartie, comme [ici] (http://i.imgur.com/KC51SR6.png) et surtout [ici] (http://i.imgur.com/sEYzytQ.png). Je devine que cela est dû aux conditions initiales commençant par des sigmas et des moyens d'étalement identiques, peut-être cela pourrait-il logique de prendre plusieurs séries pour ajuster la paire de distributions avec des valeurs initiales différentes pour mu1/2/sigma1/2 valeurs. – BruceJohnJennerLawso
La dernière chose que j'essaie de comprendre est de savoir comment adapter multimodal au-delà du bimodal. Je pensais faire une sorte de chose récursive où pour 3 courbes normales, la boucle correspond à l'une des distributions, correspond à une normale sur les deux autres, puis les deux restants sont identifiés comme ayant un mauvais ajustement, et la boucle fonctionne comme d'habitude sur eux. Mais il semble que [l'ajustement ne soit pas très bon] (http://i.imgur.com/GcByBHwg.png), même lorsque les distributions sont bien séparées. – BruceJohnJennerLawso