gpt4 book ai didi

Python/Scipy kde 拟合、缩放

转载 作者:行者123 更新时间:2023-11-28 22:44:58 34 4
gpt4 key购买 nike

我有一个 Python 系列,我想为其直方图拟合密度。问题:是否有一种巧妙的方法可以使用 np.histogram() 中的值来实现此结果? (请参阅下面的更新)

我目前的问题是,我执行的 kde 拟合有(看似)不需要的扭结,如下面的第二个图所示。我希望 kde 适合基于直方图单调递减,这是第一个描绘的数字。下面我包含了我当前的代码。提前致谢

import numpy as np
from matplotlib import pyplot as plt
from scipy.stats import gaussian_kde as kde

df[var].hist()
plt.show() # shows the original histogram
density = kde(df[var])
xs = np.arange(0, df[var].max(), 0.1)
ys = density(xs)
plt.plot(xs, ys) # a pdf with kinks

或者,有没有一种灵活的使用方式

count, div = np.histogram(df[var])

然后缩放计数数组以对其应用 kde()?

original historgram

kde_fit

更新

根据下面 cel 的评论(应该很明显,但我错过了!),在这种情况下,我使用 pandas.DataFrame.hist() 中的默认参数隐式地进行了 under-binning。在我使用的更新情节中

df[var].hist(bins=100)

我会保留这篇文章,以防其他人发现它有用,但我不会介意它是否因为“过于本地化”而被删除。

enter image description here

最佳答案

如果您使用 bw_method 参数增加带宽,那么 kde 看起来会更流畅。本例来自Justin Peel's answer ;代码已被修改以利用 bw_method:

import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import gaussian_kde

data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
density1 = gaussian_kde(data)
bandwidth = 1.5
density2 = gaussian_kde(data, bw_method=bandwidth)
xs = np.linspace(0,8,200)
plt.plot(xs,density1(xs), label='bw_method=None')
plt.plot(xs,density2(xs), label='bw_method={}'.format(bandwidth))
plt.legend(loc='best')
plt.show()

产量

enter image description here

关于Python/Scipy kde 拟合、缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29083429/

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