You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调整直方图的Kernel Density Estimation(KDE)平滑度以贴合直方图形态?

问题与解答

问题描述

我通过以下代码可视化了带有核密度估计(KDE)的直方图:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

df = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/diamonds.csv')

plt.subplots(figsize=(7,6), dpi=100)
sns.histplot(df.loc[df.cut=='Good', 'depth'], bins= 100, color="blue", label="pcts", kde = True)

plt.title('Iris Histogram')
plt.legend();

生成的KDE曲线过于平滑,我想调整它让曲线更贴合直方图的形状(类似更尖锐、跟随直方图起伏的曲线)。另外我也疑惑:是不是我混淆了概念,想要的其实是概率密度函数(PDF)?

解答

概念澄清

你没有混淆概念——KDE(核密度估计)本身就是对概率密度函数(PDF)的非参数估计方法,你想要的其实是带宽更小、拟合度更高的KDE曲线,而非另一种完全不同的曲线。

调整方法

Seaborn的histplot中,通过kde_kws参数传入配置字典,调整KDE的**带宽(bandwidth)**即可让曲线更贴合直方图:

  • 使用bw_adjust参数:这是相对于默认带宽的缩放比例,值越小,带宽越小,曲线越“尖锐”、越贴合局部数据;值越大则越平滑。
  • 也可以用bw_method直接指定带宽数值,不过bw_adjust更直观易用。

修改后的代码示例

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

df = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/diamonds.csv')

plt.subplots(figsize=(7,6), dpi=100)
# 通过kde_kws设置bw_adjust减小带宽,让KDE更贴合直方图
sns.histplot(
    df.loc[df.cut=='Good', 'depth'], 
    bins=100, 
    color="blue", 
    label="pcts", 
    kde=True,
    kde_kws={'bw_adjust': 0.2}  # 可尝试0.1-0.5区间的数值,找到符合预期的效果
)

plt.title('Diamonds Good Cut - Depth Distribution')  # 修正标题(原标题与数据集不匹配)
plt.legend();

说明

你可以根据需求调整bw_adjust的数值:比如0.2会让曲线明显贴合直方图的起伏,0.5则比默认更光滑但贴合度更高。如果需要更精细的控制,也可以用bw_method传入具体带宽值(比如bw_method=0.3),直接定义核函数的带宽大小。

内容的提问来源于stack exchange,提问作者Swawa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 14:20:19