gpt4 book ai didi

python - 如何在Python中获得Pareto分布的Q-Q图?

转载 作者:行者123 更新时间:2023-12-01 09:06:33 24 4
gpt4 key购买 nike

Q-Q 图用于获取一组数据点与理论分布之间的拟合优度。以下是获取积分的流程。

  1. 选择要使用的示例。对所选样本进行排序,X(i) 表示第 i 个样本
  2. 查找与样本相对应的模型值。这分两步完成,

    a.将每个样本与其代表的百分位相关联。 pi = (i-0.5)/n

    b.计算与该百分位相关的模型值。这是通过反转模型 CDF 来完成的,就像从模型分布生成随机变量时所做的那样。因此样本i对应的模型值为Finverse(pi)。

    c.使用 n 个点绘制 Q-Q 图

( X(i), Finverse(pi)) 1 ≤ i ≤ n

使用这种方法,我想出了以下 python 实现。

_distn_names = ["pareto"]
def fit_to_all_distributions(data):
dist_names = _distn_names

params = {}
for dist_name in dist_names:
try:
dist = getattr(st, dist_name)
param = dist.fit(data)

params[dist_name] = param
except Exception:
print("Error occurred in fitting")
params[dist_name] = "Error"

return params

def get_q_q_plot(values, dist, params):
values.sort()

arg = params[:-2]
loc = params[-2]
scale = params[-1]

x = []

for i in range(len(values)):
x.append((i-0.5)/len(values))

y = getattr(st, dist).ppf(x, loc=loc, scale=scale, *arg)

y = list(y)

emp_percentiles = values
dist_percentiles = y

print("Emperical Percentiles")
print(emp_percentiles)

print("Distribution Percentiles")
print(dist_percentiles)

plt.figure()
plt.xlabel('dist_percentiles')
plt.ylabel('actual_percentiles')
plt.title('Q Q plot')
plt.plot(dist_percentiles, emp_percentiles)
plt.savefig("/path/q-q-plot.png")

b = 2.62
latencies = st.pareto.rvs(b, size=500)
data = pd.Series(latencies)
params = fit_to_all_distributions(data)

pareto_params = params["pareto"]

get_q_q_plot(latencies, "pareto", pareto_params)

理想情况下我应该得到一条直线,但这就是我得到的。

QQ plot

为什么我没有得到一条直线?我的实现有什么问题吗?

最佳答案

您可以使用以下代码获取任何分布的 Q-Q 图(scipy stats 中有 82 个)。

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 get_q_q_plot(latency_values, distribution):

distribution = getattr(st, distribution)
params = distribution.fit(latency_values)

latency_values.sort()

arg = params[:-2]
loc = params[-2]
scale = params[-1]

x = []

for i in range(1, len(latency_values)):
x.append((i-0.5) / len(latency_values))

y = distribution.ppf(x, loc=loc, scale=scale, *arg)

y = list(y)

emp_percentiles = latency_values[1:]
dist_percentiles = y

return emp_percentiles, dist_percentiles

关于python - 如何在Python中获得Pareto分布的Q-Q图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52004249/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com