投影(使用雅可比矩阵)和边缘化(矩阵求逆、删除行/列并重新转换)是否相互转换?

2024-06-02 12:12:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图检查两个Fisher矩阵之间的等式或不等式

我们的目标是看投影(使用雅可比矩阵)和边缘化(矩阵反转、删除行/列并重新转换)是否能相互转换。

这两个矩阵的计算方式略有不同。这两个矩阵是Fisher矩阵

实际上,这是在每个行/列的初始参数和最终矩阵的最终参数之间更改参数的计算。这就是为什么在这两种计算中,我都使用雅可比矩阵J来表示初始参数和最终参数之间的导数:

公式是:F_final = J^T F_initial J

第一个矩阵的大小为5x5,第二个矩阵的大小为4x4。除第4行/列外,它们是相同的

  1. 第一:我求5x5矩阵的逆(它给出5x5协方差矩阵)。然后,我“边缘化”,也就是说,我移除这个协方差矩阵的第四行/第四列。然后,我再次求逆,得到一个4x4矩阵

最后,我用雅可比4x4进行投影,公式为:F_final = J^T F_initial J:所以最后得到一个4x4矩阵

  1. 对于要构建的第二个矩阵:我直接在5x5第二个矩阵上进行投影(我记得除了第4行/列之外,该矩阵与5x5相同)

我用雅可比矩阵5x5进行投影。然后我得到第二个投影矩阵5x5。最后,我删除这个5x5矩阵上的第4行/列,以获得一个4x4矩阵新的投影矩阵

我想知道在什么条件下,两个矩阵4x4之间可以相等。我不知道我的方法是否正确。

为了向您展示一个实际示例,我在下面放了一个小的Matlab脚本,它试图遵循上面解释的所有推理:

clear;
clc;

% Big_31 Fisher : 
FISH_Big_1_SYM = sym('sp_', [4,4], 'real');
% Force symmetry for Big_31
FISH_Big_1_SYM = tril(FISH_Big_1_SYM.') + triu(FISH_Big_1_SYM,1);

% Big_32 Fisher : 
FISH_Big_2_SYM = sym('sp_', [5,5], 'real');
% Force symmetry for Big_32
FISH_Big_2_SYM = tril(FISH_Big_2_SYM.') + triu(FISH_Big_2_SYM,1);

% Jacobian 1 
J_1_SYM = sym('j_', [4,4], 'real');
% Jacobian 2 
J_2_SYM = sym('j_', [5,5], 'real');

% Remove 4th row/column
J_2_SYM(4,:) = [];
J_2_SYM(:,4) = [];

% Projection
FISH_proj_1 = J_1_SYM'*FISH_Big_1_SYM*J_1_SYM;
size(FISH_proj_1)

% Invert Fisher_2
COV_Big_2_SYM = inv(FISH_Big_2_SYM);

% Remove 4th row/column
COV_Big_2_SYM(4,:) = [];
COV_Big_2_SYM(:,4) = [];

% Re-inverse
FISH_Big_2_SYM_new = inv(COV_Big_2_SYM);

% Projection 2x2
FISH_proj_2 = J_2_SYM'*FISH_Big_2_SYM_new*J_2_SYM;
size(FISH_proj_2)

% Test equality between 2 matrices
isequal(FISH_proj_1,FISH_proj_2)

这个脚本的问题是,即使我有很小的矩阵(4x4或5x5),代码运行时间也有点长,但结果是矩阵不同

更新

我给了一些人的反馈。重要的一点是Matlab代码的这一部分:

当我这样做时:

% Remove 4th row/column
J_2_SYM(4,:) = [];
J_2_SYM(:,4) = [];

我不删除雅可比矩阵j_5_1j_5_2j_5_3行的元素J,当我进行投影时,这些项不会消失。另一方面,这些术语将保留在另一种方法中,在我考虑它们的意义上

那么这是一场失败的战斗吗

如果是,哪些修改或假设可能导致相等?i、 e让两个操作都通勤


Tags: 参数column矩阵covrealremoverow投影
1条回答
网友
1楼 · 发布于 2024-06-02 12:12:54

若要执行np.dot,第一个矩阵的最后一个维度必须与第二个矩阵的第一个维度相同。它们不是,所以您得到的是ValueError,即形状没有对齐。 打印时,一切似乎都很好,但后来您忘记了行:

j_temp = np.copy(J_2_SYM)

# Add row/col into J_2_SYM
j_temp = np.insert(j_temp, 2, J_NEU_row_SYM[0,:], axis=0)
j_temp = np.insert(j_temp, 2, J_NEU_col_SYM[:,0], axis=1)

# Copy built J_2_SYM
J_2_SYM = np.copy(j_temp)

这就是改变J_2_SYM大小的地方,毕竟它是(33,16),所以不能用(32,32)数组做点积

相关问题 更多 >