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

上記は私が扱っている実際のデータのサンプルです。自分が好きな私はMathematicaのBinCountsやヒストグラムを使ったFindFit

[email protected] 

enter image description here

は、私がデータポイントにフィットする方法を知っているヒストグラムの形状に合わせたい: 私はBinCountsを使用していますが、これは単に視覚的にヒストグラムがそれを行う必要があります説明することです

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

Mathematicaにビンカウント/ヒストグラムを合わせるにはどうすればよいですか?

答えて

19

あなたは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機能がHistogramのビニングデータを提供しますHistogramList、です。それは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 [データ、bspec、FH]は2つの の引数に適用されます。リスト下付き文字[b、1]、下付き文字[b、 2]}、{下付き文字[b、2]、下付き文字[b、3]}、[省略形]}、対応する のリスト{下付き文字[ c、1]、添え字[c、2]、[省略記号]}である。 関数は、 添え字[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}] 
] 

enter image description here

:あなたはあなた自身のビニングを提供する必要があります。特にsと呼ばれるパラメータは、ビンの量に大きく依存します。ビンが多いほど、個々のビン数が少なくなり、値が低くなると、sとなります。

+0

ありがとう、これは非常に役に立ちます。 – 500

関連する問題