R:组合学,一种组合的排列数
R: combinatorics, number of permutations for one combination
我有三个不同的事件 (1,2,3),具有不同的概率(0.15、0.76、0.09),我想抽取 5 次并进行替换。
我现在可以使用
确定可能的组合数量
nsimplex(3,5) ### =21
来自组合包。
我可以使用
确定每个组合的概率
mySimplex <- xsimplex(3,5)
myProbs<-c(0.15, 0.76, 0.09)
results<- apply(mySimplex,2,dmultinom,prob=myProbs)
此外,我当然可以通过计算3^5=243来确定排列数
但是,如果不手动计算它们,我怎么知道相同组合的每个排列被绘制的频率?也就是说,我的每个组合中有多少排列?
如果我没理解错的话,有 243 种排列构成了 21 种不同的组合。现在我的问题是,每个组合有多少排列。例如。组合 {1,1,1,1,1} 只会构建一次,而其他组合则由多个排列创建。
我想你可以通过使用每个组合的概率来得出这个,但我不知道该怎么做?或者有没有其他方法可以在 R 中轻松确定这一点?
提前谢谢你。
为了使其可重现,我需要使用 set.seed(<some_value>)
但这是使用 sample
绘制不同组合的一次尝试(不考虑不同的排列。如果排列是认为不同,然后取出 sort
步骤:
table( # get the counts of distinct combinations
apply( # this will collapse values by column
replicate(100000, # yields a 100,000 column matrix
{sample(c("1","2","3"), 5 ,repl=TRUE, prob=c(.5,.25,.25) )}),
2, function(x) paste(sort(x), collapse=".")) )
1.1.1.1.1 1.1.1.1.2 1.1.1.1.3 1.1.1.2.2 1.1.1.2.3 1.1.1.3.3 1.1.2.2.2
3090 7705 8144 7851 15408 7649 3997
1.1.2.2.3 1.1.2.3.3 1.1.3.3.3 1.2.2.2.2 1.2.2.2.3 1.2.2.3.3 1.2.3.3.3
11731 11554 3940 949 3844 5955 4019
1.3.3.3.3 2.2.2.2.2 2.2.2.2.3 2.2.2.3.3 2.2.3.3.3 2.3.3.3.3 3.3.3.3.3
961 99 506 990 997 510 101
A.Webb 建议我们将理论 dmultinom
与实践进行比较:
dmultinom(c(4,1,0),prob=c(0.5,0.25,0.25))*2
[1] 0.15625
因此,对于第一个值 3125 的预测与 3090 的模拟值以及第二个和第三个值以及 7812.5 与 7705 和 8144 的模拟相比,可以说是准确的。
项目 1 的 a
个不可区分的副本的排列数,项目 2 的 b
,项目 3 的 c
,其中 a + b + c = N
,是 N! / (a! b! c!)
.
例如,如果您有 (a,b,c) = (3,1,1)
则有 5!/(3! 1! 1!) = 20
安排。
c b a a a b a c a a a b a a c a a c a b
c a b a a b a a c a a c b a a a a b c a
c a a b a b a a a c a c a b a a a b a c
c a a a b a b c a a a c a a b a a a b c
b c a a a a b a c a a a c b a a a a c b
一般情况下,我们可以这样计算数量
nperm<-function(...) {
args<-as.numeric(list(...));
num<-lfactorial(sum(args));
den<-sum(lfactorial(args));
return(round(exp(num-den)));
}
所以,例如,
x<-expand.grid(0:5,0:5,0:5)
x<-x[rowSums(x)==5,]
x[,"nperm"]<-apply(x,1,function(x) do.call(nperm,as.list(x)))
Var1 Var2 Var3 nperm
5 0 0 1
4 1 0 5
3 2 0 10
2 3 0 10
1 4 0 5
0 5 0 1
4 0 1 5
3 1 1 20
2 2 1 30
1 3 1 20
0 4 1 5
3 0 2 10
2 1 2 30
1 2 2 30
0 3 2 10
2 0 3 10
1 1 3 20
0 2 3 10
1 0 4 5
0 1 4 5
0 0 5 1
和 sum(x[,"nperm"]) == 243
,符合预期。
我有三个不同的事件 (1,2,3),具有不同的概率(0.15、0.76、0.09),我想抽取 5 次并进行替换。 我现在可以使用
确定可能的组合数量nsimplex(3,5) ### =21
来自组合包。 我可以使用
确定每个组合的概率mySimplex <- xsimplex(3,5)
myProbs<-c(0.15, 0.76, 0.09)
results<- apply(mySimplex,2,dmultinom,prob=myProbs)
此外,我当然可以通过计算3^5=243来确定排列数
但是,如果不手动计算它们,我怎么知道相同组合的每个排列被绘制的频率?也就是说,我的每个组合中有多少排列?
如果我没理解错的话,有 243 种排列构成了 21 种不同的组合。现在我的问题是,每个组合有多少排列。例如。组合 {1,1,1,1,1} 只会构建一次,而其他组合则由多个排列创建。
我想你可以通过使用每个组合的概率来得出这个,但我不知道该怎么做?或者有没有其他方法可以在 R 中轻松确定这一点? 提前谢谢你。
为了使其可重现,我需要使用 set.seed(<some_value>)
但这是使用 sample
绘制不同组合的一次尝试(不考虑不同的排列。如果排列是认为不同,然后取出 sort
步骤:
table( # get the counts of distinct combinations
apply( # this will collapse values by column
replicate(100000, # yields a 100,000 column matrix
{sample(c("1","2","3"), 5 ,repl=TRUE, prob=c(.5,.25,.25) )}),
2, function(x) paste(sort(x), collapse=".")) )
1.1.1.1.1 1.1.1.1.2 1.1.1.1.3 1.1.1.2.2 1.1.1.2.3 1.1.1.3.3 1.1.2.2.2
3090 7705 8144 7851 15408 7649 3997
1.1.2.2.3 1.1.2.3.3 1.1.3.3.3 1.2.2.2.2 1.2.2.2.3 1.2.2.3.3 1.2.3.3.3
11731 11554 3940 949 3844 5955 4019
1.3.3.3.3 2.2.2.2.2 2.2.2.2.3 2.2.2.3.3 2.2.3.3.3 2.3.3.3.3 3.3.3.3.3
961 99 506 990 997 510 101
A.Webb 建议我们将理论 dmultinom
与实践进行比较:
dmultinom(c(4,1,0),prob=c(0.5,0.25,0.25))*2
[1] 0.15625
因此,对于第一个值 3125 的预测与 3090 的模拟值以及第二个和第三个值以及 7812.5 与 7705 和 8144 的模拟相比,可以说是准确的。
项目 1 的 a
个不可区分的副本的排列数,项目 2 的 b
,项目 3 的 c
,其中 a + b + c = N
,是 N! / (a! b! c!)
.
例如,如果您有 (a,b,c) = (3,1,1)
则有 5!/(3! 1! 1!) = 20
安排。
c b a a a b a c a a a b a a c a a c a b
c a b a a b a a c a a c b a a a a b c a
c a a b a b a a a c a c a b a a a b a c
c a a a b a b c a a a c a a b a a a b c
b c a a a a b a c a a a c b a a a a c b
一般情况下,我们可以这样计算数量
nperm<-function(...) {
args<-as.numeric(list(...));
num<-lfactorial(sum(args));
den<-sum(lfactorial(args));
return(round(exp(num-den)));
}
所以,例如,
x<-expand.grid(0:5,0:5,0:5)
x<-x[rowSums(x)==5,]
x[,"nperm"]<-apply(x,1,function(x) do.call(nperm,as.list(x)))
Var1 Var2 Var3 nperm
5 0 0 1
4 1 0 5
3 2 0 10
2 3 0 10
1 4 0 5
0 5 0 1
4 0 1 5
3 1 1 20
2 2 1 30
1 3 1 20
0 4 1 5
3 0 2 10
2 1 2 30
1 2 2 30
0 3 2 10
2 0 3 10
1 1 3 20
0 2 3 10
1 0 4 5
0 1 4 5
0 0 5 1
和 sum(x[,"nperm"]) == 243
,符合预期。