变换矩阵的匈牙利算法
Hungarian algorithm for change of matrix
我需要为这样的任务实现匈牙利算法的实现:我有任何矩阵的例子(实际上我需要这个来进行聚类分析):
X<-matrix(c(-1,1,2,-1,2,3,1,2,3), nrow=3, ncol=3, byrow = TRUE)
X
我需要对行或列进行一些排列才能得到这样的结果:所有对角线元素都应该是最大的。在这里我将展示一些照片:,其中我有 3 行和 3 列然后我必须有一个结果:
.
如图所示,有一个排列:第一列变成第三列,然后新的第一列和第二列改变位置。我怎样才能使用匈牙利算法做这样的事情?
尝试使用 RcppHungarian 函数。但是,这些值必须是非负数,所以我稍微更改了数据!
library(RcppHungarian)
x<-matrix(c(1,2,3,1,2,3,2,2,3), nrow=3, ncol=3, byrow = TRUE)
HungarianSolver(x)
我将使用您问题中的这个矩阵作为示例:
2 7 1
0 0 10
8 2 0
首先,匈牙利算法找到最小值,而不是最大值,因此我们需要将所有值乘以 -1,这样当您 运行 算法找到最小值时,它将实际上是原始矩阵的最大值。
-2 -7 -1
-0 -0 -10
-8 -2 -0
匈牙利算法仅适用于非负数,虽然您为其使用的代码应该能够处理它们,但您可以通过减去矩阵中的最小数字 (-在这种情况下为 10)来自矩阵中的每个值。
8 3 9
10 10 0
2 8 10
现在我们运行 在这个矩阵上使用匈牙利算法,得到算法找到的最小匹配的索引列表。我们想按 x 索引对这个列表进行排序。
[(0,2), (1,0), (2,1)]
这个最小匹配也是我们原始矩阵的最大匹配。由于此匹配按 x 索引排序,我们可以使用 y 索引作为原始矩阵的索引。也就是说,第一个索引对是 (0,2)
,所以我们最终矩阵的第一行将是原始矩阵的第三行。
(0,2)
-> 最终矩阵的第一行是原始矩阵的第三行
(1,0)
-> 最终矩阵的第二行是原始矩阵的第一行
(2,1)
-> 最终矩阵的第三行是原始矩阵的第二行
8 2 0
2 7 1
0 0 10
这与您在问题中给出的排列不完全匹配,但它仍然是一个有效的排列。
我需要为这样的任务实现匈牙利算法的实现:我有任何矩阵的例子(实际上我需要这个来进行聚类分析):
X<-matrix(c(-1,1,2,-1,2,3,1,2,3), nrow=3, ncol=3, byrow = TRUE)
X
我需要对行或列进行一些排列才能得到这样的结果:所有对角线元素都应该是最大的。在这里我将展示一些照片:
如图所示,有一个排列:第一列变成第三列,然后新的第一列和第二列改变位置。我怎样才能使用匈牙利算法做这样的事情?
尝试使用 RcppHungarian 函数。但是,这些值必须是非负数,所以我稍微更改了数据!
library(RcppHungarian)
x<-matrix(c(1,2,3,1,2,3,2,2,3), nrow=3, ncol=3, byrow = TRUE)
HungarianSolver(x)
我将使用您问题中的这个矩阵作为示例:
2 7 1
0 0 10
8 2 0
首先,匈牙利算法找到最小值,而不是最大值,因此我们需要将所有值乘以 -1,这样当您 运行 算法找到最小值时,它将实际上是原始矩阵的最大值。
-2 -7 -1
-0 -0 -10
-8 -2 -0
匈牙利算法仅适用于非负数,虽然您为其使用的代码应该能够处理它们,但您可以通过减去矩阵中的最小数字 (-在这种情况下为 10)来自矩阵中的每个值。
8 3 9
10 10 0
2 8 10
现在我们运行 在这个矩阵上使用匈牙利算法,得到算法找到的最小匹配的索引列表。我们想按 x 索引对这个列表进行排序。
[(0,2), (1,0), (2,1)]
这个最小匹配也是我们原始矩阵的最大匹配。由于此匹配按 x 索引排序,我们可以使用 y 索引作为原始矩阵的索引。也就是说,第一个索引对是 (0,2)
,所以我们最终矩阵的第一行将是原始矩阵的第三行。
(0,2)
-> 最终矩阵的第一行是原始矩阵的第三行
(1,0)
-> 最终矩阵的第二行是原始矩阵的第一行
(2,1)
-> 最终矩阵的第三行是原始矩阵的第二行
8 2 0
2 7 1
0 0 10
这与您在问题中给出的排列不完全匹配,但它仍然是一个有效的排列。