【问题标题】:FindFit with BinCounts or Histogram in Mathematica在 Mathematica 中使用 BinCounts 或直方图的 FindFit
【发布时间】:2011-08-24 18:33:20
【问题描述】:
daList={62.8347, 88.5806, 74.8825, 61.1739, 66.1062, 42.4912, 62.7023, 
        39.0254, 48.3332, 48.5521, 51.5432, 69.4951, 60.0677, 48.4408, 
        59.273, 30.0093, 94.6293, 43.904, 59.6066, 58.7394, 68.6183, 83.0942, 
        73.1526, 47.7382, 75.6227, 58.7549, 59.2727, 26.7627, 89.493, 
        49.3775, 79.9154, 73.2187, 49.5929, 84.4546, 28.3952, 75.7541, 
        72.5095, 60.5712, 53.2651, 33.5062, 80.4114, 63.7094, 90.2438, 
        55.2248, 44.437, 28.1884, 4.77477, 36.8398, 70.3579, 28.1913, 
        43.9001, 23.8907, 12.7823, 22.3473, 57.6724, 49.0148}

以上是我正在处理的实际数据示例。 我使用 BinCounts,但这只是为了直观地说明直方图应该这样做:我想适应该直方图的形状

Histogram@data

我知道如何像这样拟合数据点:

model = 0.2659615202676218` E^(-0.2222222222222222` (x - \[Mu])^2)
FindFit[data, model, \[Mu], x]

这远非我想做的事:如何在 Mathematica 中拟合 bin 计数/直方图?

【问题讨论】:

    标签: wolfram-mathematica histogram bin


    【解决方案1】:

    如果您有 MMA V8,则可以使用新的 DistributionFitTest

    disFitObj = DistributionFitTest[daList, NormalDistribution[a, b],"HypothesisTestData"];
    
    Show[
       SmoothHistogram[daList], 
       Plot[PDF[disFitObj["FittedDistribution"], x], {x, 0, 120}, 
            PlotStyle -> Red
       ], 
       PlotRange -> All
    ]
    

    disFitObj["FittedDistributionParameters"]
    
    (* ==> {a -> 55.8115, b -> 20.3259} *)
    
    disFitObj["FittedDistribution"]
    
    (* ==> NormalDistribution[55.8115, 20.3259] *)
    

    它也可以适应其他发行版。


    另一个有用的 V8 函数是HistogramList,它为您提供Histogram 的分箱数据。它也需要Histogram 的所有选项。

    {bins, counts} = HistogramList[daList]
    
    (* ==> {{0, 20, 40, 60, 80, 100}, {2, 10, 20, 17, 7}} *)
    
    centers = MovingAverage[bins, 2]
    
    (* ==> {10, 30, 50, 70, 90} *)
    
    model = s E^(-((x - \[Mu])^2/\[Sigma]^2));
    
    pars = FindFit[{centers, counts}\[Transpose], 
                         model, {{\[Mu], 50}, {s, 20}, {\[Sigma], 10}}, x]
    
    (* ==> {\[Mu] -> 56.7075, s -> 20.7153, \[Sigma] -> 31.3521} *)
    
    Show[Histogram[daList],Plot[model /. pars // Evaluate, {x, 0, 120}]]
    

    您也可以尝试NonlinearModeFit 进行拟合。在这两种情况下,最好使用您自己的初始参数值,以便您有最好的机会最终获得全局最优拟合。


    在 V7 中没有 HistogramList,但您可以使用 this 获得相同的列表:

    Histogram[data,bspec,fh] 中的函数 fh 应用于两个 参数:一个 bin 列表 {{Subscript[b, 1],Subscript[b, 2]},{Subscript[b, 2],Subscript[b, 3]},[Ellipsis]},以及对应的 计数列表 {Subscript[c, 1],Subscript[c, 2],[Ellipsis]}。这 函数应返回要用于每个高度的列表 下标[c, i].

    这可以使用如下(from my earlier answer):

    Reap[Histogram[daList, Automatic, (Sow[{#1, #2}]; #2) &]][[2]]
    
    (* ==> {{{{{0, 20}, {20, 40}, {40, 60}, {60, 80}, {80, 100}}, {2, 
        10, 20, 17, 7}}}} *)
    

    当然,您仍然可以使用BinCounts,但是您会错过 MMA 的自动分箱算法。您必须提供自己的分箱:

    counts = BinCounts[daList, {0, Ceiling[Max[daList], 10], 10}]
    
    (* ==>  {1, 1, 6, 4, 11, 9, 9, 8, 5, 2} *)
    
    centers = Table[c + 5, {c, 0, Ceiling[Max[daList] - 10, 10], 10}]
    
    (* ==>  {5, 15, 25, 35, 45, 55, 65, 75, 85, 95} *)
    
    pars = FindFit[{centers, counts}\[Transpose],
                    model, {{\[Mu], 50}, {s, 20}, {\[Sigma], 10}}, x]
    
    (* ==> \[Mu] -> 56.6575, s -> 10.0184, \[Sigma] -> 32.8779} *)
    
    Show[
       Histogram[daList, {0, Ceiling[Max[daList], 10], 10}], 
       Plot[model /. pars // Evaluate, {x, 0, 120}]
    ]
    

    如您所见,拟合参数可能在很大程度上取决于您的分箱选择。特别是我称为s 的参数主要取决于垃圾箱的数量。 bin 越多,单个 bin 的计数就越低,s 的值也会越低。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      • 2019-05-08
      相关资源
      最近更新 更多