获取 x 值不相同的多条曲线的平均曲线

Getting a mean curve of several curves with x-values not being the same

我有几个包含许多 x 值和 y 值的数据集。具有更少值的示例如下所示:

data_set1:

x1          y1        
---------   ---------   
0           100
0.0100523   65.1077
0.0201047   64.0519
0.030157    63.0341
0.0402094   62.1309
0.0502617   61.3649
0.060314    60.8614
0.0703664   60.3555
0.0804187   59.7635
0.0904711   59.1787

data_set2:

x2          y2        
---------   ---------   
0           100
0.01        66.119
0.02        64.4593
0.03        63.1377
0.04        62.0386
0.05        61.0943
0.06        60.2811
0.07        59.5603
0.08        58.8908

所以这里我有(对于这个例子)两个包含 10 个 x 值和 y 值的数据集。 y 值总是不同的,但在某些情况下 x 值将相同,有时它们会不同 - 如本例所示。不是很多,但它们仍然不同。将这两个数据集绘制成图表会产生两条不同的曲线,现在我想绘制两条曲线的均值。如果 x 值相同,我会取 y 值的平均值并将它们与 x 值作图,但如前所述,它们有时不同,有时相同。 有没有某种方法可以推断或类似的方法,这样我就可以在不使用 "just guessing" 或说 "they are pretty much the same, so it will be okay just to average the y-values" 的情况下对值进行平均(同样,对于许多数据集)。 外推似乎是一种可行的方法,但我从未在 python 中使用过它,也许还有更好的方法来做到这一点?

如果你在每个数据集中有相同数量的点(你的例子没有,但你在你的 post 中声明你有),你可以得到各自的平均值 x 个值,以及各自 y 个值的平均值。如果您没有相同数量的值,您可以按照

中的答案进行操作

例如给定你的数据,但每个数据有 9 分:

>>> x1
array([0.       , 0.0100523, 0.0201047, 0.030157 , 0.0402094, 0.0502617,
       0.060314 , 0.0703664, 0.0804187])
>>> y1
array([100.    ,  65.1077,  64.0519,  63.0341,  62.1309,  61.3649,
        60.8614,  60.3555,  59.7635])
>>> x2
array([0.  , 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08])
>>> y2
array([100.    ,  66.119 ,  64.4593,  63.1377,  62.0386,  61.0943,
        60.2811,  59.5603,  58.8908])

你可以这样做:

import numpy as np

mean_x = np.mean((x1,x2), axis=0)
mean_y = np.mean((y1,y2), axis=0)

而什么时候用视觉展现,可以plot。在这里,黑线是你的平均线,蓝线和橙色线是你的原始数据集:

import matplotlib.pyplot as plt
plt.plot(x1,y1)
plt.plot(x2,y2)
plt.plot(mean_x,mean_y, color='black')
plt.show()

如果曲线没有相同数量的点,您还可以绘制平均曲线,使用线性插值法使所有曲线上的点数量相等。

假设您需要绘制一组曲线的平均曲线,并且您有 xsys 对于所有这样的曲线,其中 xs 包含每条曲线的 x 坐标和ys 包含 y 坐标。平均曲线的 X 轴将从 0max (xs) 和平均曲线的 Y 轴是每个 [= 的平均值25=]y in ys,在每个 Xi ∈ X(即 vertival-wise y(xi) 对于 ys 中的每个 y, numpy 的轴 = 0)。对 ys.

中缺失的 y 值使用插值法
mean_x_axis = [i for i in range(max(xs))]
ys_interp = [np.interp(mean_x_axis, xs[i], ys[i]) for i in range(len(xs))]
mean_y_axis = np.mean(ys_interp, axis=0)

plt.plot(mean_x_axis, mean_y_axis)