【问题标题】:downsampling a matrix in R在R中对矩阵进行下采样
【发布时间】:2016-11-18 21:13:49
【问题描述】:

我有一个相对高维 (100X500000) 的矩阵 Q,我想对其进行下采样。通过下采样,我会举例说明。

让 Q =

1 4 9
3 2 1

并且下采样大小= n。我想从一个 sum(Q) = 20 个球的罐子中画出 n 个球,每个球的颜色为 6 种方式中的 1 种,对应于矩阵的不同索引对。就像我有 1 个 A 色球,4 个 B 色球,等等,我正在画 n 个球而没有替换。

我希望它以与矩阵相同的格式返回。一个示例返回值,例如 downsample(Q, 3) =

0 0 2
1 0 0

我的方法是尝试使用示例:

sample(length(as.vector(Q)), size=n, replace=FALSE, prob = as.vector(Q))

但是问题是,示例将 1:length(as.vector(Q)) 视为我拥有的所有球,所以我不能绘制超过 length(as.vector(Q)) 球,因为我我不会替换我的球。

因此,为了调整我的方法,我需要通过从该向量中减去 1 来更新我的概率,并使用某种 for 循环逐个调用样本。这听起来不像是好代码。

有没有更好的方法以 R 友好、无 for 循环的方式执行此操作?

【问题讨论】:

    标签: r matrix sampling downsampling


    【解决方案1】:

    这有点低效,但如果 sum(Q) 不是太大大,您可以通过分解/复制向量然后采样,然后重新聚合/制表来做到这一点。

    Q <- setNames(c(1,4,9,3,2,1),LETTERS[1:6])
    n <- 10
    set.seed(101)
    s0 <- sample(rep(names(Q),Q),
           size=n,replace=FALSE)
    Q2 <- table(factor(s0,levels=names(Q)))
    ## A B C D E F 
    ## 1 2 5 1 0 1 
    

    我不确定您的矩阵结构。您可以使用dim(Q2) &lt;- dim(Q) 以与原始矩阵相同的顺序重新组织结果...

    【讨论】:

    • 太好了,我会试试这个。仅供参考,我将无法使用 LETTERS b/c 维度,但我只会使用 names = [1:length(as.vector(Q)]
    【解决方案2】:

    这是一种非常好的方法。您可以通过将 which(x &lt;= cq)[1] 替换为专门为 finding the first TRUE value 构建的函数来提高其效率(如有必要)。

    Q = matrix(c(1, 4, 9, 3, 2, 1), nrow = 2)
    
    set.seed(47)
    samp = sample(sum(Q), size = 3)
    cq = cumsum(Q)
    
    inds = table(sapply(samp, function(x) which(x <= cq)[1]))
    
    result = integer(length(Q))
    result[as.integer(names(inds))] = inds
    dim(result) = dim(Q)
    #      [,1] [,2] [,3]
    # [1,]    0    2    0
    # [2,]    0    0    1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-12
      • 1970-01-01
      • 1970-01-01
      • 2021-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多