gpt4 book ai didi

python - 使用 scipy.stats 拟合非标准化分布

转载 作者:太空宇宙 更新时间:2023-11-03 14:39:47 25 4
gpt4 key购买 nike

我正在尝试拟合直方图,但拟合仅适用于标准化数据,即直方图中使用选项 normed=True。有没有办法用 scipy stats (或其他方法)来做到这一点?这是使用均匀分布的 MWE:

import matplotlib.pyplot as plt
import numpy as np
import random
from scipy.stats import uniform

data = []
for i in range(1000):
data.append(random.uniform(-1,1))

loc, scale = uniform.fit(data)

x = np.linspace(-1,1, 1000)
y = uniform.pdf(x, loc, scale)

plt.hist(data, bins=100, normed=False)
plt.plot(x, y, 'r-')
plt.show()

enter image description here

我也尝试定义自己的函数(如下),但我不太适合。

import matplotlib.pyplot as plt
import numpy as np
import random
from scipy import optimize

data = []
for i in range(1000):
data.append(random.uniform(-1,1))

def unif(x,avg,sig):
return avg*x + sig

y, base = np.histogram(data,bins=100)
x = [0.5 * (base[i] + base[i+1]) for i in xrange(len(base)-1)]

popt, pcov = optimize.curve_fit(unif, x, y)
x_fit = np.linspace(x[0], x[-1], 100)
y_fit = unif(x_fit, *popt)

plt.hist(data, bins=100, normed=False)
plt.plot(x_fit, y_fit, 'r-')
plt.show()

enter image description here

最佳答案

请注意,将分布拟合到直方图通常不是一个好主意。与原始数据相比,直方图包含的信息较少,因此拟合很可能更差。因此,问题中的第一个 MWE 实际上包含了最佳方法。只需对直方图进行标准化,它将匹配数据的分布:plt.hist(data, bins=100,normed=True)

但是,您似乎实际上想使用非标准化直方图。在这种情况下,采用直方图通常使用的归一化并将其反转应用于拟合分布。 documentation将标准化描述为

n/(len(x)`dbin)

这是冗长的说法,除以观察数乘以箱宽

将分布乘以该值即可得到每个 bin 的预期计数:

loc, scale = uniform.fit(data)

x = np.linspace(-1,1, 1000)
y = uniform.pdf(x, loc, scale)

n_bins = 100
bin_width = np.ptp(data) / n_bins

plt.hist(data, bins=n_bins, normed=False)
plt.plot(x, y * len(data) * bin_width, 'r-')

enter image description here

<小时/>

第二个 MWE 很有趣,因为您描述了该行不适合,但实际上它非常适合:)。您只是过度拟合直方图,因为尽管您期望一条水平线(一个自由度),但您却拟合了一条任意线(两个自由度)。

所以,如果你想要一条水平线适合一条水平线,并且如果你适合其他东西,不要惊讶地得到其他东西......

def unif(x, sig):
return 0 * x + sig # slope is zero -> horizontal line

但是,有一种更简单的方法来获取非标准化均匀分布的高度。只需对所有箱的直方图进行平均即可:

y, base = np.histogram(data,bins=100)
y_hat = np.mean(y)
print(y_hat)
# 10.0

或者,更简单的是使用 len(data)/n_bins == 10 的理论值。

关于python - 使用 scipy.stats 拟合非标准化分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46625750/

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