gpt4 book ai didi

python - 如何仅从直方图值创建 KDE?

转载 作者:太空狗 更新时间:2023-10-29 23:56:37 28 4
gpt4 key购买 nike

我有一组值,我想绘制高斯核密度估计,但是我遇到了两个问题:

  1. 我只有条的值,没有值本身
  2. 我正在绘制分类轴

这是我到目前为止生成的情节: HISTOGRAMy 轴的顺序实际上是相关的,因为它代表了每个细菌物种的系统发育。

我想为每种颜色添加一个 gaussian kde 叠加层,但到目前为止我还无法利用 seaborn 或 scipy 来做到这一点。

下面是使用 python 和 matplotlib 绘制上述分组条形图的代码:

enterN = len(color1_plotting_values)
fig, ax = plt.subplots(figsize=(20,30))
ind = np.arange(N) # the x locations for the groups
width = .5 # the width of the bars
p1 = ax.barh(Species_Ordering.Species.values, color1_plotting_values, width, label='Color1', log=True)
p2 = ax.barh(Species_Ordering.Species.values, color2_plotting_values, width, label='Color2', log=True)
for b in p2:
b.xy = (b.xy[0], b.xy[1]+width)

谢谢!

最佳答案

如何从直方图开始绘制“KDE”

核密度估计协议(protocol)需要基础数据。您可以想出一种使用经验 pdf(即直方图)的新方法,但那样它就不是 KDE 分布了。

不过,并不是所有的希望都破灭了。您可以通过首先从直方图中抽取样本,然后对这些样本使用 KDE 来获得 KDE 分布的良好近似值。这是一个完整的工作示例:

import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as sts

n = 100000

# generate some random multimodal histogram data
samples = np.concatenate([np.random.normal(np.random.randint(-8, 8), size=n)*np.random.uniform(.4, 2) for i in range(4)])
h,e = np.histogram(samples, bins=100, density=True)
x = np.linspace(e.min(), e.max())

# plot the histogram
plt.figure(figsize=(8,6))
plt.bar(e[:-1], h, width=np.diff(e), ec='k', align='edge', label='histogram')

# plot the real KDE
kde = sts.gaussian_kde(samples)
plt.plot(x, kde.pdf(x), c='C1', lw=8, label='KDE')

# resample the histogram and find the KDE.
resamples = np.random.choice((e[:-1] + e[1:])/2, size=n*5, p=h/h.sum())
rkde = sts.gaussian_kde(resamples)

# plot the KDE
plt.plot(x, rkde.pdf(x), '--', c='C3', lw=4, label='resampled KDE')
plt.title('n = %d' % n)
plt.legend()
plt.show()

输出:

enter image description here

图中红色虚线和橙色线几乎完全重叠,表明真实 KDE 与通过重采样直方图计算的 KDE 非常吻合。

如果您的直方图真的很嘈杂(就像您在上面的代码中设置 n = 10 时得到的那样),那么在将重采样的 KDE 用于除绘图目的之外的任何其他用途时,您应该谨慎一些:

enter image description here

总的来说,真实 KDE 和重采样 KDE 之间的一致性仍然很好,但偏差很明显。

将您的分类数据整理成适当的形式

由于您还没有发布您的实际数据,我无法给您详细的建议。我认为最好的办法是按顺序对类别进行编号,然后使用该编号作为直方图中每个条形的“x”值。

关于python - 如何仅从直方图值创建 KDE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53823349/

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