Domanda

Qualcuno mi ha fatto una domanda via e-mail sulle partizioni intere l'altro giorno (dato che avevo rilasciato un modulo Perl, Integer :: Partition, per generarle), a cui non ero in grado di rispondere.

Sfondo: qui ci sono tutte le partizioni intere di 7 (la somma di ogni riga è uguale a 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

Ora se osserviamo le lunghezze di ogni partizione e contiamo quante ce ne sono di ogni lunghezza:

1 1
2 3
3 4
4 3
5 2
6 1
7 1

... vediamo una partizione ha una lunghezza di 1 (7), una ha una lunghezza di 7 (1 1 1 1 1 1 1). Ci sono 4 partizioni che hanno una lunghezza di 3: (5 1 1), (4 2 1), (3 3 1), (3 2 2).

Per un numero maggiore di N, se si rappresenta graficamente la distribuzione delle lunghezze delle partizioni, emerge una curva asimmetrica, inclinata verso l'origine. Se sei curioso, traccia il grafico della seguente lunghezza della partizione per 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

Se sei interessato a generare questi conteggi di distribuzione, ecco il codice che ho usato:

#! /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;
}

(nota: sul mio computer, N = 90 impiega circa 10 minuti per generare).

Quindi la mia domanda è: quale equazione può essere usata per abbinare la curva di distribuzione osservata? È una Gauss (una distribuzione gaussiana può essere asimmetrica?) O una distribuzione di Poisson o qualcos'altro?

Come posso risolverlo per N? Se ricordo la mia matematica di scuola superiore, posso determinare il picco risolvendo quando la derivata interseca 0. Come posso produrre la derivata? Ho cercato sul web, ma tutto ciò che ottengo sono documenti matematici astrusi. Ho solo bisogno di un po 'di codice :)

È stato utile?

Soluzione

Penso che una distribuzione di Poisson sia una stima ragionevole. Dato che la presunzione il tuo problema si trasforma ora in una ricerca della frequenza massima, k, dato N. Penso che tu abbia due approcci:

  1. lo capisco da un punto di vista matematico (vorrei iniziare guardando combinatorics , ma che potrebbe non essere un buon indirizzo)
  2. presumi che sia poisson e misura il picco per ogni dato N, come hai sopra.

Una volta che hai il picco (k), stimare lambda dovrebbe essere semplice (provane alcuni) e hai la tua curva.

Un altro approccio è quello di elaborare il tutto in pitone e chiedere sulle schede intorpidite o scipy :-)

HTH

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top