如何在java中确定最合适的分布?

时间:2010-06-02 21:12:54

标签: java math statistics

我有一堆数据(50到500个点之间,每个点都可以取正值),需要确定哪个分布最能描述它们。我已经为其中几个人手动完成了这项工作,但需要自动完成此任务。

有些集是完全模态的(每个数据的值都是15),有些是强模态或双峰的,有些是钟形曲线(通常是倾斜的,具有不同程度的kertosis / pointiness),有些是大致平坦的,并且还有许多其他可能的分布(责任,幂律等)。我需要一种方法来确定哪种分布最能描述数据,并且(理想情况下)还为我提供了适应度量,以便我知道我对分析的信心。

现有的开源库是理想的,其次是我自己可以实现的文档化的算法。

7 个答案:

答案 0 :(得分:5)

在缺少某些先验知识的情况下,寻找适合的分布不太可能给您带来好的结果。您可能会发现巧合的分布很适合,但不太可能是基础分布。

您是否有任何可用的元数据暗示数据的含义?例如,“这是从自然群体中采样的开放式数据,因此它是某种正态分布”,而“这些数据固有地界定为0且离散,因此检查最合适的泊松”。

我不知道Java的任何分发求解器,我不知道有什么可以猜测使用哪个发行版。您可以检查一些统计属性(偏斜/等)并在此进行一些猜测 - 但您更有可能最终得到一个不能充分代表基础分布的意外良好拟合。真实的数据很嘈杂,如果你甚至不知道它是什么分布,那就有太多的自由度。

答案 1 :(得分:5)

这可能超出您想要的范围,但它似乎是最完整的方法(并且它允许访问R中可用的大量统计知识):

  1. 使用JRI与R统计语言进行通信
  2. 在内部使用R,如this thread
  3. 所示

答案 2 :(得分:3)

看看Apache commons-math

答案 3 :(得分:2)

您正在寻找的是“适合度”的总标题。你可以搜索“适合度测试。”

唐纳德·克努特(Donald Knuth)在“数值算法”(Seminumerical Algorithms)中描述了几种流行的拟合优度测试:卡方检验和Kolmogorov-Smirnov检验。但是你必须先了解一下你想要测试的发行版。例如,如果您有钟形曲线数据,则可以尝试普通或柯西分布。

答案 4 :(得分:1)

如果您真正需要分发的是为您采样的数据建模,您可以根据您拥有的数据进行自己的分发:

1。创建样本的直方图:选择容器大小的一种方法是here。您可以选择其他方法来选择容器大小。

2。导出样本CDF将直方图视为PDF,并计算积分。最好缩放箱子的高度,以便CDF具有正确的特征......即+ Infinity的CDF值为1.0。

将分布用于建模目的:

3。从您的分布中绘制X:从U(0,1)绘制Y.在值为Y的CDF上使用反向查找来确定X,使得CDF(X)= Y.由于CDF是可逆的,因此X是唯一的。

答案 5 :(得分:0)

我听说过一个名为Eureqa的软件包可能会很好地填补这个问题。我只下载了它;我自己还没试过。

答案 6 :(得分:0)

您可以使用SSJ library进行三步操作:

  • 使用最大似然估计(MLE)分别拟合每个分布。使用SSJ,可以使用静态方法 getInstanceFromMLE(double [] x, int n) available on each distribution
  • 对于获得的每个分布,请计算其与真实数据的拟合优度,例如using Kolmogorov-Smirnov static void kolmogorovSmirnov(double []数据,ContinuousDistribution dist,double [] sval, double [] pval),请注意,调用此函数之前无需对数据进行排序。
  • 选择具有 p值最高的分布作为最佳拟合分布