1

ベクトルの一意の順列を作成しようとしています

 c(rep(0,20),rep(1,20))

しかし、combinat パッケージの permn には、「ベクターのエラー.... 指定されたベクター サイズが大きすぎます」と表示されます。

この質問のスクリプト uniqueperm2 も試してみましたが、「指定されたベクトルが大きすぎます」というエラーが再び発生しました。

私の理解では、パーマは40を作成します!順列。

このベクトルの一意の順列の数を見つけるだけで、私が取り組んでいる全体的な問題を解決できるかもしれません。

長さ 40 のベクトルの一意の順列を見つける問題は R には大きすぎますか? リストされたベクトルの一意の順列の数を把握する方法を誰かに説明してもらえますか?

4

3 に答える 3

2

このベクトルの各一意の順列は、{1、2、...、40}のサイズ20のサブセット(つまり、1のインデックス)に対応します。

これらのサブセットの数は「40choose20」、つまり40です。/(20!x 20!)。Googleの計算機によると、これは137,846,528,820に相当します。

于 2012-11-02T18:04:36.687 に答える
1

すでに説明したように、順列の数は次のように計算できます。

R> choose(40,20)
[1] 137846528820

ただし、R が現在処理できる最長のベクトルは 2^31 - 1 要素の長さです。つまり、次のようになります。

R> 2^31 - 1
[1] 2147483647

これは、生成する順列の数よりもはるかに少ないです。したがって、これらの順列を生成するために標準関数でこれを試した場合に得られるエラーとエラーcombn():

R> combn(40, 20)
Error in matrix(r, nrow = len.r, ncol = count) : 
  invalid 'ncol' value (too large or NA)
In addition: Warning message:
In combn(40, 20) : NAs introduced by coercion

この時点で、お風呂のような方法で順列を生成し、R の多くのビッグデータ パッケージの 1 つを調査するコードを作成する必要があります (ハイ パフォーマンス コンピューティングのタスク ビューを参照してください)。

または、これは私の提案ですが、1,370億で何ができるかを考えてみてください! (アメリカの)順列を変更してから、別のアプローチを取ります。1 秒に 1 を処理できた場合 (つまり、1 秒かかった順列で意味のあることを行う場合)、4000 年後の結果にまだ取り組んでいることになります!

では、なぜすべての順列が必要なのですか? より小さなランダムセットで十分でしょうか?

于 2012-11-02T20:04:00.617 に答える
0

(40 から 20 を選択) の一意の順列があります (つまり、40 の位置のうち 20 を s に選択0し、残りの 20 を s に使用し1ます)。それでもかなりの数ですが、combn(40, 20) を試すことができます。

于 2012-11-02T18:04:09.313 に答える