2011-08-24 14 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} 

Quanto sopra sono un esempio di dati effettivi con cui mi sto occupando. Io uso BinCounts, ma questo è solo per illustrare istogramma visivamente dovrebbe farlo: Vorrei per adattarsi alla forma di quella istogrammaFindFit con BinCounts o Istogramma in Mathematica

[email protected] 

enter image description here

so come adattare datapoints loro come:

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

Che è lontano da quello che voglio fare: come posso inserire bin-count/istogrammi in Mathematica?

risposta

19

Se si dispone di MMA V8 è possibile utilizzare il nuovo 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] *) 

Può andare bene anche altre distribuzioni.


Un'altra funzione utile è V8 HistogramList, che fornisce i dati di categorizzazione Histogram s'. Ci sono anche tutte le opzioni di 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

Si potrebbe anche provare NonlinearModeFit per il montaggio. In entrambi i casi è bene avere i propri parametri iniziali per avere le migliori possibilità di ottenere un adattamento ottimale a livello globale.


In V7 non c'è HistogramList ma si potrebbe ottenere lo stesso elenco con this:

FH funzione Istogramma [dati, bspec, FH] viene applicato a due argomenti: un elenco di bin {{Subscript [b, 1], Subscript [b, 2]}, {Subscript [b, 2], Subscript [b, 3]}, [Ellipsis]} e corrispondente elenco di conteggi {Pedice [ c, 1], pedice [c, 2], [ellissi]}. La funzione dovrebbe restituire un elenco di altezze da utilizzare per ciascuno degli indici [c, i].

questo può essere utilizzato come segue (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}}}} *) 

Naturalmente, è ancora possibile utilizzare BinCounts ma il manchi algoritmi di categorizzazione automatica di MMA. È necessario fornire un binning di tua scelta:

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

Come si può vedere i parametri di misura può dipendere un po 'sulla vostra scelta binning.In particolare il parametro che ho chiamato s dipende in modo critico dalla quantità di bin. Più sono i contenitori, più basso è il conteggio dei singoli contenitori e più basso sarà il valore di s.

+0

grazie mille, questo è molto utile. – 500