R语言模拟无法匹配ground_truth的原因咨询
问题分析:为什么随机猜测无法匹配ground_truth?
你运行的模拟代码如下:
ground_truth <- c("coke", "zero", "light", "zero") options <- c("zero", "coke", "light") random_guess<- lapply(1:10000, function(x){ first <- sample(options, 1) rest <- sample(options, 3) return(c(first, rest)) }) final_res <- lapply(random_guess, function(k) { sum(k == ground_truth) }) %>% unlist() table(final_res)
你发现原代码永远无法得到与ground_truth完全匹配的结果,但修改拼接方式后却可以,原因如下:
原代码失败的核心原因
rest <- sample(options, 3)是无放回抽样:因为options只有3个元素,抽取3个必然会把所有元素取一遍,所以rest的三个元素一定是zero、coke、light各一个,没有重复值。- 拼接后的猜测向量
c(first, rest)结构是:第一个元素是单个选项,后三个是无重复的三个选项。这意味着整个4元素向量里,任何选项最多只会出现一次(要么first是某值,后面三个没有;要么first不是,后面三个里有一次)。 - 但你的
ground_truth里zero出现了两次,原代码生成的向量永远不可能有重复元素出现两次,自然完全匹配的情况永远不会发生。
修改后能匹配的原因
- 改成
c(rest, first)时:rest是三个不重复的选项,加上first后,first可能和rest里的某个值重复(比如rest包含zero,同时first也抽到zero),这样向量里就会出现两次zero,满足ground_truth的重复要求,就有机会完全匹配。 - 改成
sample(c(first, rest))时:本质是把拼接后的4个元素打乱顺序,同样可能出现重复值(当first和rest元素重复时),因此也能偶尔匹配成功。
内容的提问来源于stack exchange,提问作者nhaus
相关产品推荐
相关产品推荐

