簡體   English   中英

從矩陣中所有可能的拆分組合中查找最小總和

[英]Find minimum sum from all possible split combinations in a matrix

如果我有一個具有以下結構的矩陣:

    A  B  C  D  E  F
A   -  12 3  5  7  9
B   -  -  8  11 6  2
C   -  -  -  10  1  7 
D   -  -  -  -  17 1 
E   -  -  -  -  -  19
F   -  -  -  -  -  - 

我想將 AF 分成 2 組並找到總和最小的組合。 (如果組合是 [ACD, BEF],則總和將為 (3+5+10)+(6+2+19)=45 。)

在真實的數據集中,會有一個 2700X2700 的矩陣,我想將它們分成 13 組 200 個項目和 1 組 100 個項目(13x200+1x100 = 2700)。 python 或 R 代碼中是否有處理此問題的好方法?

謝謝你。

更新:

謝謝@jay.sf。 基因 2 的列表確實用模擬數據集回答了我的問題,但在輸出中,基因 1 列表總是“DEF”。

我可以忽略以下行 "attr(s, "group1") <- g1"

但是,當涉及到多個組和大型數據集(2700 行 X 列分成 100 個組)時,comboGeneral() 無法工作。 目前,我正在嘗試使用 comboGroups() 代替,盡管其參數中沒有參數“FUN”。

您可以使用RcppAlgos::comboGeneral ,它基本上是combn的 C 版本,應該足夠快地找到列組合。

下面的代碼的邏輯是找到三個列名的所有組合,將它們子集組1和否定到組2和sum兩者一起和列表輸出。 attr將 sum 作為屬性分配給列表元素。

stopifnot(all.equal(rownames(m), colnames(m)))
stopifnot(ncol(m) %% 2 == 0)

n <- colnames(m)

library(RcppAlgos)
r <- comboGeneral(n, length(n)/2, FUN=function(i) {
  l <- length(i)
  g1 <- i
  g2 <- n[!n %in% i]
  s <- sum(c(m[g1, g1], m[g2, g2]), na.rm=TRUE)
  attr(s, "group1") <- g1
  attr(s, "group2") <- g2
  return(s)
})

現在,我們可以從屬性中獲取總和。

sums <- sapply(r, attr, "sum")
table(sums)
# 25 30 43 45 46 51 53 55 60 64 
#  2  2  2  2  2  2  2  2  2  2 

最后,為了得到結果,我們對min子集化。

r[sums %in% min(sums)]
# [[1]]
# [[1]]$g1
# [1] "D" "E" "F"
# 
# [[1]]$g2
# [1] "B" "D" "F"
# 
# attr(,"sum")
# [1] 25
# 
# [[2]]
# [[2]]$g1
# [1] "D" "E" "F"
# 
# [[2]]$g2
# [1] "A" "C" "E"
# 
# attr(,"sum")
# [1] 25

數據:

m <- structure(c(NA, NA, NA, NA, NA, NA, 12L, NA, NA, NA, NA, NA, 
3L, 8L, NA, NA, NA, NA, 5L, 11L, 10L, NA, NA, NA, 7L, 6L, 1L, 
17L, NA, NA, 9L, 2L, 7L, 1L, 19L, NA), .Dim = c(6L, 6L), .Dimnames = list(
    c("A", "B", "C", "D", "E", "F"), c("A", "B", "C", "D", "E", 
    "F")))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM