加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 23:33:22 所属栏目:大数据 来源:网络整理
导读:前几天有人通过电子邮件向我询问了一个关于整数分区的问题(因为我发布了一个Perl模块,Integer :: Partition来生成它们),我无法回答. 背景:这里是7的所有整数分区(每行的总和等于7). 76 15 25 1 14 34 2 14 1 1 13 3 13 2 23 2 1 13 1 1 1 12 2 2 12 2 1 1 1
前几天有人通过电子邮件向我询问了一个关于整数分区的问题(因为我发布了一个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 "$nt$st$size{$s}n";
    }
    close $out;
    my $delta = time - $start;
    print "$nt$delta secsn";
    ++$n;
}

(注意:在我的电脑上,N = 90需要大约10分钟才能生成).

所以我的问题是:可以使用哪个方程来匹配观察到的分布曲线?它是高斯(高斯分布可以是不对称的吗?)还是泊松分布,还是别的什么?

我如何解决N?如果我记得高中时的数学,我可以通过求解导数与0相交来确定峰值.如何产生导数?我在网上搜索过,但我得到的只是深奥的数学论文.我只需要一些代码:)

解决方法

我认为泊松分布是一个合理的估计.考虑到这个假设你的问题现在变成了最大频率k,给定N.我认为你有两种方法:

>从数学的角度来看(我会从combinatorics开始,但这可能不是一个特别好的转向)
>假设它是泊松并测量任何给定N的峰值,如上所述.

一旦你有了峰值(k),估计λ应该是直截了当的(尝试一些)并且你有你的曲线.

另一种方法是在python中处理整个事情并询问numpy或scipy板:-)

HTH

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读