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

时间:2019-04-19 15:21:58

标签: r cluster-analysis k-means confusion-matrix

我到处都是StackOverflow和其他论坛,以寻求解决方案,但尚未找到仅使用Base-R的解决方案-这正是我需要使用的解决方案。

我正在尝试逐行最大化NxN矩阵中的对角线,因此该行的最大值位于对角线上(我希望这是有意义的-特别是在聚类分析的背景下)

到目前为止,我已经尝试过对此进行硬编码,但感觉却适得其反-这是通过尝试创建一个“交换”函数,使用for循环向下的列并交换所需的条目来完成的。 即在第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

}

以上显示了我对结果的期望-我希望有人可以为我提供一些有用的伪代码,或者让我知道是否有任何我想念的东西。

很抱歉,这是一个简单或明显的问题!

2 个答案:

答案 0 :(得分: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)
}

答案 1 :(得分:2)

执行此操作的先前方法是实现Hungarian algorithm

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