如何解决sns.distplot的KDE和直方图频率之间的差异
我从sns密度图中观察到的结果令人困惑。
的结果:
sns.distplot(subset['difference_ratio'],kde = True,label =label,hist=False).set(xlim=(0,1))
在下面:
结果:
sns.distplot(subset['difference_ratio'],kde = False,hist=True).set(xlim=(0,1))
在下面:
该图如何解释为类似行为?
解决方法
直方图的默认y轴显示每个箱中的样本数。 kdeplot的y轴将所有内容标准化,以使曲线下的总面积为1。设置norm_hist=True
的操作类似于y轴:对所有值进行缩放,以使条形的面积总计为一。
直方图将所有样本置于每个bin边界之间,将落入该bin中。不能区分该值是落在容器的左侧,右侧还是中央。
另一方面,kde图会获取每个样本值,并在其上绘制一条小的高斯钟形曲线。然后,将所有钟形曲线求和,以形成最终曲线。钟形曲线具有一定的宽度,使kde曲线比直方图宽一些。通常,kdeplot假定基础分布相当平滑,并且在边缘附近缓慢变为零。
以下图比较了典型样本的直方图和kdeplot。样品以红色显示,在x轴上的位置和随机的y值(以避免过多的重叠)。
from matplotlib import pyplot as plt
import numpy as np
import seaborn as sns
samples = np.clip(0.5 + np.random.uniform(-.2,.2,(10,10)).cumsum(axis=0).ravel(),1)
ax = sns.distplot(samples)
x,y = ax.lines[-1].get_data() # get the coordinates of the kde curve
ax.scatter(samples,[np.random.uniform(0,np.interp(samp,x,y)) for samp in samples],color='crimson')
plt.show()
请注意,kde曲线比直方图平滑得多,并且kde曲线不会突然变为零。
PS:要精确对齐两个(或多个)分布的分箱,请注意,分箱数是根据样本数计算得出的。而且边界是从样本数据中获取的。如果您确定两个样本集的最大值和最小值完全相同,则可以将bins=
设置为相同的数字。
但是,通常,连续分布的极端情况有所不同。在这种情况下,您可以显式计算垃圾箱:
xmin = min(min(samples['Detractor']),min(samples['Promoter']))
xmax = max(max(samples['Detractor']),max(samples['Promoter']))
bins = np.linspace(xmin,xmax,10)
,
对于相同数据观察到的不同行为是因为在sns(季节性)kde图和sns直方图图中,bin的总数不同。默认情况下,seaborn distplot使用Freedman-Diaconis rule来计算bin,因此由于bin大小的差异,使图的形状变得不同。
现在,如果我使用:
sns.distplot(subset['difference_ratio'],bins=10,kde = False,label =label,hist=True).set(xlim=(0,1))
输出图与kde图相同:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。