Как я могу подогнать кривую к распределению гистограммы?

StackOverflow https://stackoverflow.com/questions/236195

Вопрос

На днях кто-то задал мне по электронной почте вопрос о целочисленных разделах (поскольку я выпустил 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.Как мне произвести производную?Я искал в Интернете, но все, что я нашел, это заумные математические статьи.Мне просто нужен код :)

Это было полезно?

Решение

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

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

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

Другой подход — проработать все это на Python и задать вопросы на досках numpy или scipy :-)

ХТХ

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top