scipy 找出两个kde绘图区之间的非重叠区域

fzsnzjdm  于 2022-11-29  发布在  其他
关注(0)|答案(1)|浏览(143)

我试图根据目标变量的kde分布来确定一个特征是否重要。我知道如何绘制kde图并在看完图后进行猜测,但有没有更正式的方法来做这件事?比如我们能计算两条曲线之间不重叠区域的面积?
当我在谷歌上搜索两条曲线之间的区域时,有很多很多链接,但没有一个能解决我的确切问题。

注意事项:

这个情节的主要目的是发现功能是否重要。所以,如果我在这里遗漏了任何隐藏的概念,请进一步建议我。
我试图做的是设置一些阈值,如0.2,如果non-overlapping area > 0.2,则Assert该特性是重要的,否则不是。
我的天

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)

输出

相似链接

h43kikqp

h43kikqp1#

下面是我对这个问题的计算部分的看法:

  • 为了比较kde,需要用相同的带宽来计算它们。(默认带宽取决于x值的个数,这两个集合的x值可以不同。)
  • 两条正曲线的交点正好是它们的最小值。
  • 曲线的面积可以通过梯形法则来近似:np.trapz .

下面是这些想法转换成的一些示例代码和说明情节:

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde

df = sns.load_dataset('titanic')

x0 = df.loc[df['survived'] == 0, 'fare']
x1 = df.loc[df['survived'] == 1, 'fare']

kde0 = gaussian_kde(x0, bw_method=0.3)
kde1 = gaussian_kde(x1, bw_method=0.3)

xmin = min(x0.min(), x1.min())
xmax = max(x0.max(), x1.max())
dx = 0.2 * (xmax - xmin) # add a 20% margin, as the kde is wider than the data
xmin -= dx
xmax += dx

x = np.linspace(xmin, xmax, 500)
kde0_x = kde0(x)
kde1_x = kde1(x)
inters_x = np.minimum(kde0_x, kde1_x)

plt.plot(x, kde0_x, color='b', label='No')
plt.fill_between(x, kde0_x, 0, color='b', alpha=0.2)
plt.plot(x, kde1_x, color='orange', label='Yes')
plt.fill_between(x, kde1_x, 0, color='orange', alpha=0.2)
plt.plot(x, inters_x, color='r')
plt.fill_between(x, inters_x, 0, facecolor='none', edgecolor='r', hatch='xx', label='intersection')

area_inters_x = np.trapz(inters_x, x)

handles, labels = plt.gca().get_legend_handles_labels()
labels[2] += f': {area_inters_x * 100:.1f} %'
plt.legend(handles, labels, title='Survived?')
plt.title('Fare vs Survived')
plt.tight_layout()
plt.show()

相关问题