Graph 在python的机器学习中,是否可以在数据集的x和y坐标中找到移位值?

Graph 在python的机器学习中,是否可以在数据集的x和y坐标中找到移位值?,graph,python,Graph,Python,我试图在x和y坐标中查找数据集的移位或滚动值,该值覆盖在另一个数据集上。数据的未处理状态如标有“Before”的图所示。这里,点是观察数据集,线是模型数据集。我希望模型数据集适合观测数据集,如标记为“After”的图所示。此拟合是通过直接给定这些值手动完成的。我的Before/After图像可以在python代码执行后看到 我不知道如何在模型数据集的x和y坐标中找到移位值。我的数据集在最小的工作代码中 import numpy as np import matplotlib.pyplot as

我试图在x和y坐标中查找数据集的移位或滚动值,该值覆盖在另一个数据集上。数据的未处理状态如标有“Before”的图所示。这里,点是观察数据集,线是模型数据集。我希望模型数据集适合观测数据集,如标记为“After”的图所示。此拟合是通过直接给定这些值手动完成的。我的Before/After图像可以在python代码执行后看到

我不知道如何在模型数据集的x和y坐标中找到移位值。我的数据集在最小的工作代码中

import numpy as np
import matplotlib.pyplot as plt

model = np.array([(0.310, -0.687), (0.407, -0.355), (0.455, -0.142), (0.504, 0.061), (0.552, 0.238), 
                  (0.601,  0.380), (0.698,  0.549), (0.746,  0.581), (0.795, 0.587), (0.859, 0.567), 
                  (0.956,  0.511), (1.053,  0.473), (1.150,  0.489), (1.199, 0.523), (1.296, 0.640), 
                  (1.393,  0.812), (1.490,  0.981), (1.587,  1.189), (1.684, 1.386), (1.781, 1.572), 
                  (1.878, 1.766)])

obser = np.array([(0.212, -0.114), (0.199, 0.017), (0.259, 0.020), (0.199, 0.076), (0.297, 0.082), 
                  (0.735, 0.085), (0.641, 0.104), (0.791, 0.104), (0.681, 0.109), (0.606, 0.132), 
                  (0.262, 0.135), (0.813, 0.137), (0.334, 0.157), (0.565, 0.165), (0.647, 0.170), 
                  (0.876, 0.174), (0.746, 0.186), (0.509, 0.197), (0.398, 0.203), (0.693, 0.207), 
                  (0.829, 0.215), (0.299, 0.226), (0.585, 0.228), (0.549, 0.242), (0.430, 0.242), 
                  (0.637, 0.253), (0.511, 0.257), (0.918, 0.268), (0.813, 0.269), (0.746, 0.271), 
                  (0.336, 0.288), (0.449, 0.297), (0.398, 0.299), (0.783, 0.306), (0.578, 0.312), 
                  (0.871, 0.330), (0.515, 0.345), (0.468, 0.353), (0.818, 0.380), (0.936, 0.391), 
                  (0.889, 0.416), (0.876, 0.503), (1.027, 0.522), (1.040, 0.601), (0.965, 0.656), 
                  (1.130, 0.796), (1.224, 0.845), (1.261, 0.964), (1.378, 1.149)])

fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(9,6))
fig.subplots_adjust(wspace=0.5, hspace=0)

# how can we obtain the shift values of [0.37, 0.32] with machine learning?
model2 = model - [0.37, 0.32]

ax1.invert_yaxis()
ax1.set_xlabel("BmV")
ax1.set_ylabel("UmB")
ax1.scatter(obser[:, 0], obser[:, 1], s=2, c="black")
ax1.plot(model[:, 0], model[:, 1], linewidth=1, c="red")
ax1.text(0.7, 0.96, 'Before', verticalalignment='top', horizontalalignment='left', 
transform = ax1.transAxes, color = 'black', fontsize=12)

ax2.invert_yaxis()
ax2.set_xlabel("BmV")
ax2.set_ylabel("UmB")
ax2.scatter(obser[:, 0], obser[:, 1], s=2, c="black")
ax2.plot(model2[:, 0], model2[:, 1], linewidth=1, c="red")
ax2.text(0.8, 0.96, 'After', verticalalignment='top', horizontalalignment='left', 
transform = ax2.transAxes, color = 'black', fontsize=12)

plt.show()

