Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中查找两个kde绘图之间的非重叠区域_Python_Matplotlib_Scipy_Seaborn - Fatal编程技术网

在python中查找两个kde绘图之间的非重叠区域

在python中查找两个kde绘图之间的非重叠区域,python,matplotlib,scipy,seaborn,Python,Matplotlib,Scipy,Seaborn,我试图根据目标变量的kde分布来确定特性是否重要。我知道如何绘制kde图,并在查看图后进行猜测,但是否有更正式的方法来这样做?例如,我们可以计算两条曲线之间非重叠区域的面积吗 当我在谷歌上搜索两条曲线之间的区域时,有许多链接,但没有一个可以解决我的确切问题 注意: 这幅图的主要目的是找出这一特征是否重要。因此,如果我遗漏了任何隐藏的概念,请进一步建议我 我试图做的是设置一些阈值,例如0.2,如果非重叠区域>0.2,则断言该功能很重要,否则不重要 MWE: 输出 类似链接 以下是我对问题

我试图根据目标变量的kde分布来确定特性是否重要。我知道如何绘制kde图,并在查看图后进行猜测,但是否有更正式的方法来这样做?例如,我们可以计算两条曲线之间非重叠区域的面积吗

当我在谷歌上搜索两条曲线之间的区域时,有许多链接,但没有一个可以解决我的确切问题

注意:
这幅图的主要目的是找出这一特征是否重要。因此,如果我遗漏了任何隐藏的概念,请进一步建议我

我试图做的是设置一些阈值,例如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)