【问题标题】:Fitting data to weibull distribution将数据拟合到威布尔分布
【发布时间】: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


【解决方案1】:

您可以使用以下两种方法将数据集(数字集)拟合到任何分布。

import os
import matplotlib.pyplot as plt
import sys
import math
import numpy as np
import scipy.stats as st
from scipy.stats._continuous_distns import _distn_names
from scipy.optimize import curve_fit

def fit_to_distribution(distribution, latency_values):
    distribution = getattr(st, distribution)
    params = distribution.fit(latency_values)

    return params


def make_distribution_pdf(distribution, latency_list):
    distribution = getattr(st, distribution)
    params = distribution.fit(latency_list)

    arg = params[:-2]
    loc = params[-2]
    scale = params[-1]
    x = np.linspace(min(latency_list), max(latency_list), 10000)
    y = distribution.pdf(x, loc=loc, scale=scale, *arg)
    return x, y

【讨论】:

    猜你喜欢
    • 2011-05-16
    • 2012-05-17
    • 2014-04-25
    • 2019-08-18
    • 2016-11-10
    • 2013-03-06
    • 2015-10-10
    • 1970-01-01
    • 2014-09-02
    相关资源
    最近更新 更多