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:
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? –