小编g g*_*g g的帖子

如何在MATLAB中创建自定义"概率分布对象"

我想在MATLAB(使用统计工具箱)中包含一些从现有概率分布中创建新概率分布的简单方法.例如:有限混合物或化合物分布.我的目标是实现与现有概率分布及其周围环境的无缝集成.是否有一些文档或示例应该如何做?

该文档仅包含预定义分发的描述.我找不到"概率分布对象"的类结构或如何编写自定义"makedist"函数.

oop statistics matlab distribution machine-learning

6
推荐指数
1
解决办法
642
查看次数

可以加速特殊 3 数组的计算吗?

我想从暗淡 (K,N) 的两个矩阵 A 和暗淡 (d,N) 的 X 确定一个维度为 (K,d,d) 的 3 数组 R,其中 K 很小,d 适中,但 N 是大(有关典型值,请参阅下面的代码示例)。数组的公式是

R[k, i, j] = sum( A[k, ] * X[i, ] * X[j, ] )。

该数组必须计算多次,因此速度至关重要。因此,我想知道在 R 中计算这个最有效的方法是什么?

我目前的做法

我当前的方法在下面被列为“当前”和“天真的”方法,毫不奇怪,它的速度要慢得多。

library(microbenchmark)

K = 3
d = 20
N = 1e5

tt = microbenchmark(
  
  current = {
    for(krow in 1:K){
      tmp = X * matrix(A[krow,], d, N, byrow = TRUE)
      R[krow,,] = tmp %*% t(X)  
    }},
  
  naive = {
    for(krow in 1:K){
      for(irow …
Run Code Online (Sandbox Code Playgroud)

performance r vectorization rcpp tensor

6
推荐指数
1
解决办法
137
查看次数

使用 Snow/doSNOW 重置内部循环的 R 随机数生成器 (rlecuyer)

我有一个包含内部循环的外部 foreach/dopar 并行循环。内部循环的每个实例都应该处理同一组随机数。其余部分,即外部主体的其余部分和并行实例应照常工作,即具有独立的随机数。

我可以在非并行实现中实现这一点,方法是在内循环开始之前保存 RNG 的状态,并在执行内循环的每个实例之后恢复该状态。请参见以下示例:

library(doSNOW)

seed = 4711

cl = makeCluster(2)
registerDoSNOW(cl)
clusterSetupRNGstream (cl, seed=rep(seed,6))

erg = foreach(irun = 1:3,.combine = rbind) %dopar% {

  #do some random stuff in outer loop
  smp = runif(1)

  # save current state of RNG
  s = .Random.seed

  # inner loop, does some more random stuff
  idx = numeric(5)
  for(ii in seq.int(5)) {
    idx[ii] = sample.int(10, 1)
    # reset RNG for next loop iteration
    set.seed(s)
  }

  c(smp,idx)
}

> print(erg)
              [,1] [,2] [,3] …
Run Code Online (Sandbox Code Playgroud)

random parallel-processing r montecarlo snow

5
推荐指数
1
解决办法
430
查看次数