2011-08-24 28 views
5
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} 

Lo anterior son una muestra de los datos reales que estoy tratando. utilizo BinCounts, pero esto es sólo para ilustrar histograma visualmente debe hacerlo: me gustaría adaptarse a la forma de ese histogramaFindFit con BinCounts o histograma en Mathematica

[email protected] 

enter image description here

sé cómo encajar puntos de datos propios gustan:

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

Lo que está lejos de lo que quiero hacer: ¿Cómo puedo incluir bin-counts/histograms en Mathematica?

Respuesta

19

Si tiene MMA V8 podría utilizar el nuevo 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] *) 

Puede caber otras distribuciones también.


Otra función útil es V8 HistogramList, que proporciona datos de agrupación Histogram 's. También se necesitan todas las opciones de 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

También puede probar NonlinearModeFit para el montaje. En ambos casos, es bueno venir con sus propios valores de parámetros iniciales para tener las mejores posibilidades de que termine con un ajuste globalmente óptimo.


En V7 no hay HistogramList, pero se podía conseguir la misma lista con this:

El FH función de histograma [datos, bspec, FH] se aplica a dos argumentos: una lista de bandejas {{Subíndice [b, 1], Subíndice [b, 2]}, {Subíndice [b, 2], Subíndice [b, 3]}, [Elipsis]}, y correspondiente lista de recuentos {Subíndice [ c, 1], Subíndice [c, 2], [Ellipsis]}. La función debe devolver una lista de alturas que se utilizarán para cada uno de los Subíndices [c, i].

Esto se puede utilizar de la siguiente manera (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}}}} *) 

Por supuesto, todavía se puede utilizar BinCounts pero el que más te algoritmos de agrupación automática de MMA. Usted tiene que proporcionar un binning de su propia:

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

Como se puede ver los parámetros de ajuste puede depender un poco en su elección de agrupación.Particularmente, el parámetro que llamé s depende críticamente de la cantidad de contenedores. Cuantos más contenedores, menor será el número de contenedores individuales y menor será el valor de s.

+0

muchas gracias, esto es muy útil. – 500