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

Yukarıdakiler, uğraştığım gerçek verilerin bir örneğidir. kendileri gibi benMathematica'da BinCounts veya Histogram ile FindFit

[email protected] 

enter image description here

Ben datapoints sığdırmak bilmelerini histogram şekline uyacak istiyorum: Ben BinCounts kullanmak, ama bu sadece görsel histogram yapmalı göstermektir

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

Yapacağım şeyden çok uzak: Bin sayıları/histogramları Mathematica'ya nasıl yerleştirebilirim?

cevap

19

Eğer MMA V8 varsa Çok diğer dağılımları sığabilecek yeni 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] *) 

kullanabilirsiniz.


Yararlı başka V8 fonksiyonu Histogram 'ın gruplama verisi sağlamaktadır ki, HistogramList olduğunu. O da Histogram 's seçeneklerinin hepsini alır.

{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

Ayrıca uydurma için NonlinearModeFit deneyebilirsiniz. Her iki durumda da, global olarak en uygun bir uyumla sonuçlanacak en iyi şansa sahip olmak için kendi başlangıç ​​parametresi değerleriyle gelmeniz iyi olur. V7


hiçbir HistogramList yoktur ancak this kullanarak aynı listeyi alabilir:

Histogram [veriler, bspec, fh] işlevi fh iki argümanlar uygulanır

: bir liste kutuları {{Subscript [b, 1], Subscript [b, 2]}, {Subscript [b, 2], Subscript [b, 3]}, [Ellipsis]} ve karşılık gelen sayım listesi {Subscript [ c, 1], Abstrakt [c, 2], [Ellipsis]}. işlevi, Abstraktının [c, i] her biri için kullanılacak bir yükseklik listesi döndürmelidir.

Reap[Histogram[daList, Automatic, (Sow[{#1, #2}]; #2) &]][[2]] 

(* ==> {{{{{0, 20}, {20, 40}, {40, 60}, {60, 80}, {80, 100}}, {2, 
    10, 20, 17, 7}}}} *) 

Tabii, yine BinCounts kullanabilirsiniz ancak MMA otomatik gruplama algoritmaları özledim: (from my earlier answer) aşağıdaki gibi

Bu

kullanılabilir. Gördüğünüz gibi

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

uyum parametreler gruplama seçimine biraz bağlı olabilir: Kendi bir binning sağlamak zorunda.Özellikle, s isimli parametre, kritik olarak bidonların miktarına bağlıdır. Daha fazla kutu, bireysel bin sayısı azalır ve s'un değeri düşer.

+0

Çok teşekkürler, bu çok yardımcı oluyor. – 500