2013-06-28 36 views
5

Tôi có câu hỏi về thuật toán phù hợp được sử dụng trong scipy. Trong chương trình của tôi, tôi có một tập hợp các điểm dữ liệu x và y chỉ với các lỗi y và muốn phù hợp với một hàmSự khác biệt giữa các thuật toán phù hợp trong scipy

f(x) = (a[0] - a[1])/(1+np.exp(x-a[2])/a[3]) + a[1] 

với nó.

Vấn đề là tôi nhận được các lỗi rất cao về các tham số và các giá trị và lỗi khác nhau cho các thông số phù hợp bằng cách sử dụng hai thói quen phù hợp scipy scipy.odr.ODR (với thuật toán hình vuông nhỏ nhất) và scipy.optimize. Tôi sẽ đưa ví dụ của tôi:

Fit với scipy.odr.ODR, fit_type = 2

Beta: [ 11.96765963 68.98892582 100.20926023 0.60793377] 
Beta Std Error: [ 4.67560801e-01 3.37133614e+00 8.06031988e+04 4.90014367e+04] 
Beta Covariance: [[ 3.49790629e-02 1.14441187e-02 -1.92963671e+02 1.17312104e+02] 
[ 1.14441187e-02 1.81859542e+00 -5.93424196e+03 3.60765567e+03] 
[ -1.92963671e+02 -5.93424196e+03 1.03952883e+09 -6.31965068e+08] 
[ 1.17312104e+02 3.60765567e+03 -6.31965068e+08 3.84193143e+08]] 
Residual Variance: 6.24982731975 
Inverse Condition #: 1.61472215874e-08 
Reason(s) for Halting: 
Sum of squares convergence 

và sau đó là phù hợp với scipy.optimize.leastsquares:

Fit với scipy.optimize. leastsq

beta: [ 11.9671859 68.98445306 99.43252045 1.32131099] 
Beta Std Error: [0.195503 1.384838 34.891521 45.950556] 
Beta Covariance: [[ 3.82214235e-02 -1.05423284e-02 -1.99742825e+00 2.63681933e+00] 
[ -1.05423284e-02 1.91777505e+00 1.27300761e+01 -1.67054172e+01] 
[ -1.99742825e+00 1.27300761e+01 1.21741826e+03 -1.60328181e+03] 
[ 2.63681933e+00 -1.67054172e+01 -1.60328181e+03 2.11145361e+03]] 
Residual Variance: 6.24982904455 (calulated by me) 

điểm của tôi là tham số phù hợp thứ ba: các kết quả

scipy.odr. ODR, fit_type = 2: C = 100.209 +/- 80600

scipy.optimize.leastsq: C = 99.432 +/- 12.730

Tôi không biết lý do tại sao những lỗi đầu tiên là cao hơn nhiều. Thậm chí tốt hơn: Nếu tôi đặt chính xác cùng một điểm dữ liệu với lỗi vào Nguồn gốc 9, tôi nhận được C = x0 = 99,41849 +/- 0,20283

và chính xác cùng một dữ liệu vào C++ ROOT Cern C = 99,85 +/- 1.373

mặc dù tôi đã sử dụng chính xác các biến ban đầu giống nhau cho ROOT và Python. Nguồn gốc không cần bất kỳ.

Bạn có bất kỳ đầu mối nào tại sao điều này xảy ra và đó là kết quả tốt nhất không?

tôi đã thêm mã cho bạn tại pastebin:

Cảm ơn bạn đã giúp đỡ!

EDIT: đây là âm mưu liên quan đến SirJohnFranklins bài: see comment below

+0

Bạn có thể vẽ đồ thị trên cùng một đồ thị các lỗi và lỗi thu được bằng (1) 'scipy.odr' với lỗi x và y, và (2)' ROOT' với lỗi x và y. Ngoài ra, làm thế nào để 'ROOT' xác định trọng số tương đối nào cho các lỗi x và y, vì chúng được đo bằng các đơn vị khác nhau? Trong 'scipy.odr',' sx' và 'sy' được chuyển thành trọng số bằng cách chia 1.0 cho ô vuông của chúng - không phải' ROOT' cũng giống nhau không? –

Trả lời

1

Bạn có thực sự cố gắng âm mưu phía ODRleastsq phù hợp ở bên cạnh? Họ nhìn về cơ bản giống hệt nhau:

enter image description here

Hãy xem xét những gì các thông số tương ứng với - chức năng bước được mô tả bởi beta[0]beta[1], các giá trị ban đầu và cuối cùng, giải thích cho đến nay phần lớn các khác biệt trong dữ liệu của bạn.Ngược lại, những thay đổi nhỏ trong beta[2]beta[3], điểm va chạm và độ dốc, sẽ có tác động tương đối ít trên hình dạng tổng thể của đường cong và do đó phương sai còn lại cho phù hợp. Do đó, không có gì ngạc nhiên khi các tham số này có lỗi tiêu chuẩn cao và được trang bị hơi khác nhau bởi hai thuật toán.

Lỗi chuẩn lớn hơn được báo cáo bởi ODR là do mô hình này kết hợp sai số trong giá trị y trong khi các ô vuông nhỏ nhất phù hợp không - sai số trong giá trị y đo được nên giảm sự tự tin của chúng tôi thông số phù hợp ước tính.

0

(Đáng buồn thay, tôi không thể tải lên các phù hợp, bởi vì tôi cần danh tiếng hơn. Tôi sẽ cung cấp cho các âm mưu Captain Sandwich, vì vậy ông có thể tải nó cho tôi.)

Tôi đang ở cùng nhóm làm việc là người bắt đầu chủ đề, nhưng tôi đã làm điều này.

Vì vậy, tôi đã thêm x-lỗi trên dữ liệu, bởi vì tôi không phải là lần cuối cùng. Lỗi thu được thông qua ODR vẫn cao ngớ ngẩn (4.18550164e + 04 trên bản beta [2]). Trong cốt truyện, tôi cho bạn thấy FIT từ [ROOT Cern] [2] đưa ra điều gì, với lỗi x và y. Ở đây, x0 là bản beta [2].

Đường cong màu đỏ và màu xanh lá cây có phiên bản beta khác, cột bên trái trừ đi sai số của 3.430 thu được bằng ROOT và sai số cộng với lỗi. Tôi nghĩ rằng điều này hoàn toàn có ý nghĩa, nhiều hơn, sai số 0,2 được cho bởi sự phù hợp của nguồn gốc 9 (mà chỉ có thể xử lý lỗi y, tôi nghĩ) hoặc lỗi khoảng 40k do ODR đưa ra, bao gồm x và y lỗi.

Có lẽ, bởi vì ROOT chủ yếu được sử dụng bởi các nhà vật lý thiên văn cần các thuật toán phù hợp, nó có thể xử lý nhiều khó khăn hơn, nhưng tôi không biết đủ về độ mạnh của thuật toán phù hợp.

+0

Tôi thực sự không nghĩ rằng có bất kỳ vấn đề nào với sự phù hợp mạnh mẽ - tất cả các thuật toán khác nhau mà bạn đã thử dường như đưa ra các ước tính hợp lý cho các tham số mô hình. Câu hỏi duy nhất trong tâm trí của tôi là về báo cáo của ODR về các lỗi chuẩn trên các thông số phù hợp. –

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