Các phương pháp chúng tôi sẽ sử dụng để điều chỉnh thủ công (nghĩa là Phân tích dữ liệu khám phá) có thể hoạt động rất tốt với dữ liệu đó.
Tôi muốn xác định lại thông số của mô hình một chút để làm cho các tham số của nó trở nên tích cực:
y=ax−b/x−−√.
Đối với một cho trước , giả sử có một x thực duy nhất thỏa mãn phương trình này; gọi đây là f ( y ; a , b ) hoặc, để cho ngắn gọn, f ( y ) khi ( a , b ) được hiểu.yxf(y;a,b)f(y)(a,b)
Chúng tôi quan sát một tập hợp các cặp theo thứ tự trong đó x i lệch khỏi f ( y i ; a , b ) bởi các biến thiên ngẫu nhiên độc lập với phương tiện bằng không. Trong cuộc thảo luận này, tôi sẽ giả sử tất cả chúng đều có một phương sai chung, nhưng việc mở rộng các kết quả này (sử dụng bình phương tối thiểu có trọng số) là có thể, rõ ràng và dễ thực hiện. Dưới đây là một ví dụ mô phỏng của một bộ sưu tập như vậy 100 giá trị, với một = 0,0001 , b = 0,1 , và một sai chung của σ(xi,yi)xif(yi;a,b)100a=0.0001b=0.1 .σ2=4
Đây là một (cố tình) ví dụ khó khăn, như có thể được đánh giá cao bởi các phi vật thể (âm) giá trị và lây lan phi thường của họ (mà thường là ± 2 ngang đơn vị, nhưng có thể dao động lên đến 5 hoặc 6 trên x trục). Nếu chúng ta có thể có được sự phù hợp hợp lý với những dữ liệu này đến bất kỳ nơi nào gần với việc ước tính a , b và σ 2 được sử dụng, chúng ta sẽ thực sự làm tốt.x±2 56xabσ2
Một thăm dò phù hợp là lặp đi lặp lại. Mỗi giai đoạn bao gồm hai bước sau: ước tính (dựa trên các dữ liệu và trước đó ước tính một và b của một và b , từ đó giá trị dự đoán trước đó x i có thể thu được cho x i ) và sau đó ước tính b . Bởi vì các lỗi nằm trong x , sự phù hợp ước tính x i từ ( y i ) , thay vì ngược lại. Để thứ tự đầu tiên trong các lỗi trong x , khi xaa^b^abx^ixibxi(yi)xx là đủ lớn,
xi≈1a(yi+b^x^i−−√).
Do đó, chúng tôi có thể cập nhật một bằng cách lắp mô hình này với bình phương nhỏ nhất (thông báo nó chỉ có một tham số - một dốc, một --và không đánh chặn) và lấy nghịch đảo của hệ số như dự toán được cập nhật của một .a^aa
Tiếp theo, khi đủ nhỏ, thuật ngữ bậc hai nghịch đảo chiếm ưu thế và chúng ta tìm thấy (một lần nữa theo thứ tự đầu tiên trong các lỗi) màx
xi≈b21−2a^b^x^3/2y2i.
Một lần nữa sử dụng phương nhỏ nhất (chỉ với một hạn độ dốc ), chúng tôi có được một ước tính cập nhật b qua căn bậc hai của độ dốc được trang bị.bb^
Để xem lý do tại sao điều này hoạt động, một xấp xỉ thăm dò thô cho phù hợp này có thể thu được bằng cách vẽ so với 1 / y 2 i cho x i nhỏ hơn . Tốt hơn nữa, vì x i được đo bằng lỗi và y i thay đổi đơn điệu với x i , chúng ta nên tập trung vào dữ liệu với các giá trị lớn hơn 1 / y 2 i . Dưới đây là một ví dụ từ bộ dữ liệu mô phỏng của chúng tôi cho thấy một nửa lớn nhất của y ixi1/y2ixixiyixi1/y2iyi màu đỏ, một nửa nhỏ nhất màu xanh lam và một đường thẳng qua điểm gốc phù hợp với các điểm màu đỏ.
Các điểm xấp xỉ thẳng hàng, mặc dù có một chút độ cong tại các giá trị nhỏ của và y . (Chú ý lựa chọn trục: vì x là đo lường, đó là truyền thống để vẽ nó trên dọc trục.) Bằng cách tập trung phù hợp trên những điểm màu đỏ, nơi cong nên được tối thiểu, chúng ta phải có được một ước tính hợp lý của b . Giá trị 0,096 hiển thị trong tiêu đề là căn bậc hai của độ dốc của dòng này: nó chỉ nhỏ hơn 4 % so với giá trị thực!xyxb0.0964
Tại thời điểm này, các giá trị dự đoán có thể được cập nhật thông qua
x^i=f(yi;a^,b^).
Lặp đi lặp lại cho đến khi các ước tính ổn định (không được bảo đảm) hoặc chúng xoay vòng qua các phạm vi giá trị nhỏ (vẫn không thể được đảm bảo).
Hóa ra rất khó ước tính trừ khi chúng ta có một tập hợp tốt các giá trị rất lớn của x , nhưng b - trong đó xác định tiệm cận đứng trong cốt truyện gốc (trong câu hỏi) và là trọng tâm của câu hỏi-- có thể được ghim xuống khá chính xác, miễn là có một số dữ liệu trong tiệm cận đứng. Trong ví dụ của chúng tôi chạy, lặp đi lặp lại làm hội tụ về một = 0.000196 (đó là gần gấp đôi giá trị chính xác của 0,0001 ) và b = 0,1073 (đó là gần đúng giá trị của 0,1axba^=0.0001960.0001b^=0.10730.1). Biểu đồ này hiển thị dữ liệu một lần nữa, trên đó được xếp chồng (a) đường cong thực sự có màu xám (nét đứt) và (b) đường cong ước tính có màu đỏ (rắn):
Sự phù hợp này tốt đến mức khó có thể phân biệt đường cong thực sự với đường cong được trang bị: chúng trùng nhau gần như ở mọi nơi. Ngẫu nhiên, phương sai sai số ước tính là rất gần với giá trị thực của 4 .3.734
Có một số vấn đề với phương pháp này:
Các ước tính là sai lệch. Sự thiên vị trở nên rõ ràng khi tập dữ liệu nhỏ và tương đối ít giá trị gần với trục x. Sự phù hợp là có hệ thống một chút thấp.
Quy trình ước tính đòi hỏi một phương thức để nói giá trị "lớn" từ giá trị "nhỏ" của . Tôi có thể đề xuất các cách thăm dò để xác định các định nghĩa tối ưu, nhưng như một vấn đề thực tế, bạn có thể để chúng là các hằng số "điều chỉnh" và thay đổi chúng để kiểm tra độ nhạy của kết quả. Tôi đã đặt chúng tùy ý bằng cách chia dữ liệu thành ba nhóm bằng nhau theo giá trị của y i và sử dụng hai nhóm bên ngoài.yiyi
Quy trình sẽ không hoạt động đối với tất cả các kết hợp có thể có của và b hoặc tất cả các phạm vi dữ liệu có thể. Tuy nhiên, nó phải hoạt động tốt bất cứ khi nào đủ đường cong được biểu thị trong tập dữ liệu để phản ánh cả hai tiệm cận: cái dọc ở một đầu và cái nghiêng ở đầu kia.ab
Mã
Sau đây được viết bằng Mathicala .
estimate[{a_, b_, xHat_}, {x_, y_}] :=
Module[{n = Length[x], k0, k1, yLarge, xLarge, xHatLarge, ySmall,
xSmall, xHatSmall, a1, b1, xHat1, u, fr},
fr[y_, {a_, b_}] := Root[-b^2 + y^2 #1 - 2 a y #1^2 + a^2 #1^3 &, 1];
k0 = Floor[1 n/3]; k1 = Ceiling[2 n/3];(* The tuning constants *)
yLarge = y[[k1 + 1 ;;]]; xLarge = x[[k1 + 1 ;;]]; xHatLarge = xHat[[k1 + 1 ;;]];
ySmall = y[[;; k0]]; xSmall = x[[;; k0]]; xHatSmall = xHat[[;; k0]];
a1 = 1/
Last[LinearModelFit[{yLarge + b/Sqrt[xHatLarge],
xLarge}\[Transpose], u, u]["BestFitParameters"]];
b1 = Sqrt[
Last[LinearModelFit[{(1 - 2 a1 b xHatSmall^(3/2)) / ySmall^2,
xSmall}\[Transpose], u, u]["BestFitParameters"]]];
xHat1 = fr[#, {a1, b1}] & /@ y;
{a1, b1, xHat1}
];
Áp dụng điều này cho dữ liệu (được đưa ra bởi các vectơ song song x
và y
được tạo thành ma trận hai cột data = {x,y}
) cho đến khi hội tụ, bắt đầu với các ước tính :a=b=0
{a, b, xHat} = NestWhile[estimate[##, data] &, {0, 0, data[[1]]},
Norm[Most[#1] - Most[#2]] >= 0.001 &, 2, 100]