枚举R

如何解决枚举R

为说明问题,让我们定义以下矩阵(其中NA表示在t时段内该选项不可用)

set.seed(1)
x <- matrix(NA,4,dimnames = list(paste0("t=",seq_len(4)),LETTERS[seq_len(4)]))
x[lower.tri(x,diag = TRUE)] <- rnorm(10)

哪个给出的矩阵如下:

              A           B          C         D
t=1  0.91897737          NA         NA        NA
t=2  0.78213630  0.61982575         NA        NA
t=3  0.07456498 -0.05612874 -1.4707524        NA
t=4 -1.98935170 -0.15579551 -0.4781501 0.4179416

目标是计算每个值在每个时间段$ t $中最高的概率,但是,这些值取决于先前时间段中的值。例如,在从期间t=2移至t=3并假设A最高的情况下,A仅与C进行比较,而不与{{1 }},因为在B中假定它更高。我们可以将问题构造成这样的树:

enter image description here

因此,对于t=2,概率为1;对于t=1,我们从1个分组中计算出2个概率;在t=2中,我们从2个分组中计算出4个概率(请注意,如何从由于顺序相关性和固有假设(在t=3t-1中不是最高的),我们从4个分组中计算了8个概率。然后,最终概率是构成8条路径的每个t=4中的概率乘积。在实际问题中,t越来越大,手动识别这些分组变得不可行。

我一直试图提出一种识别这些路径并计算概率的聪明方法。一个想法是为每种可能的模式使用一组“掩蔽矩阵”。这样,我可以简单地将掩码矩阵相乘并执行行操作。但是,随着层数的增加,我找不到一种可靠的方法来填充不同的掩蔽矩阵。

例如,假设可以通过以下掩蔽矩阵来描述直到最后一个时期的所有时期中选择t的模式:

A

看起来像这样(在这种情况下,是4种可能的比较中的1种):

mask <- matrix(c(
1,NA,1,1
),ncol = 4,byrow = TRUE,LETTERS[seq_len(4)]))

我们可以像这样计算每个期间的概率(所有行应合计为一个):

    A  B  C  D
t=1 1 NA NA NA
t=2 1  1 NA NA
t=3 1 NA  1 NA
t=4 1 NA NA  1
exp_x <- exp(x * mask)
sum_exp_x <- rowSums(exp_x,na.rm = TRUE)
pr_x <- exp_x / sum_exp_x

A B C D t=1 1.00000000 NA NA NA t=2 0.54048879 0.4595112 NA NA t=3 0.82423638 NA 0.1757636 NA t=4 0.08261824 NA NA 0.9173818 增长的情况下,是否存在针对所有可能路径的明智方法?还是填充一组掩蔽矩阵进行循环的好方法?我正在努力避免问题变得一发不可收拾。完整的路径枚举和消除是否可能是更好的选择,即更快,更健壮?任何帮助,想法和指示都是有帮助的。

解决方法

这是您想要的吗?

find_path <- function(nperiods,opts = LETTERS[seq_len(period)]) {
  stopifnot(length(opts) == nperiods)
  out <- matrix(nrow = 2 ^ (nperiods - 1L),ncol = nperiods)
  r <- 1L
  recur_ <- function(period,branch,outcome) {
    if (period > length(branch)) {
      out[r,] <<- opts[branch]
      r <<- r + 1L
      return(NULL)
    }
    for (i in c(outcome,period)) {
      branch[[period]] <- i
      recur_(period + 1L,i)
    }
  }
  recur_(1L,integer(nperiods),NULL)
  out
}

calc_prob <- function(mat) {
  ps <- dimnames(mat)[[1L]]; if (is.null(ps)) ps <- seq_len(nrow(mat))
  ops <- dimnames(mat)[[2L]]; if (is.null(ops)) ops <- seq_len(ncol(mat))
  paths <- find_path(nrow(mat),ops)
  out <- vapply(seq_len(ncol(paths))[-1L],function(i) {
    comp <- ops[[i]]
    comp <- ifelse(paths[,i] == comp,paths[,i - 1L],comp)
    x <- exp(mat[i,i]])
    y <- exp(mat[i,comp])
    x / (x + y)
  },numeric(nrow(paths)))
  dimnames(out) <- NULL; out <- cbind(1,out)
  dimnames(out)[[2L]] <- dimnames(paths)[[2L]] <- ps
  list(paths = paths,probs = out)
}

输出

> calc_prob(x) # x is the same lower-triangular matrix as shown in your example.

$paths
     t=1 t=2 t=3 t=4
[1,] "A" "A" "A" "A"
[2,] "A" "A" "A" "D"
[3,] "A" "A" "C" "C"
[4,] "A" "A" "C" "D"
[5,] "A" "B" "B" "B"
[6,] "A" "B" "B" "D"
[7,] "A" "B" "C" "C"
[8,] "A" "B" "C" "D"

$probs
     t=1       t=2       t=3        t=4
[1,]   1 0.5404888 0.8242364 0.08261823
[2,]   1 0.5404888 0.8242364 0.91738177
[3,]   1 0.5404888 0.1757636 0.28985432
[4,]   1 0.5404888 0.1757636 0.71014568
[5,]   1 0.4595112 0.8044942 0.36037495
[6,]   1 0.4595112 0.8044942 0.63962505
[7,]   1 0.4595112 0.1955058 0.28985432
[8,]   1 0.4595112 0.1955058 0.71014568

变量paths为您提供每个时期 t 的所有可能结果; probs告诉您相应结果的可能性。 但是,请注意,这种概率树随着周期数的增加而呈指数增长。等式是

enter image description here

其中, N 是周期 t 中所有可能路径的数量。在仅20个期间内,您将拥有524288条不同的路径。如果周期数达到30,则将有536870912个不同的路径,而R只是无法处理该数量的计算。我建议您重新考虑预期的输出。您是否在运行模拟时还考虑了其​​他一些约束,而不仅仅是时间相关性,以便我们进一步削减一些不必要的路径?或者,也许您只需要一些汇总统计信息(例如期望值),这样我们就不必生成所有可能的路径了?除了使用像这样的暴力手段之外,还必须有更好的方法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res