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

Ở trên là mẫu dữ liệu thực tế tôi đang xử lý. tôi sử dụng BinCounts, nhưng điều này chỉ là để minh họa biểu đồ trực quan nên làm điều đó: Tôi muốn để phù hợp với hình dạng của biểu đồ đóFindFit với BinCounts hoặc Histogram trong Mathematica

[email protected] 

enter image description here

tôi biết làm thế nào để phù hợp với datapoints mình thích:

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

Cách xa những gì tôi muốn làm: Làm cách nào tôi có thể phù hợp với số lượng đếm/biểu đồ trong Mathematica?

Trả lời

19

Nếu bạn có MMA V8 bạn có thể sử dụng mới 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] *) 

Nó có thể phù hợp với các bản phân phối khác nữa.


Một chức năng hữu ích V8 là HistogramList, mà cung cấp cho bạn với các dữ liệu di chuyển chuột đã Histogram 's. Nó cũng mất khoảng tất cả các tùy chọn của 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

Bạn cũng có thể thử NonlinearModeFit cho phù hợp. Trong cả hai trường hợp, bạn nên sử dụng các giá trị tham số ban đầu của riêng mình để có cơ hội tốt nhất mà bạn kết thúc với sự phù hợp tối ưu trên toàn cầu.


Trong V7 không có HistogramList nhưng bạn có thể nhận được danh sách tương tự sử dụng this:

Chức năng fh trong Histogram [dữ liệu, bspec, fh] được áp dụng cho hai đối số: một danh sách các thùng {{Subscript [b, 1], Subscript [b, 2]}, {Subscript [b, 2], Subscript [b, 3]}, [Ellipsis]} và tương ứng danh sách đếm {Subscript [ c, 1], Chỉ số [c, 2], [Dấu ba chấm]}. Chức năng phải trả về một danh sách chiều cao được sử dụng cho từng số Chỉ số [c, i].

này có thể được sử dụng như sau (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}}}} *) 

Tất nhiên, bạn vẫn có thể sử dụng BinCounts nhưng bạn bỏ lỡ các thuật toán di chuyển chuột tự động của MMA. Bạn phải cung cấp một di chuyển chuột của riêng bạn:

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

Như bạn có thể thấy các thông số phù hợp có thể phụ thuộc khá nhiều vào sự lựa chọn di chuyển chuột của bạn.Riêng tham số tôi gọi là s phụ thuộc rất lớn vào lượng thùng. Càng nhiều thùng, số lượng thùng rác càng thấp và giá trị của s sẽ càng thấp.

+0

cảm ơn bạn rất nhiều, điều này rất hữu ích. – 500

Các vấn đề liên quan