gpt4 book ai didi

python - Seaborn KDEPlot - 数据变化不够?

转载 作者:行者123 更新时间:2023-12-03 19:42:21 25 4
gpt4 key购买 nike

我有一个包含 ~900 行的数据框;我正在尝试为某些列绘制 KDEplots。在某些列中,大多数值是相同的最小值。当我包含太多最小值时,KDEPlot 会突然停止显示最小值。例如,以下包括 600 个值,其中 450 个是最小值,并且绘图看起来不错:

y = df.sort_values(by='col1', ascending=False)['col1'].values[:600]
sb.kdeplot(y)

enter image description here

但是包括 451 个最小值给出了非常不同的输出:
y = df.sort_values(by='col1', ascending=False)['col1'].values[:601]
sb.kdeplot(y)

enter image description here

最终,我想绘制不同列的双变量 KDEPlots,但我想先了解这一点。

最佳答案

问题是为 kde 的“带宽”选择的默认算法. The default method'scott' ,当有许多相等的值时,这不是很有帮助。
带宽是位于每个采样点并相加的高斯线的宽度。较低的带宽更接近数据,较高的带宽使一切变得平滑。甜蜜点在中间的某个地方。在这种情况下 bw=0.3可能是一个不错的选择。为了比较不同的kde,建议每次选择完全相同的带宽。
下面是一些示例代码来显示 bw='scott' 之间的区别和 bw=0.3 .示例数据是来自标准正态分布的 150 个值以及 400、450 或 500 个固定值。

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns; sns.set()

fig, axs = plt.subplots(nrows=2, ncols=3, figsize=(10,5), gridspec_kw={'hspace':0.3})

for i, bw in enumerate(['scott', 0.3]):
for j, num_same in enumerate([400, 450, 500]):
y = np.concatenate([np.random.normal(0, 1, 150), np.repeat(-3, num_same)])
sns.kdeplot(y, bw=bw, ax=axs[i, j])
axs[i, j].set_title(f'bw:{bw}; fixed values:{num_same}')
plt.show()
第三个图警告不能使用 Scott 建议的带宽绘制 kde。
example plot
PS:正如@mwascom 在评论中提到的,在这种情况下 scipy.statsmodels.nonparametric.kde 使用(不是 scipy.stats.gaussian_kde )。默认值为 "scott" - 1.059 * A * nobs ** (-1/5.), where A is min(std(X),IQR/1.34) . min()阐明行为的突然变化。 IQR"interquartile range" ,第 75 个和第 25 个百分位数之间的差异。
编辑:自 Seaborn 0.11, the statsmodel backend has been dropped ,因此 kde 仅通过 scipy.stats.gaussian_kde 计算.

关于python - Seaborn KDEPlot - 数据变化不够?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61797760/

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