代码之家  ›  专栏  ›  技术社区  ›  Eadwacer

如何确定Java中的最佳拟合分布?

  •  7
  • Eadwacer  · 技术社区  · 16 年前

    我有一组数据(50到500个点之间,每个点可以取正整数值),需要确定哪种分布最能描述它们。我已经为其中的几个手动完成了这项工作,但是需要在将来自动完成这项工作。

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

    现有的开放源码库将是理想的,接下来是我可以自己实现的有良好文档记录的算法。

    7 回复  |  直到 8 年前
        1
  •  5
  •   Alex Feinman    12 年前

    寻找一个合适的分布不太可能给你在缺乏一些良好的结果 先验的 知识。你可能会发现 巧合地 是一个很好的匹配,但不太可能是基础分布。

    是否有任何元数据可以提示数据 方法 ?例如,“这是从自然种群中取样的开放式数据,所以它是某种正态分布”,而“这类数据固有地被限定为0和离散的,因此检查最佳拟合泊松”。

    我不知道在我的头脑中有什么Java解决方案,而且我不知道有什么可以猜测使用哪种发行版。您可以检查一些统计属性(skew/etc),并在这里进行一些猜测——但是您很可能会意外地得到一个很好的拟合,它不能充分表示底层的分布。真实的数据是嘈杂的,如果你甚至不知道它是什么分布,就有太多的自由度。

        2
  •  5
  •   Community Mohan Dere    9 年前

    这可能超出了您想要做的事情,但它似乎是最完整的方法(它允许访问R中的统计知识财富):

    1. 使用 JRI 与R统计语言沟通
    2. 内部使用R,如中所示 this thread
        3
  •  3
  •   bmargulies    16 年前

    看阿帕奇 commons-math .

        4
  •  2
  •   John D. Cook    16 年前

    你要找的是“拟合优度”这个总标题,你可以在“拟合优度测试”上搜索。

    DonaldKnuth在半数值算法中描述了两种流行的拟合优度测试:卡方测试和Kolmogorov-Smirnov测试。但是你必须先知道你想要测试什么发行版。例如,如果有钟形曲线数据,可以尝试使用正态分布或柯西分布。

        5
  •  1
  •   andand    16 年前

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

    1。创建样本的柱状图: 选择垃圾箱大小的一种方法是 here . 您可能更喜欢其他选择肥料箱大小的方法。

    2。提取样本 CDF : 把柱状图想象成PDF,然后计算积分。最好是调整垃圾箱的高度,使CDF具有正确的特性…也就是说,CDF在+无穷远处的值是1.0。

    要将分布用于建模,请执行以下操作:

    三。从您的分发中提取X: 从u(0,1)绘制y。在CDF上使用值y的反向查找来确定x,这样CDF(x)=y。由于CDF是可逆的,所以x是唯一的。

        6
  •  0
  •   duffymo    16 年前

    我听说有个包裹叫 Eureqa 这可能会很好地填补这个账单。我只下载了它;我自己还没试过。

        7
  •  0
  •   eschnou    8 年前

    您可以使用 SSJ library :

    • 使用最大似然估计(MLE)分别拟合每个分布。使用ssj,这可以通过静态方法实现。 GetInstanceFromMLE(双[]x, int n) available on each distribution .
    • 例如,对于所获得的每个分布,用实际数据计算其拟合优度。 using Kolmogorov-Smirnov : 静态void kolmogorovsmirnov(双[]数据,连续分布dist,双[]sval,双[]pval) ,请注意,在调用此函数之前不需要对数据进行排序。
    • 选择具有最高 P值 作为您的最佳分配