2017-06-16 1 views
2

Wenn ich den folgenden Code in PythonRuntimewarning wenn scipy.stats.beta.fit mit

from scipy.stats import norm, beta 
sample = beta.rvs(2,5,size=100) 
beta_fit = beta.fit(sample) 

bekomme ich folgende Fehler

/usr/lib/python3/dist-packages/scipy/stats/_continuous_distns.py:404: RuntimeWarning: invalid 
value encountered in sqrt 
sk = 2*(b-a)*sqrt(a + b + 1)/(a + b + 2)/sqrt(a*b) 

und in Abhängigkeit von der Größe der Probe laufen, ich bekomme manchmal auch diesen anderen Fehler

/usr/lib/python3/dist-packages/scipy/optimize/minpack.py:161: RuntimeWarning: 
The iteration is not making good progress, as measured by the improvement from the last ten iterations. 
warnings.warn(msg, RuntimeWarning) 

Weiß jemand, warum das passiert und wie es zu beheben?

Danke!

+1

FYI: Scipy Beta-Verteilung hat vier Parameter. Es gibt zwei Formparameter (α und β im [Wikipedia-Artikel] (https://en.wikipedia.org/wiki/Beta_distribution)). Die anderen beiden Parameter sind [Ort und Maßstab] (https://en.wikipedia.org/wiki/Location%E2%80%93scale_family); Diese passen die [Unterstützung] (https://en.wikipedia.org/wiki/Support_ (Mathematik)) der Distribution an. Standardmäßig berücksichtigt die Methode 'fit()' alle vier Parameter, die für die Anpassung verfügbar sind. Ist es das was du willst? Oder möchten Sie nur die Formparameter anpassen und die Unterstützung auf [0, 1] beibehalten? –

+0

Ich möchte die Unterstützung beibehalten, um [0,1] zu sein, wie stelle ich das auf? Ich nahm an, dass die Funktion "beta.fit" die Standardwerte von loc = 0 und scale = 1 verwendet. Lag ich falsch? – Salva

+0

Standardmäßig enthält 'fit()' 'loc' und' scale' in den Parametern, die passen. Sehen Sie meine Antwort, wie Sie diese beheben können. –

Antwort

2

In einem Kommentar sagen Sie, dass Sie die Unterstützung als [0, 1] beibehalten möchten. Verwenden Sie dazu die Argumente floc=0 und fscale=1, um das mit der fit()-Methode zu tun. Dann werden nur die Formparameter an die Daten angepasst.

from scipy.stats import beta 

sample = beta.rvs(2, 5, size=100) 
beta_fit = beta.fit(sample, floc=0, fscale=1) 

Dies sollte auch die Warnungen beseitigen, die Sie sehen. Diese Warnungen treten auf, weil, wenn alle vier Parameter passen, der Code eine generische numerische Optimierungsroutine verwendet, um die Parameter zu finden, die die Wahrscheinlichkeit maximieren, und etwas in diesem Code diese Warnungen generiert. (Es könnte ein Fehler sein - die Formparameter sollten positiv sein, daher sollte keiner der Aufrufe an sqrt in der Zeile, die die Warnung generiert, ein negatives Argument erhalten.) Wenn Sie den Standort und die Skalierung korrigieren, löst die fit() Methode ein einfacheres numerisches Problem, um die Maximum-Likelihood-Parameterschätzungen zu finden, sodass der Code vermieden wird, der die Warnungen generiert.

Verwandte Themen