我的测量数据具有非常随意的采样点。例如,3条曲线的采样点可能是
[0.1, 0.15, 0.17, 0.18, 0.185, 20, 1000, 15000]
[0.09, 0.151, 0.169, 0.18, 21, 14000]
[0.11, 0.2, 13999, 14001]
(省略相应的y值)。为了计算平均值,我使用scipy interp1d线性插值所有曲线并找到共同支撑。最后,我正在寻找合理的设定点来评估平均值。
np.linspace(min(common_support), max(common_support), num)
效率非常低,因为对于0左右的足够分辨率,num必须非常大。在这种特殊情况下,我需要几个设定点,大约在0.1-0.2,有些在20,14000,15000。
我试图计算所有采样点using
的概率密度函数# common support is the set of all x-values in the common support of all funtions
kernel = stats.gaussian_kde(common_support)
class rv(stats.rv_continuous):
def _rvs(self, *x, **y):
return kernel.resample(int(self._size))
它不能很好地工作,因为我的发行通常不是高斯分布。
TL:DR :我需要x值来评估分布的平均值,就像数据的公共支持中所有x值的集合一样。
答案 0 :(得分:0)
您正在使用线性插值。通过应用梯形法则计算分段线性函数的积分,其中样本点是折线的顶点,即您的数据点。平均值是积分除以积分范围。所以,只需使用
mean = np.trapz(y, [0.1, 0.15, 0.17, 0.18, 0.185, 20, 1000, 15000])/(15000 - 0.1)
其中y是y值的向量。