您刚刚描述了一个卡尔曼滤波/数据融合问题。您有一个初始状态
A,其中存在一些误差,并且您还有一些观测值
B,这些观测值也存在一些噪声。您希望通过注入来自
B的信息来改进对状态
A的估计,同时考虑两个数据集中空间相关的错误。我们没有关于
A和
B中的错误的先前信息,因此可以随意制定。以下是一个实现示例:
import numpy as np
def dist(M):
nx = M.shape[0]
ny = M.shape[1]
x = np.ravel(np.tile(np.arange(nx),(ny,1))).reshape((nx*ny,1))
y = np.ravel(np.tile(np.arange(ny),(nx,1))).reshape((nx*ny,1))
n,m = np.meshgrid(x,y)
d = np.sqrt((n-n.T)**2+(m-m.T)**2)
return d
def covariance(d,scaling_factor):
c = (-d/np.amax(d) + 1)*scaling_factor
return c
A = np.array([[1,1,1],[1,1,1],[1,1,1]])
B = np.array([[34,100,15],[62,17,87],[17,34,60]])
x = np.ravel(A).reshape((9,1))
y = np.ravel(B).reshape((9,1))
P_a = np.eye(9)*50
P_b = covariance(dist(B),2)
K = P_a.dot(np.linalg.inv(P_a+P_b))
x_new = x + K.dot(y-x)
A_new = x_new.reshape(A.shape)
print(A)
print(B)
print(A_new)
现在,这种方法只适用于您的数据是无偏的情况。因此,mean(A)必须等于mean(B)。但是,即使如此,您仍然会得到可以接受的结果。此外,您可以随意处理协方差矩阵。我建议阅读Kalman滤波器维基百科页面以获取更多详细信息。
顺便说一句,上面的示例产生了:
[[ 27.92920141 90.65490699 7.17920141]
[ 55.92920141 7.65490699 79.17920141]
[ 10.92920141 24.65490699 52.17920141]]