Ok Producing, so hat mein aktueller Kurvenanpassungscode einen Schritt, den scipy.stats verwendet die richtige Verteilung auf den Daten, um zu bestimmen, basierendeine MLE für ein Paar von Verteilungen in 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])]
wo Daten ein Liste der numerischen Werte. Dies funktioniert bisher sehr gut für die Anpassung unimodaler Verteilungen, bestätigt in einem Skript, das zufällig Werte aus zufälligen Verteilungen erzeugt und curve_fit verwendet, um die Parameter neu zu bestimmen.
Nun würde Ich mag den Code in der Lage machen bimodale Verteilungen zu handhaben, wie im folgenden Beispiel:
Ist es möglich, eine MLE für ein Paar Modelle zu erhalten aus scipy.stats, um festzustellen, ob ein bestimmtes Verteilungspaar für die Daten geeignet ist ?, so etwas wie
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]
und verwenden Sie diese Paare, um einen MLE-Wert dieses Verteilungspaares zu erhalten, der zu den Daten passt?
Vielen Dank, das scheint gut zu funktionieren. Ich bin mir nicht sicher, ob ich verstehe, wie der Code funktioniert. Es sieht so aus, als ob es iterativ zwei verschiedene Normalkurven anpasst, indem es den Datensatz in zwei getrennte Listen sortiert (oder eher die Klassifizierung als Indikator numpy Array verwendet, in welcher Kategorie jeder Datenpunkt fällt?) Das ist erstaunlich, ich hatte keine Ahnung, mit dem man das machen könnte numpy Arrays). Für Fälle, in denen die Verteilungen gut getrennt sind, scheint dies gut zu funktionieren: http://i.imgur.com/8Hrhd0F.png – BruceJohnJennerLawso
Für Verteilungen, die nicht so gut getrennt sind, merke ich, dass die Schleife eine Tendenz hat eine Lösung zu versuchen, die sich ausbreitet, wie [hier] (http://i.imgur.com/KC51SR6.png) und besonders [hier] (http://i.imgur.com/seYzytQ.png). Dies liegt daran, dass die Anfangsbedingungen mit identischen Sigmas und Spread-out-Mitteln beginnen. Vielleicht könnte es sinnvoll sein, mehrere Läufe zu nehmen, um das Paar von Verteilungen mit unterschiedlichen Anfangswerten für mu1/2/sigma1/2 anzupassen und das finale p zu vergleichen Werte. – BruceJohnJennerLawso
Das letzte, was ich herausfinden möchte, ist, wie man multimodal über bimodale hinauspasst. Ich dachte daran, eine Art rekursive Sache zu machen, wo die Schleife für 3 normale Kurven zu einer der Verteilungen passt, eine Normale über die restlichen zwei passt, dann werden die verbleibenden zwei als wirklich schlechte Anpassung identifiziert, und die Schleife wird wie üblich ausgeführt auf sie. Aber es sieht so aus, als ob die Verteilungen gut getrennt sind (http://i.imgur.com/GcByBHwg.png). – BruceJohnJennerLawso