如何在python中通过逐步迭代减少y轴的差异,尽可能匹配两个不同的图
How to match two different graphs as much as possible by reducing difference in y-axis step by step by iteration in python
我试图通过在 python 中将一张图移动到另一张图来尽可能匹配下面绘制的两张图。
Figure
两个图形在 x 中具有不同的范围,它们是从两个数组数据集中绘制的。
我现在在想的是,通过将其中一个迭代一个一个地移动,让它移动直到两个数据(或图形)之间的差异最小化。
然而,我不知道如何开始。
我要做的是尝试移动其中一组,使其与另一组之间的均方根差最小化。您还可以将标准缩小到数据中感兴趣的区域(我猜是在峰值附近)。要计算 RMS 误差,您需要将数据插值到相同的 x 值上。这是一个例子:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize
# Create data
x0 = np.linspace(0, 2.*np.pi, 101)
y0 = np.sin(x0)
x1 = np.linspace(0, 2.*np.pi, 201)
y1 = np.sin(x1+0.1*np.pi)
def target(x):
# Interpolate set 1 onto grid of set 0 while shifting it by x.
y1interp = np.interp(x0, x1+x, y1)
# Compute RMS error between the two data with set 1 shifted by x.
return np.sqrt(np.sum((y0-y1interp)**2.))
result = minimize(target, method="BFGS", x0=[0.])#, bounds=[(-0.2, 0.2)]) # bounds work with some methods only
print(result)
plt.figure()
plt.plot(x0, y0, "r", x1, y1, "b")
plt.plot(x1+result.x, y1, "k", lw=2)
plt.legend(["set 0", "set 1", "set 1 shifted"])
结果:
请注意 scipy.optimize.minimize 对设置非常敏感,因此您需要使用它们来使它们更适合解决您的问题:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html
我试图通过在 python 中将一张图移动到另一张图来尽可能匹配下面绘制的两张图。
Figure
两个图形在 x 中具有不同的范围,它们是从两个数组数据集中绘制的。
我现在在想的是,通过将其中一个迭代一个一个地移动,让它移动直到两个数据(或图形)之间的差异最小化。
然而,我不知道如何开始。
我要做的是尝试移动其中一组,使其与另一组之间的均方根差最小化。您还可以将标准缩小到数据中感兴趣的区域(我猜是在峰值附近)。要计算 RMS 误差,您需要将数据插值到相同的 x 值上。这是一个例子:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize
# Create data
x0 = np.linspace(0, 2.*np.pi, 101)
y0 = np.sin(x0)
x1 = np.linspace(0, 2.*np.pi, 201)
y1 = np.sin(x1+0.1*np.pi)
def target(x):
# Interpolate set 1 onto grid of set 0 while shifting it by x.
y1interp = np.interp(x0, x1+x, y1)
# Compute RMS error between the two data with set 1 shifted by x.
return np.sqrt(np.sum((y0-y1interp)**2.))
result = minimize(target, method="BFGS", x0=[0.])#, bounds=[(-0.2, 0.2)]) # bounds work with some methods only
print(result)
plt.figure()
plt.plot(x0, y0, "r", x1, y1, "b")
plt.plot(x1+result.x, y1, "k", lw=2)
plt.legend(["set 0", "set 1", "set 1 shifted"])
结果:
请注意 scipy.optimize.minimize 对设置非常敏感,因此您需要使用它们来使它们更适合解决您的问题: https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html