[英]Seaborn distplot: fit distribution with some fixed parameres
我想為給定的數據數組x
和 plot 擬合一些分布,比如伽瑪,相應的密度為 function。我可以通過seaborn.distplot
和scipy.stats
輕松實現:
sns.distplot(x, fit = stats.gamma)
但是,假設我希望此分布的某些參數保持固定,例如loc
。 當我使用來自scipy.stats
的fit
function 和 fixed loc
時,我把它寫成
stats.gamma.fit(x, floc = 0)
有沒有辦法通過loc=0
來fit
distplot
function 並獲得相同的結果?
這是一個很好的問題。 要找到給定數據集的 Gamma 分布近似值,您可以使用 liklihood function。這是公式的鏈接。 https://en.wikipedia.org/wiki/Gamma_distribution在這里,我根據給定的伽瑪參數生成了一些隨機數。 然后我使用數據和最大似然來找到分布的參數。
import numpy as np
from scipy.special import psi
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.optimize import fsolve
# Generating Random variable based on Gamma dist:
shape, scale = 3., 5. #
s = np.random.gamma(shape, scale, 1000)
plt.hist(s, 50, density=True)
# Solving Liklihood:
Log_s=np.log(s)
Mean_s=np.mean(s)
Size_s=np.size(s)
k=fsolve(lambda k: np.log(k)-psi(k)-np.log(Mean_s)+(1/Size_s)*np.sum(Log_s),.1)
theta=Mean_s/k
sns.distplot(np.random.gamma(k, theta, 1000), hist=False, label='Gamma')
plt.show()
在sns.distplot(x, fit = stats.gamma)
確實顯示合理圖並且stats.gamma.fit(x, loc = 0)
將給出所需統計量的情況下,可以通過fit_kws
提供參數:
sns.distplot(x, fit = stats.gamma, fit_kws={"loc" : 0})
[此答案基於閱讀文檔而未經測試,因為問題中未提供用例。]
要做到這一點最簡單的方法是使用distplot的配合,但使用所描述的方法不積在這個崗位 。 提供的簡單示例:
import matplotlib.pyplot as plt
import pandas as pd
from scipy import stats
import numpy as np
df = pd.DataFrame(np.random.gamma(2, scale=2, size=5000),
columns=['samples'])
params = stats.gamma.fit(df.samples, loc=0)
xvals = np.linspace(0, df.samples.max())
pdf = lambda x: stats.gamma.pdf(xvals, *params)
yvals = pdf(xvals)
fig, ax1 = plt.subplots()
df.samples.hist(bins=20, ax=ax1, normed=True, label='Samples',
grid=False, edgecolor='k')
plt.plot(xvals, yvals, axes=ax1, c='r', label='Fit')
ax1.legend()
這將導致類似... 沒有足夠的代表嵌入
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.