ヒストグラム分布に曲線を当てはめるにはどうすればよいですか?
-
04-07-2019 - |
質問
先日、整数パーティションに関する質問(電子メールでInteger :: Partitionをリリースして生成した)があり、答えられませんでした。
背景:これはすべて7の整数パーティションです(各行の合計は7です)。
7
6 1
5 2
5 1 1
4 3
4 2 1
4 1 1 1
3 3 1
3 2 2
3 2 1 1
3 1 1 1 1
2 2 2 1
2 2 1 1 1
2 1 1 1 1 1
1 1 1 1 1 1 1
各パーティションの長さを見て、各長さの数を数えると:
1 1
2 3
3 4
4 3
5 2
6 1
7 1
... 1つのパーティションの長さは1(7)で、1つのパーティションの長さは7(1 1 1 1 1 1 1 1)です。 3つの長さを持つ4つのパーティションがあります:(5 1 1)、(4 2 1)、(3 3 1)、(3 2 2)。
Nの数が多い場合、パーティションの長さの分布をグラフ化すると、原点に向かって歪んだ非対称曲線が現れます。興味がある場合は、N = 40の次のパーティション長のカウントをグラフ化します。
1 20 133 478 1115 1945 2738 3319 3589 3590 3370 3036 2637 2241 1861 1530 1236 995790627627490385297231176135101 77 56 42 30 22 15 11 7 5 3 2 1 1
これらの分布カウントを生成することに興味がある場合、私が使用したコードは次のとおりです。
#! /usr/local/bin/perl
use strict;
use warnings;
use Integer::Partition;
my $n = shift || 1;
while (1) {
my $start = time;
my $i = Integer::Partition->new($n);
my %size;
while (my $p = $i->next) {
$size{scalar @$p}++;
}
open my $out, '>>', "bucket-count.out";
for my $s (sort {$a <=> $b} keys %size) {
print $out "$n\t$s\t$size{$s}\n";
}
close $out;
my $delta = time - $start;
print "$n\t$delta secs\n";
++$n;
}
(注:私のコンピューターでは、N = 90の生成に約10分かかります。)
つまり、私の質問は、観測された分布曲線と一致させるためにどの方程式を使用できるかということです。ガウス(ガウス分布は非対称になる可能性がありますか)またはポアソン分布、または他の何かですか?
Nに対してどのように解決しますか?高校の数学を覚えていれば、微分が0と交差するときに解くことでピークを決定できます。微分を生成するにはどうすればよいですか?私はウェブを検索しましたが、戻ってきたのは数学的な論文です。コードが必要です:)
解決
ポアソン分布は合理的な推定値だと思います。 Nが与えられると、問題は最大周波数kを見つけることになります。2つのアプローチがあると思います。
- 数学的な観点から考えてみてください( combinatorics を見ることから始めますが、それは特に良いステアではないかもしれません)
- それがポアソンであると仮定し、上記のように任意のNのピークを測定します。
ピーク(k)が得られたら、ラムダの推定は簡単で(数回試してください)、曲線が得られます。
別のアプローチは、すべてをPythonで実行し、numpyまたはscipyボードで確認することです:-)
HTH