在python中查找两个kde绘图之间的非重叠区域
我试图根据目标变量的kde分布来确定特性是否重要。我知道如何绘制kde图,并在查看图后进行猜测,但是否有更正式的方法来这样做?例如,我们可以计算两条曲线之间非重叠区域的面积吗 当我在谷歌上搜索两条曲线之间的区域时,有许多链接,但没有一个可以解决我的确切问题 注意:在python中查找两个kde绘图之间的非重叠区域,python,matplotlib,scipy,seaborn,Python,Matplotlib,Scipy,Seaborn,我试图根据目标变量的kde分布来确定特性是否重要。我知道如何绘制kde图,并在查看图后进行猜测,但是否有更正式的方法来这样做?例如,我们可以计算两条曲线之间非重叠区域的面积吗 当我在谷歌上搜索两条曲线之间的区域时,有许多链接,但没有一个可以解决我的确切问题 注意: 这幅图的主要目的是找出这一特征是否重要。因此,如果我遗漏了任何隐藏的概念,请进一步建议我 我试图做的是设置一些阈值,例如0.2,如果非重叠区域>0.2,则断言该功能很重要,否则不重要 MWE: 输出 类似链接 以下是我对问题
这幅图的主要目的是找出这一特征是否重要。因此,如果我遗漏了任何隐藏的概念,请进一步建议我 我试图做的是设置一些阈值,例如0.2,如果
非重叠区域>0.2
,则断言该功能很重要,否则不重要
MWE:
输出
类似链接
- 为了比较kde,需要使用相同的带宽计算它们。(默认带宽取决于x值的数量,这两组值可能不同。)
- 两条正曲线的交点就是它们的最小值
- 曲线的面积可以通过梯形规则来近似:
np.trapz
- 以下是我对问题计算部分的看法:
将numpy导入为np
作为pd进口熊猫
导入seaborn作为sns
将matplotlib.pyplot作为plt导入
从scipy.stats导入高斯_kde
df=sns.load_数据集(“泰坦尼克号”)
x0=df.loc[df['surved']==0,'fare']
x1=df.loc[df['surved']==1,'fare']
kde0=高斯分布(x0,bw_方法=0.3)
kde1=高斯(x1,bw_方法=0.3)
xmin=min(x0.min(),x1.min())
xmax=min(x0.max(),x1.max())
dx=0.2*(xmax-xmin)#增加20%的裕度,因为kde比数据宽
xmin-=dx
xmax+=dx
x=np.linspace(xmin,xmax,500)
kde0_x=kde0(x)
kde1_x=kde1(x)
间隔x=np.最小值(kde0\ux,kde1\ux)
plt.plot(x,kde0_x,color='b',label='No')
plt.fill_介于(x,kde0_x,0,color='b',alpha=0.2)之间
plt.plot(x,kde1_x,颜色为橙色,标签为是)
plt.fill_介于(x,kde1_x,0,color='橙色',alpha=0.2)之间
plt.plot(x,inters_x,color='r')
在(x,inters_x,0,facecolor='none',edgecolor='r',hatch='xx',label='intersection'之间填充)
面积=np.trapz(inters_x,x)
句柄,标签=plt.gca()。获取\u图例\u句柄\u标签()
标签[2]+=f':{area_inters_x*100:.1f}%'
plt.图例(手柄、标签、标题)
plt.title(‘票价vs幸存’)
plt.紧_布局()
plt.show()
您可以将重叠定义为两个函数之间的点积。但是您需要注意这些函数是如何规范化的:函数与自身的重叠应该是1才有意义。你在找这样的东西吗?@Feodoran是的,要比较两条曲线,首先它们需要总的单位面积(1.0),然后我们可以比较它们。所以我愿意看看如何做到这一点。我将尝试给出一些选项作为答案,但实际上我认为这个问题更适合数据科学SE。这可以扩展到2D kde吗?我基本上是问这个问题:
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
df = sns.load_dataset('titanic')
x0 = df.loc[df['survived']==0,'fare']
x1 = df.loc[df['survived']==1,'fare']
sns.kdeplot(x0,shade=1)
sns.kdeplot(x1,shade=1)