用曲线计算下的面积验证中值

时间:2021-03-10 22:44:14

标签: python numpy median area

我想计算这条曲线下的面积,以确认尺寸是否正确。怎么做呢?

我在下面有一个频率图。用于此中值计算的包在这里:https://github.com/nudomarinero/wquantiles

def annot_median(Size,Count, ax=None):
    xmedian = weighted.median(Size, Count)
    ymedian = np.interp(xmedian,Size, Count)
    text="median " + "[{:.2f},{:.0f}]".format(xmedian, ymedian)
    if not ax:
        ax=plt.gca()
    bbox_props = dict(boxstyle="square,pad=0.3", fc="w", ec="k", lw=0.72)
    arrowprops=dict(arrowstyle="->",connectionstyle="angle,angleA=0,angleB=85")
    kw = dict(xycoords='data',textcoords="axes fraction",
              arrowprops=arrowprops, bbox=bbox_props, ha="right", va="top")
    ax.annotate(text, xy=(xmedian, ymedian), xytext=(0.94,0.86), **kw)
    
annot_median(Size,Count)

我开始认为可以使用梯形方法来验证该值

x = Size
y = Count 
Area_t=np.trapz(x[:],y[:])

当 Area_t = 0.5(total) 打印相应的 x 和 y 值时,我该如何写?

1 个答案:

答案 0 :(得分:1)

您正在寻找归一化区域的累积总和以及该总和 >= 0.5 的第一个点。

import matplotlib.pyplot as plt
import numpy as np
from scipy.integrate import cumtrapz

# generate some heavy-tail data
np.random.seed(0)    
y, x = np.histogram(np.random.gumbel(size=100000), bins=1000)
x = x[:-1]

area = cumtrapz(y, x)
area = area / area[-1]
idx = np.argwhere(area >= .5)[0,0]

plt.plot(x, y)
plt.vlines(x[idx], y.min(), y.max(), linestyles='dashed')
plt.show()

产生结果

Plot result

中值出现的位置将是 x[idx],但这可能与您的其他计算不完全一致。一方面,如果您有 N 点,梯形规则将产生 N-1 区域段。所以你必须决定哪个x点代表哪个积分点。例如,您可以将 x[1] 映射到 area[0]。通过累积总和,您将获得总和大于或等于 0.5 的第一个点。如果它足够大于 0.5(在本例中为 0.503),您可以在中值附近插入一些 xarea 值,以便更准确地估计 area 为 0.5 的位置。