【问题标题】:Verify Median Value with Area Under the Curve Calculation验证曲线下面积计算的中值
【发布时间】:2021-06-08 22:34:35
【问题描述】:

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

我在下面有一个频率图。用于此中值计算的包在这里: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 值时,我该如何写??

【问题讨论】:

  • 这个问题有点太模糊了。首先,您需要确定曲线的方程。其次,您需要计算产生面积的积分(微积分)。然而,这只是一个估计,因为这条曲线只是近似钟形曲线。作为替代方案,如果您有每个数据点,您可以计算 point1 和 point2 下的面积大约为 [(y1 + y2)/2] * (x2 - x1) 并将所有这些相加。

标签: python numpy median area


【解决方案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()

产生结果

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

【讨论】:

  • 我做得很好:for i in range(1, len(xs)): slope = (xs[i]-xs[i-1])/(ys[i] - ys[ i-1]) delta_x = x_sort[i] - x_sort[i - 1] delta_y = ys[i - 1] + (ys[i-1] + delta_x * 斜率) sum = sum + (delta_y/2 * delta_x) b = 斜率*(ys[i] - ys[i-1]) count = count + 1 print( str(sum) + ','+ str(xs[i- 1]) + ','+ str(ys [i- 1] )) 在此期间嗯,所以我猜 numpy 基本上是相同的,但我得到不同的值,所以我必须弄清楚
  • @Connor 如果您将中位数设为x[idx+1] 并将这一点与前一个点线性插值以查看面积恰好为 0.5 的位置,您应该得到与其他函数相同的答案,因为它是数学上等价的。
  • @Connor 明确,p = (area[idx] - 0.5) / (area[idx] - area[idx-1]); x[idx+1] - p * (x[idx+1] - x[idx])
猜你喜欢
  • 2011-06-24
  • 1970-01-01
  • 2022-01-23
  • 2021-10-24
  • 2021-04-18
  • 2012-01-29
  • 2015-09-03
  • 2015-04-16
相关资源
最近更新 更多