如何将曲线拟合到直方图分布?

5

前几天,有人通过电子邮件向我提出了一个关于整数划分的问题(因为我发布了一个Perl模块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(7),一个分区长度为7(1 1 1 1 1 1 1)。有4个长度为3的分区:(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 995 790 627 490 385 297 231 176 135 101 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时确定峰值。如何产生导数?我在网上搜索,但只得到晦涩难懂的数学论文。我只需要一些代码:)
1个回答

2
我认为泊松分布是一个合理的估计。在这个假设下,你现在的问题转变为找到最大频率k,给定N。我认为你有两种方法:
  1. 从数学角度来算出它(我会从组合数学开始,但那可能不是一个特别好的指引)
  2. 假设它是泊松分布,并测量任何给定N的峰值,就像你上面所做的那样。
一旦你有了峰值(k),估计λ应该很容易(试试几个),然后你就有了你的曲线。
另一种方法是在Python中处理整个事情,并在numpy或scipy论坛上询问:-)
希望对你有帮助。

高峰是一回事,但如果曲线已知,那么对于1<M<N的整数N,“长度为M的分区有多少存在”的问题也将得出合理的答案。 - dland
返回翻译文本:虽然我有一种感觉,lambda将随N变化而变化。 - Simon
这个回答并不能真正解答问题,但因为它是唯一的回应,你得到了分数 :) - dland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接