我认为这种滚动可以通过python中的机器学习来完成。但我不知道具体怎么做。有人能帮我吗;博士:把平均数排成一行

您评论说希望最小化模型和观测值之间的差异之和。从数学上讲,这是可以写的∑ij | mi-oj-s |,其中s是移位。与标准偏差/平均偏差(见or)一样,结果表明,最好将其最小化∑ij(mi-oj-s)2

区别在于,当0=-2时,这一点最小化∑ij(mi-oj-s)。如果我们说有M个模型点和O个观测点,那么这意味着0=-2(∑imi)O+2(∑joj)M+2sOM。因此,s=(∑imi)/M-(∑joj)/O,它们平均值的差异。(一个细节的人可能会注意到我们是在一维上工作的;这是因为平方距离可以分解成沿每个轴的平方距离,也就是毕达哥拉斯定理。)

回到您的数据,这意味着您需要
model3=model-(model.mean(axis=0)-obser.mean(axis=0))


通过
[0.35096599,0.27984354]
进行移位。尽管说实话,我看不出model2和model3之间有多大区别。

tl;博士:把平均数排成一行

您评论说希望最小化模型和观测值之间的差异之和。从数学上讲,这是可以写的∑ij | mi-oj-s |,其中s是移位。与标准偏差/平均偏差(见or)一样,结果表明,最好将其最小化∑ij(mi-oj-s)2

区别在于,当0=-2时,这一点最小化∑ij(mi-oj-s)。如果我们说有M个模型点和O个观测点,那么这意味着0=-2(∑imi)O+2(∑joj)M+2sOM。因此,s=(∑imi)/M-(∑joj)/O,它们平均值的差异。(一个细节的人可能会注意到我们是在一维上工作的;这是因为平方距离可以分解成沿每个轴的平方距离,也就是毕达哥拉斯定理。)

回到您的数据,这意味着您需要
model3=model-(model.mean(axis=0)-obser.mean(axis=0))


通过
[0.35096599,0.27984354]
进行移位。尽管说实话,我看不出model2和model3之间有多大区别。

这取决于您所说的“适合”是什么意思。如果你想让他们有相同的平均值,中位数,或重心使用其他一些权重,这并不难,因为这些都会随着数据的变化而改变。如果要最小化凸面外壳的对称差的面积,这将更加困难。可以计算模型和观测值之间的差异,并且这些差异的总和必须尽可能小。我的主要问题是我们如何做到这一点。最初,第一个差异总和的计算很容易,但在第二步,我的问题是决定在哪个轴和方向(ın或out)上移动多少。这取决于“拟合”的含义。如果你想让他们有相同的平均值,中位数,或重心使用其他一些权重,这并不难,因为这些都会随着数据的变化而改变。如果要最小化凸面外壳的对称差的面积,这将更加困难。可以计算模型和观测值之间的差异,并且这些差异的总和必须尽可能小。我的主要问题是我们如何做到这一点。一开始,第一个差值之和很容易计算,但在第二步,我的问题是决定在哪个轴和方向(n或out)上移动多少。你真是太棒了,蒂皮,这个解决方案太棒了。我将用其他需要解决的数据集来测试这一点。非常感谢您的关注。作为后续想法,另一个“适合”是“将观测值与模型定义的函数之间的差异最小化”。从如何计算模型定义的函数开始,这将要复杂得多。我在python代码中做了一些调整,以改进更好的近似值,如bmv=model[:,0]和umb=model[:,1],我通过scipy的插值将函数定义为f=interpolate.interp1d(bmv,umb,kind='cubic',bounds\u error=False)。但我没能达到我预期的程度。有没有可能这样做呢?标准的最小二乘法中,f是最小化的∑i(f(oi,x-sx)-oi,y-sy)2。如果没有f的显式公式(甚至可能有),这可能需要数值分析方法。模型的显式公式是不可能形成的。无论如何,谢谢你所做的一切。你真的很棒,Teepeemm,这个解决方案太棒了。我将用其他需要解决的数据集来测试这一点。非常感谢您的关注。作为后续想法,另一个“适合”是“将观测值与模型定义的函数之间的差异最小化”。这将更加复杂,从如何计算模型定义的函数开始。我在python代码中做了一些调整,以改进更好的近似值,如bmv=model[:,0]和umb=model[:,1],我将函数定义为f=interpolate.interp1d(bmv,umb)