【发布时间】:2019-01-13 18:17:16
【问题描述】:
我有一组整数值,我想将它们设置为 Weibull 分布并获得最佳拟合参数。然后我使用最佳拟合参数将数据的直方图与 Weibull 分布的 pdf 一起绘制。这是我使用的代码。
from jtlHandler import *
import warnings
import numpy as np
import pandas as pd
import scipy.stats as st
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
def get_pdf(latencies):
a = np.array(latencies)
ag = st.gaussian_kde(a)
ak = np.linspace(np.min(a), np.max(a), len(a))
agv = ag(ak)
plt.plot(ak,agv)
plt.show()
return (ak,agv)
def fit_to_distribution(distribution, data):
params = distribution.fit(data)
# Return MLEs for shape (if applicable), location, and scale parameters from data.
#
# MLE stands for Maximum Likelihood Estimate. Starting estimates for the fit are given by input arguments; for any arguments not provided with starting estimates, self._fitstart(data) is called to generate such.
return params
def make_distribution_pdf(dist, params, end):
arg = params[:-2]
loc = params[-2]
scale = params[-1]
# Build PDF and turn into pandas Series
x = np.linspace(0, end, end)
y = dist.pdf(x, loc=loc, scale=scale, *arg)
pdf = pd.Series(y, x)
return pdf
latencies = getLatencyList("filename")
latencies = latencies[int(9*(len(latencies)/10)):len(latencies)]
data = pd.Series(latencies)
params = fit_to_distribution(st.weibull_max, data)
print("Parameters for the fit: "+str(params))
# Make PDF
pdf = make_distribution_pdf(st.weibull_max, params, max(latencies))
# Display
plt.figure()
ax = pdf.plot(lw=2, label='PDF', legend=True)
data.plot(kind='hist', bins=200, normed=True, alpha=0.5, label='Data',
legend=True, ax=ax)
ax.set_title('Weibull distribution')
ax.set_xlabel('Latnecy')
ax.set_ylabel('Frequency')
plt.savefig("image.png")
可以看出,Weibull 近似与数据的原始分布并不相似。
如何获得数据的最佳 Weibull 近似值?
【问题讨论】:
-
根据直方图的形状,您应该使用
weibull_min,而不是weibull_max。 -
我不知道这个例子。一些一般性的建议。 (1) 将参数估计与绘图分开,分别调试。 (2) 你得到的参数估计是什么?考虑到数据,它们是否合理?如果您构建一个您知道先验正确估计的数据集怎么办?例如从具有特定参数的分布中生成随机数据。 (3) 关于绘图,给定参数,您是否得到合理的结果?如果用已知参数替换分布怎么办?希望这会有所帮助。
标签: python scipy statistics weibull