FindFit с BinCounts или гистограммой в Mathematica - PullRequest
5 голосов
/ 24 августа 2011
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

enter image description here

Я знаю, как соответствовать точкам данныхСами как:

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

Что далеко от того, что я хочу сделать: Как я могу вписать счетчики / гистограммы в Mathematica?

1 Ответ

19 голосов
/ 24 августа 2011

Если у вас есть 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
]

enter image description here

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}]]

enter image description here

Вы также можете попробовать NonlinearModeFit для подгонки.В обоих случаях полезно использовать собственные исходные значения параметров, чтобы иметь наилучшие шансы на то, что вы получите глобально оптимальное соответствие.


В V7 нет HistogramList, но вы можете получитьтот же список, используя this :

Функция fh в гистограмме [data, bspec, fh] применяется к двум аргументам: список бинов {{Subscript [b, 1], Subscript [b, 2]}, {Subscript [b, 2], Subscript [b, 3]}, [Ellipsis]} и соответствующий список счетчиков {Subscript [c, 1], Subscript [c, 2], [Многоточие]}.Функция должна возвращать список высот, которые будут использоваться для каждого из нижних индексов [c, i].

Это можно использовать следующим образом ( из моего предыдущего ответа ):

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}]
]

enter image description here

Как видите, параметры подгонки могут в значительной степени зависеть от вашего выбора объединения.В частности, параметр, который я назвал s, критически зависит от количества бинов.Чем больше ячеек, тем меньше будет количество отдельных ячеек и тем меньше будет значение s.

...