Как я могу подогнать кривую к распределению гистограммы? - PullRequest
5 голосов
/ 25 октября 2008

Кто-то задал мне вопрос по электронной почте о целочисленных разделах на днях (так как я выпустил модуль 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 голосов
/ 25 октября 2008

Я думаю, что распределение Пуассона является разумной оценкой. Учитывая это предположение, ваша проблема теперь превращается в поиск максимальной частоты k, учитывая N. Я думаю, что у вас есть два подхода:

  1. понять это с математической точки зрения (я бы начал с рассмотрения комбинаторики , но это может быть не очень хорошим управлением)
  2. предположите, что это пуассон, и измерьте пик для любого заданного N, как указано выше.

Как только вы получите пик (k), оценка лямбды должна быть простой (попробуйте несколько), и вы получите свою кривую.

Другой подход состоит в том, чтобы проработать все это в python и спросить на нудистских или скучных досках: -)

НТН

...