Python 使用scipy gaussian_KDE和seaborn kdeplot时的衍射KDE渲染

Python 使用scipy gaussian_KDE和seaborn kdeplot时的衍射KDE渲染,python,scipy,seaborn,auc,Python,Scipy,Seaborn,Auc,就目前而言,海洋生物是利用海洋生物来工作的 然而,在使用seaborn和gaussian_kde绘制时,我得到了两种不同的分布,尽管使用了相同的带宽大小 在上图中,如果数据直接输入到gaussian_kde,则左边是分布。如果数据输入到seaborn kdeplot,则正确的绘图是分布 此外,给定边界的曲线下面积在这两种绘制分布的方法之间并不相似 使用gaussian_kde的auc:47.7,使用via seaborn的auc:49.5 我是否可以知道是什么原因导致这种差异,以及是否有一种方

就目前而言,海洋生物是利用海洋生物来工作的

然而,在使用
seaborn
gaussian_kde
绘制时,我得到了两种不同的分布,尽管使用了相同的
带宽
大小

在上图中,如果数据直接输入到
gaussian_kde
,则左边是分布。如果数据输入到
seaborn kdeplot
,则正确的绘图是分布

此外,给定边界的曲线下面积在这两种绘制分布的方法之间并不相似

使用gaussian_kde的auc:47.7,使用via seaborn的auc:49.5

我是否可以知道是什么原因导致这种差异,以及是否有一种方法可以使输出标准化,而不考虑使用何种方法(例如,
seaborn
gaussian_kde

下面给出了再现上述
auc
的代码

import seaborn as sns
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde


time_window_order = ['272', '268', '264', '260', '256', '252', '248', '244', '240']
order_dict = {k: i for i, k in enumerate ( time_window_order )}
df = pd.DataFrame ( {'time_window': ['268', '268', '268', '264', '252', '252', '252', '240',
                                     '256', '256', '256', '256', '252', '252', '252', '240'],
                     'seq_no': ['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a',
                                'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b']} )
df ['centre_point'] = df ['time_window'].map ( order_dict )
filter_band = df ["seq_no"].isin ( ['a'] )
df = df [filter_band].reset_index ( drop=True )
auc_x_min, auc_x_max = 0, 4
bandwith=0.5
########################

plt.subplots(1, 2)
# make the first plot
plt.subplot(1, 2, 1)
kde0 = gaussian_kde ( df ['centre_point'], bw_method=bandwith )
xmin, xmax = -3, 12
x_1 = np.linspace ( xmin, xmax, 500 )
kde0_x = kde0 ( x_1 )
sel_region_x = x_1 [(x_1 > auc_x_min) * (x_1 < auc_x_max)]
sel_region_y = kde0_x [(x_1 > auc_x_min) * (x_1 < auc_x_max)]
auc_bond_1 = np.trapz ( sel_region_y, sel_region_x )
area_whole = np.trapz ( kde0_x, x_1 )
plt.plot ( x_1, kde0_x, color='b', label='KDE' )
plt.ylim(bottom=0)
plt.title(f'Direct gaussian_kde with bw {bandwith}')
plt.fill_between ( sel_region_x, sel_region_y, 0, facecolor='none', edgecolor='r', hatch='xx',
                   label='intersection' )

# make second plot
plt.subplot(1, 2, 2)

g = sns.kdeplot ( data=df, x="centre_point", bw_adjust=bandwith )
c = g.get_lines () [0].get_data ()
x_val = c [0]
kde0_x = c [1]
idx = (x_val> auc_x_min) * (x_val < auc_x_max)
sel_region_x = x_val [idx]
sel_region_y = kde0_x [idx]
auc_bond_2 = np.trapz ( sel_region_y, sel_region_x )
g.fill_between ( sel_region_x, sel_region_y, 0, facecolor='none', edgecolor='r', hatch='xx' )
plt.title(f'Via Seaborn with bw {bandwith}')
plt.tight_layout()
plt.show()

# show much the area differ between these two plotting
print ( f'auc using gaussian_kde : {auc_bond_1 * 100:.1f} and auc using via seaborn : {auc_bond_2 * 100:.1f}' )
x=1
返回

从视觉上看,这两个情节看起来完全相同

但是,图形之间的
auc
仍然返回两个不同的值

使用gaussian_kde的auc:45.1和使用via seaborn的auc:44.6


您这样称呼scipy:

kde0 = gaussian_kde ( df ['centre_point'], bw_method=bandwith )
像这样出生的人

g = sns.kdeplot ( data=df, x="centre_point", bw_adjust=bandwith )
但是,代码告诉我们,
bw\u adjust
是一个

使用bw_方法对所选值进行乘法缩放的因子。增加将使曲线更平滑。见附注

而kdeplot还有一个
bw_方法
参数,该参数是

确定要使用的平滑带宽的方法;传递到scipy.stats.gaussian_kde


因此,如果要使两个库的结果相等,则需要确保使用了正确的参数。

您这样调用scipy:

kde0 = gaussian_kde ( df ['centre_point'], bw_method=bandwith )
像这样出生的人

g = sns.kdeplot ( data=df, x="centre_point", bw_adjust=bandwith )
但是,代码告诉我们,
bw\u adjust
是一个

使用bw_方法对所选值进行乘法缩放的因子。增加将使曲线更平滑。见附注

而kdeplot还有一个
bw_方法
参数,该参数是

确定要使用的平滑带宽的方法;传递到scipy.stats.gaussian_kde


因此,如果您想使两个库的结果相等,您需要确保使用了正确的参数。

感谢insight@mwaskom。我更新了代码,两个绘图现在看起来完全相同。然而,这两个图的
auc
仍然不同。如果您可以分享有关此问题的任何输入,请表示感谢。只有在同一网格上对两条曲线进行采样时,您的计算AUC的方法才会起作用,这里不是这种情况。如果您可以建议如何正确获取这种情况下的AUC,请表示感谢。至少我知道从哪里开始。感谢@mwaskom的洞察力。我更新了代码,两个绘图现在看起来完全相同。然而,这两个图的
auc
仍然不同。如果您可以分享有关此问题的任何输入,请表示感谢。只有在同一网格上对两条曲线进行采样时,您的计算AUC的方法才会起作用,这里不是这种情况。如果您可以建议如何正确获取这种情况下的AUC,请表示感谢。至少我知道从哪里开始。