首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >威布尔分布拟合数据

威布尔分布拟合数据
EN

Stack Overflow用户
提问于 2018-08-06 18:20:42
回答 1查看 1.1K关注 0票数 1

我有一组整数值,我想将它们设置为Weibull分布,并得到最佳的拟合参数。然后,利用最优拟合参数,将数据直方图与Weibull分布的pdf相结合。这是我使用的代码。

代码语言:javascript
复制
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近似与原始数据分布不太接近。

如何才能得到我的数据的最佳威布尔近似?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-16 09:20:48

可以使用以下两种方法将数据集(一组数字)与任何发行版相匹配。

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51713535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档