对矩阵进行排序以使每个对角线具有最大值

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

我查看了StackOverflow和其他论坛的解决方案,但我还没有找到一个只使用Base-R的解决方案 - 这就是我需要使用的方法。

我试图按行在NxN矩阵中最大化对角线,因此该行的最大值在对角线上(我希望这是有道理的 - 特别是在聚类分析的背景下)

到目前为止,我已尝试对此进行硬编码,但感觉反效果 - 这是通过尝试创建'交换'函数,使用for-loop向下列并交换所需条目来完成的。即第1行:1,3,4,7 - > 7,3,4,1第2行:4,10,14,22 - > 4,22,14,10等

以下是我尝试使用的矩阵示例:

CM <- table(expected, predicted)
CM
     1   2  3  4  
  A  11  1  0  66
  B  0   22 77 18  
  C  10  49 34 48  
  D  0   46 31 49  

#Desired:
CM

     1   2  3  4  
  A  66  1  0  11  #max 66
  B  0   77 22 18  #max 77
  C  10  34 49 48  #max 49
  D  0   46 31 49  #max 49

这是(糟糕的)交换函数的摘录,它不起作用。

swap <- function(x,y){
  a = c()       #create an empty vector
  a <- x        #assign x value to a (where x = diagonal location)
  x <- y        #assign y to x (where y = maximum value 
  y <- a        #re-assign a value back to y

}

上面显示了我对结果的期望 - 我希望有人可以提供一些有用的伪代码,或者让我知道是否有任何我遗漏的内容。

对不起,如果这是一个简单或明显的问题!

r cluster-analysis k-means confusion-matrix
2个回答
2
投票

所以看看这个,似乎你想要逐行循环遍历矩阵,并通过将max元素与对角线中的元素交换来改变每一行。我对如何做到这一点的想法是使用这个交换函数:

swap <- function(matrixRow,x,y){
  #x is diagonal index
  #y is max of the row
    indexY <- which(matrixRow == y)
    valX <- matrixRow[x]
    matrixRow[x] <- y
    matrixRow[indexY] <- valX
    return(matrixRow)
}

这将返回行的更改版本。然后,您可以将该行的新版本分配给当前行。例如,

vals <- c(11,0,10,0,  1,22,49,46,  0, 77, 34, 31,   66, 18, 48, 49)
mat <- matrix(vals, nrow = 4)

编辑:woops打错了键,发布得太早了。这是其余的:

for(i in 1:nrow(mat)){
rowI <- mat[i,]
y <- max(rowI)
mat[i,] <- swap(rowI, i, y)
}

2
投票

之前的方法是实现Hungarian algorithm

只选择每行中的最大值并不一定会使对角线最大化,因为一行中的最大值可能略微优于第二行,而选择第二最佳值将允许您在另一行上获得更大的值。

© www.soinside.com 2019 - 2024. All rights reserved.