如何找到最佳可能的转变来关联 NumPy 中的两个数据集?

问题描述 投票:0回答:1

在 Python 中,我有一个二维数据集,由两个列表

x1
y1
组成。我还有另一组,
x2
y2
,定义如下:

import random
import numpy as np
import matplotlib.pyplot as plt

# Define the real shift
shift = 50.5

# Fluctuation of single data points
f = 1

# Fraction of missing points or extra points
a = 0.02

data1_x = []
data1_y = []
data2_x = []
data2_y = []
for index in range(int(shift)):
    data2_x.append(index + f*random.random())
    data2_y.append(0 + f*random.random())

for index in range(500):
    x = index
    if index<100:
        y = 0
    elif index<200:
        y = (index-100)
    elif index<300:
        y = 100
    elif index<400:
        y = 400 - index
    else:
        y = 0

    if random.random()>a:
        data1_x.append(x + f*random.random())
        data1_y.append(y + f*random.random())
    if random.random()>a:
        data2_x.append(x + shift + f*random.random())
        data2_y.append(y + f*random.random())

    if random.random()<a:
        data1_x.append(x + 0.5 + f*random.random())
        data1_y.append(100 * random.random())
    if random.random()<a:
        data2_x.append(x + shift + 0.5 + f*random.random())
        data2_y.append(100 * random.random())


# Calculation
view = np.lib.stride_tricks.sliding_window_view
n = len(data1_x)
idx = ((view(data2_y, n) - np.array(data1_y))**2).sum(1).argmin()
calculated_shift = np.polyfit(data1_x, data2_x[idx:n+idx], 1)[1]
print(f"calculated shift: {calculated_shift}")

# Plot the original and shifted signals along with cross-correlation
plt.subplot(2, 1, 1)
plt.scatter(data1_x, data1_y, s=20, marker="o", c="b", label="Data1")
plt.scatter(data2_x, data2_y, s=5, marker="o", c="g", label="Data2")
plt.legend()

plt.subplot(2, 1, 2)
plt.scatter(data1_x, data1_y, s=20, marker="o", c="b", label="Data1")
plt.scatter([x-calculated_shift for x in data2_x], data2_y, s=5, marker="o", c="g", label="Data2")
plt.legend()
plt.tight_layout()
plt.show()

真实世界数据

  • 可能有不同的长度(如示例)
  • x 值(时间)可能不等距(如示例)
  • 数据集中的一个点可能在另一个数据集中没有对应的点(如示例)
  • y 值可能不完全相同(如示例)

鉴于 Onyambu 的解决方案,我得到了例如结果如下:

上图显示了原始数据,下图显示了向后移动的数据。很明显仍然存在显着差异!

如何改进计算,使点真正相互重叠?

python numpy correlation
1个回答
2
投票

使用以下内容:

import numpy as np
view = np.lib.stride_tricks.sliding_window_view

n = len(x1)
idx = ((view(y2, n) - np.array(y1))**2).sum(1).argmin()
np.polyfit(x1, x2[idx:n+idx], 1)
array([0.99860253, 2.28108306]) # close to [1, 2.273]
© www.soinside.com 2019 - 2024. All rights reserved.