Giải quyết vấn đề bình phương nhỏ nhất phi tuyến với giới hạn trên các biến. Show Với phần dư f (x) (hàm thực m-d của các biến thực n) và hàm mất Rho (s) (hàm vô hướng), >>> def fun_rosenbrock(x): ... return np.array([10 * (x[1] - x[0]**2), (1 - x[0])])5 tìm thấy tối thiểu cục bộ của hàm chi phí f (x): minimize F(x) = 0.5 * sum(rho(f_i(x)**2), i = 0, ..., m - 1) subject to lb <= x <= ub Mục đích của chức năng mất Rho (s) là để giảm ảnh hưởng của các ngoại lệ đến giải pháp. Tham sốFuncallablefuncallableChức năng tính toán vectơ của phần dư, với chữ ký >>> def fun_rosenbrock(x): ... return np.array([10 * (x[1] - x[0]**2), (1 - x[0])])6, tức là, việc giảm thiểu tiến hành đối với đối số đầu tiên của nó. Đối số >>> def fun_rosenbrock(x): ... return np.array([10 * (x[1] - x[0]**2), (1 - x[0])])7 được truyền cho hàm này là một ndarray của hình dạng (n,) (không bao giờ là vô hướng, ngay cả đối với n = 1). Nó phải phân bổ và trả lại một mảng 1-d của hình dạng (m,) hoặc vô hướng. Nếu đối số >>> def fun_rosenbrock(x): ... return np.array([10 * (x[1] - x[0]**2), (1 - x[0])])7 là phức tạp hoặc hàm >>> def fun_rosenbrock(x): ... return np.array([10 * (x[1] - x[0]**2), (1 - x[0])])9 trả về phần dư phức tạp, nó phải được bọc trong một hàm thực của các đối số thực, như được hiển thị ở cuối phần ví dụ.x0array_like với hình dạng (n,) hoặc floatarray_like with shape (n,) or float Dự đoán ban đầu trên các biến độc lập. Nếu nổi, nó sẽ được coi là mảng 1-D với một phần tử. jac {‘2 điểm,‘ 3 điểm, ‘cs, có thể gọi}, tùy chọn{‘2-point’, ‘3-point’, ‘cs’, callable}, optionalPhương pháp tính toán ma trận Jacobian (ma trận M-by-N, trong đó phần tử (i, j) là đạo hàm một phần của f [i] đối với x [j]). Các từ khóa chọn sơ đồ khác biệt hữu hạn để ước tính số. Sơ đồ ‘3 điểm, chính xác hơn, nhưng yêu cầu gấp đôi số hoạt động so với‘ 2 điểm (mặc định). Sơ đồ ‘CS, sử dụng các bước phức tạp, và trong khi có khả năng chính xác nhất, nhưng nó chỉ áp dụng khi FUN xử lý chính xác các đầu vào phức tạp và có thể được tiếp tục phân tích đến mặt phẳng phức tạp. Phương pháp ‘LM, luôn luôn sử dụng sơ đồ‘ 2 điểm. Nếu có thể gọi được, nó được sử dụng là >>> from scipy.optimize import least_squares >>> x0_rosenbrock = np.array([2, 2]) >>> res_1 = least_squares(fun_rosenbrock, x0_rosenbrock) >>> res_1.x array([ 1., 1.]) >>> res_1.cost 9.8669242910846867e-30 >>> res_1.optimality 8.8928864934219529e-140 và sẽ trả về một xấp xỉ tốt (hoặc giá trị chính xác) cho Jacobian như một mảng_like (np.atleast_2d được áp dụng), một ma trận thưa thớt (CSR_Matrix ưa thích cho hiệu suất) hoặc >>> from scipy.optimize import least_squares >>> x0_rosenbrock = np.array([2, 2]) >>> res_1 = least_squares(fun_rosenbrock, x0_rosenbrock) >>> res_1.x array([ 1., 1.]) >>> res_1.cost 9.8669242910846867e-30 >>> res_1.optimality 8.8928864934219529e-141.Bound2-Tuple của Array_Like, Tùy chọn2-tuple of array_like, optional Giới hạn dưới và trên trên các biến độc lập. Mặc định không có giới hạn. Mỗi mảng phải khớp với kích thước của x0 hoặc là vô hướng, trong trường hợp sau, một ràng buộc sẽ giống nhau cho tất cả các biến. Sử dụng >>> from scipy.optimize import least_squares >>> x0_rosenbrock = np.array([2, 2]) >>> res_1 = least_squares(fun_rosenbrock, x0_rosenbrock) >>> res_1.x array([ 1., 1.]) >>> res_1.cost 9.8669242910846867e-30 >>> res_1.optimality 8.8928864934219529e-142 với một dấu hiệu thích hợp để vô hiệu hóa giới hạn trên tất cả hoặc một số biến.Phương pháp {‘TRF,‘ Dogbox, ‘LM,}, Tùy chọn{‘trf’, ‘dogbox’, ‘lm’}, optional Thuật toán để thực hiện giảm thiểu.
Mặc định là ‘TRF. Xem ghi chú để biết thêm thông tin. ftolfloat hoặc không, tùy chọnfloat or None, optionalDung sai để chấm dứt bằng cách thay đổi hàm chi phí. Mặc định là 1e-8. Quá trình tối ưu hóa được dừng lại khi >>> from scipy.optimize import least_squares >>> x0_rosenbrock = np.array([2, 2]) >>> res_1 = least_squares(fun_rosenbrock, x0_rosenbrock) >>> res_1.x array([ 1., 1.]) >>> res_1.cost 9.8669242910846867e-30 >>> res_1.optimality 8.8928864934219529e-143 và có một thỏa thuận đầy đủ giữa mô hình bậc hai cục bộ và mô hình thực trong bước cuối cùng. Nếu không có và ‘phương thức, không phải là‘ LM, thì việc chấm dứt theo điều kiện này sẽ bị vô hiệu hóa. Nếu ‘phương pháp là‘ LM, thì dung sai này phải cao hơn epsilon máy. xtolfloat hoặc không, tùy chọnfloat or None, optionalDung sai để chấm dứt bằng cách thay đổi các biến độc lập. Mặc định là 1e-8. Điều kiện chính xác phụ thuộc vào phương pháp được sử dụng:
Nếu không có và ‘phương thức, không phải là‘ LM, thì việc chấm dứt theo điều kiện này sẽ bị vô hiệu hóa. Nếu ‘phương pháp là‘ LM, thì dung sai này phải cao hơn epsilon máy. xtolfloat hoặc không, tùy chọnfloat or None, optionalDung sai để chấm dứt bằng cách thay đổi các biến độc lập. Mặc định là 1e-8. Điều kiện chính xác phụ thuộc vào phương pháp được sử dụng:
Nếu không có và ‘phương thức, không phải là‘ LM, thì việc chấm dứt theo điều kiện này sẽ bị vô hiệu hóa. Nếu ‘phương pháp là‘ LM, thì dung sai này phải cao hơn epsilon máy. x_scalearray_like hoặc ‘jac, tùy chọnarray_like or ‘jac’, optionalQuy mô đặc trưng của từng biến. Cài đặt X_Scale tương đương với việc cải tổ vấn đề trong các biến được chia tỷ lệ >>> def jac_rosenbrock(x): ... return np.array([ ... [-20 * x[0], 10], ... [-1, 0]])3. Một quan điểm khác là kích thước của một khu vực ủy thác dọc theo kích thước thứ J tỷ lệ thuận với >>> def jac_rosenbrock(x): ... return np.array([ ... [-20 * x[0], 10], ... [-1, 0]])4. Sự hội tụ được cải thiện có thể đạt được bằng cách cài đặt X_SCALE sao cho một bước có kích thước nhất định dọc theo bất kỳ biến được chia tỷ lệ nào có hiệu ứng tương tự đối với hàm chi phí. Nếu được đặt thành ‘Jac, thì thang đo được cập nhật lặp đi lặp lại bằng cách sử dụng các chỉ tiêu nghịch của các cột của ma trận Jacobian (như được mô tả trong [JJMore]).mấtstr or callable, optional Xác định chức năng mất. Các giá trị từ khóa sau được cho phép:
Nếu có thể gọi được, phải mất 1-D nDarray >>> res_2 = least_squares(fun_rosenbrock, x0_rosenbrock, jac_rosenbrock, ... bounds=([-np.inf, 1.5], np.inf)) >>> res_2.x array([ 1.22437075, 1.5 ]) >>> res_2.cost 0.025213093946805685 >>> res_2.optimality 1.5885401433157753e-070 và trả về một mảng_ như hình (3, m) trong đó hàng 0 chứa các giá trị chức năng, hàng 1 chứa các dẫn xuất đầu tiên và hàng 2 chứa các dẫn xuất thứ hai. Phương pháp ‘LM, chỉ hỗ trợ tổn thất tuyến tính.f_scalefloat, tùy chọnfloat, optional Giá trị của lề mềm giữa phần dư inlier và Outier, mặc định là 1.0. Hàm mất được đánh giá như sau >>> res_2 = least_squares(fun_rosenbrock, x0_rosenbrock, jac_rosenbrock, ... bounds=([-np.inf, 1.5], np.inf)) >>> res_2.x array([ 1.22437075, 1.5 ]) >>> res_2.cost 0.025213093946805685 >>> res_2.optimality 1.5885401433157753e-071, trong đó >>> res_2 = least_squares(fun_rosenbrock, x0_rosenbrock, jac_rosenbrock, ... bounds=([-np.inf, 1.5], np.inf)) >>> res_2.x array([ 1.22437075, 1.5 ]) >>> res_2.cost 0.025213093946805685 >>> res_2.optimality 1.5885401433157753e-072 là f_scale và >>> res_2 = least_squares(fun_rosenbrock, x0_rosenbrock, jac_rosenbrock, ... bounds=([-np.inf, 1.5], np.inf)) >>> res_2.x array([ 1.22437075, 1.5 ]) >>> res_2.cost 0.025213093946805685 >>> res_2.optimality 1.5885401433157753e-073 được xác định bằng tham số tổn thất. Tham số này không có tác dụng với >>> res_2 = least_squares(fun_rosenbrock, x0_rosenbrock, jac_rosenbrock, ... bounds=([-np.inf, 1.5], np.inf)) >>> res_2.x array([ 1.22437075, 1.5 ]) >>> res_2.cost 0.025213093946805685 >>> res_2.optimality 1.5885401433157753e-074, nhưng đối với các giá trị tổn thất khác, nó có tầm quan trọng quan trọng.max_nfevnone hoặc int, tùy chọnNone or int, optional Số lượng đánh giá chức năng tối đa trước khi chấm dứt. Nếu không có (mặc định), giá trị được chọn tự động: Diff_Stepnone hoặc Array_like, Tùy chọnNone or array_like, optional Xác định kích thước bước tương đối cho xấp xỉ chênh lệch hữu hạn của Jacobian. Bước thực tế được tính toán là >>> res_2 = least_squares(fun_rosenbrock, x0_rosenbrock, jac_rosenbrock, ... bounds=([-np.inf, 1.5], np.inf)) >>> res_2.x array([ 1.22437075, 1.5 ]) >>> res_2.cost 0.025213093946805685 >>> res_2.optimality 1.5885401433157753e-075. Nếu không có (mặc định), thì Diff_Step được coi là một công suất tối ưu thông thường của máy tính của máy tính cho sơ đồ khác biệt hữu hạn được sử dụng [NR].tr_solver {none, ’chính xác,‘ lsmr,}, tùy chọn{None, ‘exact’, ‘lsmr’}, optional Phương pháp giải quyết các vấn đề phụ thuộc vùng tin cậy, chỉ có liên quan đến các phương pháp ‘TRF và‘ Dogbox.
Nếu không có (mặc định), bộ giải được chọn dựa trên loại Jacobian được trả về trong lần lặp đầu tiên. tr_optionsdict, tùy chọndict, optionalTùy chọn từ khóa được chuyển cho người giải phân vùng tin cậy. jac_sparsity {none, array_like, ma trận thưa thớt}, tùy chọn{None, array_like, sparse matrix}, optional Xác định cấu trúc thưa thớt của ma trận Jacobian để ước tính chênh lệch hữu hạn, hình dạng của nó phải là (m, n). Nếu Jacobian chỉ có một vài phần tử khác không trong mỗi hàng, việc cung cấp cấu trúc thưa thớt sẽ tăng tốc đáng kể các tính toán [Curtis]. Một mục không có nghĩa là một phần tử tương ứng trong Jacobian bằng không. Nếu được cung cấp, buộc phải sử dụng ‘LSMR, Trust-Bolvers. Nếu không có (mặc định), thì sự khác biệt dày đặc sẽ được sử dụng. Không có tác dụng cho phương pháp ‘LM. Verbose {0, 1, 2}, tùy chọn{0, 1, 2}, optionalMức độ của thuật toán từ verbosity: args, kwargstuple và dict, tùy chọntuple and dict, optional Các cuộc tranh luận bổ sung được truyền lại cho niềm vui và JAC. Cả hai trống theo mặc định. Chữ ký gọi là >>> def fun_rosenbrock(x): ... return np.array([10 * (x[1] - x[0]**2), (1 - x[0])])6 và tương tự đối với JAC.ReturnSresultoptimizeresultresultOptimizeResult >>> def fun_broyden(x): ... f = (3 - x) * x + 1 ... f[1:] -= x[:-1] ... f[:-1] -= 2 * x[1:] ... return f2 với các trường sau được xác định:
Xem thêm >>> def fun_broyden(x): ... f = (3 - x) * x + 1 ... f[1:] -= x[:-1] ... f[:-1] -= 2 * x[1:] ... return f3 Một trình bao bọc kế thừa cho việc triển khai Minpack của thuật toán Levenberg-Marquadt. >>> def fun_broyden(x): ... f = (3 - x) * x + 1 ... f[1:] -= x[:-1] ... f[:-1] -= 2 * x[1:] ... return f4 Tối thiểu hóa bình phương nhỏ nhất áp dụng cho một vấn đề phù hợp với đường cong. Ghi chú Phương thức ‘LM, (Levenberg-Marquest) gọi một trình bao bọc qua các thuật toán bình phương nhỏ nhất được triển khai trong Minpack (LMDER, LMDIF). Nó chạy thuật toán Levenberg-Marquest được xây dựng như một thuật toán loại ủy thác. Việc thực hiện dựa trên giấy [JJMore], nó rất mạnh mẽ và hiệu quả với rất nhiều thủ thuật thông minh. Nó nên là lựa chọn đầu tiên của bạn cho các vấn đề không bị ràng buộc. Lưu ý rằng nó không hỗ trợ giới hạn. Ngoài ra, nó không hoạt động khi m Phương pháp ‘TRF, (phản xạ vùng tin cậy) được thúc đẩy bởi quá trình giải một hệ phương trình, tạo thành điều kiện tối ưu thứ nhất cho vấn đề giảm thiểu bị hạn chế bị ràng buộc như được xây dựng trong [Stir]. Thuật toán giải quyết các vấn đề tiểu vùng tin cậy được tăng cường bởi một thuật ngữ bậc hai đường chéo đặc biệt và với hình dạng khu vực tin cậy được xác định bởi khoảng cách từ giới hạn và hướng của độ dốc. Các cải tiến này giúp tránh thực hiện các bước trực tiếp vào giới hạn và khám phá hiệu quả toàn bộ không gian của các biến. Để cải thiện hơn nữa sự hội tụ, thuật toán xem xét các hướng tìm kiếm được phản ánh từ các giới hạn. Để tuân thủ các yêu cầu lý thuyết, thuật toán giữ cho lặp đi lặp lại hoàn toàn khả thi. Với các tiểu cầu của Jacobians Trust-Puion được giải quyết bằng một phương pháp chính xác rất giống với phương pháp được mô tả trong [JJMore] (và được thực hiện trong Minpack). Sự khác biệt so với việc triển khai MinPack là sự phân hủy giá trị số ít của ma trận Jacobian được thực hiện một lần mỗi lần lặp, thay vì phân tách QR và loạt loại bỏ xoay vòng. Đối với người Jacobian lớn thưa thớt, cách tiếp cận không gian con 2-D để giải quyết các tiểu cầu đáng tin cậy được sử dụng [Stir], [Byrd]. Không gian con được kéo dài bởi một gradient tỷ lệ và một giải pháp Gauss-Newton gần đúng được cung cấp bởi Phương pháp ‘Dogbox, hoạt động trong khuôn khổ vùng tin cậy, nhưng xem xét các vùng tin cậy hình chữ nhật trái ngược với các elipsoids thông thường [voglis]. Giao điểm của một vùng ủy thác hiện tại và giới hạn ban đầu một lần nữa là hình chữ nhật, do đó, trên mỗi lần lặp, một vấn đề giảm thiểu bậc hai phải chịu các ràng buộc bị ràng buộc được giải quyết bằng phương pháp Dogleg của Powell [Numopt]. Bước Gauss-Newton cần thiết có thể được tính toán chính xác cho người Jacobs dày đặc hoặc xấp xỉ bằng >>> res_2 = least_squares(fun_rosenbrock, x0_rosenbrock, jac_rosenbrock, ... bounds=([-np.inf, 1.5], np.inf)) >>> res_2.x array([ 1.22437075, 1.5 ]) >>> res_2.cost 0.025213093946805685 >>> res_2.optimality 1.5885401433157753e-076 cho người Jacobian thưa thớt lớn. Thuật toán có khả năng thể hiện sự hội tụ chậm khi thứ hạng của Jacobian nhỏ hơn số lượng biến. Thuật toán thường vượt trội so với ‘TRF, trong các vấn đề giới hạn với một số lượng nhỏ các biến. Các hàm mất mạnh được thực hiện như được mô tả trong [BA]. Ý tưởng là sửa đổi một vectơ còn lại và ma trận Jacobian trên mỗi lần lặp sao cho độ dốc tính toán và xấp xỉ Gauss-Newton Hessian phù hợp với độ dốc thực sự và xấp xỉ Hessian của hàm chi phí. Sau đó, thuật toán tiến hành theo cách bình thường, tức là, các hàm mất mạnh được thực hiện như một trình bao bọc đơn giản so với các thuật toán bình phương nhỏ nhất tiêu chuẩn. Mới trong phiên bản 0.17.0. Người giới thiệu STIR(1,2,3)(1,2,3)M. A. Branch, T. F. Coleman và Y. Li, Một không gian con, nội thất và phương pháp gradient liên hợp cho các vấn đề giảm thiểu ràng buộc quy mô lớn, Tạp chí SIAM về máy tính khoa học, tập. 21, số 1, trang 1-23, 1999. NrWilliam H. Báo chí et. Al., Công thức nấu ăn số. Nghệ thuật điện toán khoa học. Ấn bản thứ 3, giây. 5.7. Byrd(1,2)(1,2)R. H. Byrd, R. B. Schnabel và G. A. Shultz, Giải pháp gần đúng của vấn đề khu vực ủy thác bằng cách giảm thiểu trong các không gian con hai chiều, Math. Lập trình, 40, trang 247-263, 1988. CurtisA. Curtis, M. J. D. Powell, và J. Reid, Hồi về ước tính của ma trận Jacobian thưa thớt, Tạp chí của Viện Toán học và các ứng dụng của nó, 13, trang 117-120, 1974. JJMore(1,2,3)(1,2,3)J. J. Thêm, Hồi Các thuật toán Levenberg-Marquest: Thực hiện và lý thuyết, Phân tích số, ed. G. A. Watson, Bài giảng ghi chú trong Toán học 630, Springer Verlag, trang 105-116, 1977. VoglisC. Voglis và I. E. Lagaris, Hồi Một phương pháp tiếp cận chó ủy thác hình chữ nhật cho tối ưu hóa phi tuyến bị ràng buộc và ràng buộc, Hội nghị quốc tế WSEAS về toán học ứng dụng, Corfu, Hy Lạp, 2004. NumoptJ. Nocedal và S. J. Wright, Tối ưu hóa số, Phiên bản thứ 2, Chương 4. baB. Triggs et. Al., Điều chỉnh bó - Một tổng hợp hiện đại, Kỷ yếu của Hội thảo quốc tế về các thuật toán tầm nhìn: Lý thuyết và thực hành, trang 298-372, 1999. Ví dụ Trong ví dụ này, chúng tôi tìm thấy tối thiểu chức năng Rosenbrock mà không giới hạn trên các biến độc lập. >>> def fun_rosenbrock(x): ... return np.array([10 * (x[1] - x[0]**2), (1 - x[0])]) Lưu ý rằng chúng tôi chỉ cung cấp vectơ của phần dư. Thuật toán xây dựng hàm chi phí như một tổng hình vuông của phần dư, mang lại chức năng Rosenbrock. Tối thiểu chính xác là tại >>> def fun_broyden(x): ... f = (3 - x) * x + 1 ... f[1:] -= x[:-1] ... f[:-1] -= 2 * x[1:] ... return f7. >>> from scipy.optimize import least_squares >>> x0_rosenbrock = np.array([2, 2]) >>> res_1 = least_squares(fun_rosenbrock, x0_rosenbrock) >>> res_1.x array([ 1., 1.]) >>> res_1.cost 9.8669242910846867e-30 >>> res_1.optimality 8.8928864934219529e-14 Bây giờ chúng tôi hạn chế các biến, theo cách mà giải pháp trước đó trở nên không khả thi. Cụ thể, chúng tôi yêu cầu >>> def fun_broyden(x): ... f = (3 - x) * x + 1 ... f[1:] -= x[:-1] ... f[:-1] -= 2 * x[1:] ... return f8 và >>> def fun_broyden(x): ... f = (3 - x) * x + 1 ... f[1:] -= x[:-1] ... f[:-1] -= 2 * x[1:] ... return f9 không bị ràng buộc. Để kết thúc này, chúng tôi chỉ định tham số giới hạn thành >>> def fun_rosenbrock(x): ... return np.array([10 * (x[1] - x[0]**2), (1 - x[0])])5 ở dạng >>> from scipy.sparse import lil_matrix >>> def sparsity_broyden(n): ... sparsity = lil_matrix((n, n), dtype=int) ... i = np.arange(n) ... sparsity[i, i] = 1 ... i = np.arange(1, n) ... sparsity[i, i - 1] = 1 ... i = np.arange(n - 1) ... sparsity[i, i + 1] = 1 ... return sparsity ... >>> n = 100000 >>> x0_broyden = -np.ones(n) ... >>> res_3 = least_squares(fun_broyden, x0_broyden, ... jac_sparsity=sparsity_broyden(n)) >>> res_3.cost 4.5687069299604613e-23 >>> res_3.optimality 1.1650454296851518e-111. Chúng tôi cũng cung cấp Jacobian phân tích: >>> def jac_rosenbrock(x): ... return np.array([ ... [-20 * x[0], 10], ... [-1, 0]]) Đặt tất cả những điều này lại với nhau, chúng ta thấy rằng giải pháp mới nằm ở ràng buộc: >>> res_2 = least_squares(fun_rosenbrock, x0_rosenbrock, jac_rosenbrock, ... bounds=([-np.inf, 1.5], np.inf)) >>> res_2.x array([ 1.22437075, 1.5 ]) >>> res_2.cost 0.025213093946805685 >>> res_2.optimality 1.5885401433157753e-07 Bây giờ chúng tôi giải quyết một hệ phương trình (nghĩa là, hàm chi phí phải bằng 0 ở mức tối thiểu) cho hàm giá trị vectơ chéo của Broyden của 100000 biến: >>> def fun_broyden(x): ... f = (3 - x) * x + 1 ... f[1:] -= x[:-1] ... f[:-1] -= 2 * x[1:] ... return f Ma trận Jacobian tương ứng là thưa thớt. Chúng tôi nói với thuật toán ước tính nó bằng sự khác biệt hữu hạn và cung cấp cấu trúc thưa thớt của Jacobian để tăng tốc đáng kể quá trình này. >>> from scipy.sparse import lil_matrix >>> def sparsity_broyden(n): ... sparsity = lil_matrix((n, n), dtype=int) ... i = np.arange(n) ... sparsity[i, i] = 1 ... i = np.arange(1, n) ... sparsity[i, i - 1] = 1 ... i = np.arange(n - 1) ... sparsity[i, i + 1] = 1 ... return sparsity ... >>> n = 100000 >>> x0_broyden = -np.ones(n) ... >>> res_3 = least_squares(fun_broyden, x0_broyden, ... jac_sparsity=sparsity_broyden(n)) >>> res_3.cost 4.5687069299604613e-23 >>> res_3.optimality 1.1650454296851518e-11 Hãy cùng giải quyết vấn đề phù hợp với đường cong bằng cách sử dụng chức năng mất mạnh để chăm sóc các ngoại lệ trong dữ liệu. Xác định hàm mô hình là >>> from scipy.sparse import lil_matrix >>> def sparsity_broyden(n): ... sparsity = lil_matrix((n, n), dtype=int) ... i = np.arange(n) ... sparsity[i, i] = 1 ... i = np.arange(1, n) ... sparsity[i, i - 1] = 1 ... i = np.arange(n - 1) ... sparsity[i, i + 1] = 1 ... return sparsity ... >>> n = 100000 >>> x0_broyden = -np.ones(n) ... >>> res_3 = least_squares(fun_broyden, x0_broyden, ... jac_sparsity=sparsity_broyden(n)) >>> res_3.cost 4.5687069299604613e-23 >>> res_3.optimality 1.1650454296851518e-112, trong đó t là biến dự đoán, y là một quan sát và a, b, c là các tham số cần ước tính. Đầu tiên, xác định chức năng tạo dữ liệu với nhiễu và ngoại lệ, xác định các tham số mô hình và tạo dữ liệu: >>> from numpy.random import default_rng >>> rng = default_rng() >>> def gen_data(t, a, b, c, noise=0., n_outliers=0, seed=None): ... rng = default_rng(seed) ... ... y = a + b * np.exp(t * c) ... ... error = noise * rng.standard_normal(t.size) ... outliers = rng.integers(0, t.size, n_outliers) ... error[outliers] *= 10 ... ... return y + error ... >>> a = 0.5 >>> b = 2.0 >>> c = -1 >>> t_min = 0 >>> t_max = 10 >>> n_points = 15 ... >>> t_train = np.linspace(t_min, t_max, n_points) >>> y_train = gen_data(t_train, a, b, c, noise=0.1, n_outliers=3) Xác định chức năng để tính toán dư và ước tính ban đầu của các tham số. >>> def fun(x, t, y): ... return x[0] + x[1] * np.exp(x[2] * t) - y ... >>> x0 = np.array([1.0, 1.0, 0.0]) Tính toán giải pháp bình phương nhỏ nhất tiêu chuẩn: >>> res_lsq = least_squares(fun, x0, args=(t_train, y_train)) Bây giờ tính toán hai giải pháp với hai hàm mất mạnh khác nhau. Tham số F_Scale được đặt thành 0,1, có nghĩa là phần dư inliter không được vượt quá đáng kể 0,1 (mức độ nhiễu được sử dụng). >>> def fun_rosenbrock(x): ... return np.array([10 * (x[1] - x[0]**2), (1 - x[0])])0 Và cuối cùng, vẽ tất cả các đường cong. Chúng tôi thấy rằng bằng cách chọn một tổn thất thích hợp, chúng tôi có thể nhận được các ước tính gần với tối ưu ngay cả khi có sự hiện diện của các ngoại lệ mạnh mẽ. Nhưng hãy nhớ rằng nói chung, người ta nên thử ‘Soft_L1, hoặc‘ Huber, trước hết (nếu cần thiết) vì hai tùy chọn khác có thể gây khó khăn trong quá trình tối ưu hóa. >>> def fun_rosenbrock(x): ... return np.array([10 * (x[1] - x[0]**2), (1 - x[0])])1 Trong ví dụ tiếp theo, chúng tôi cho thấy các hàm còn lại có giá trị phức tạp của các biến phức tạp có thể được tối ưu hóa như thế nào với >>> from scipy.sparse import lil_matrix >>> def sparsity_broyden(n): ... sparsity = lil_matrix((n, n), dtype=int) ... i = np.arange(n) ... sparsity[i, i] = 1 ... i = np.arange(1, n) ... sparsity[i, i - 1] = 1 ... i = np.arange(n - 1) ... sparsity[i, i + 1] = 1 ... return sparsity ... >>> n = 100000 >>> x0_broyden = -np.ones(n) ... >>> res_3 = least_squares(fun_broyden, x0_broyden, ... jac_sparsity=sparsity_broyden(n)) >>> res_3.cost 4.5687069299604613e-23 >>> res_3.optimality 1.1650454296851518e-113. Xem xét chức năng sau: >>> def fun_rosenbrock(x): ... return np.array([10 * (x[1] - x[0]**2), (1 - x[0])])2 Chúng tôi bọc nó thành một hàm của các biến thực trả về phần dư thực bằng cách xử lý các phần thực và tưởng tượng như các biến độc lập: >>> def fun_rosenbrock(x): ... return np.array([10 * (x[1] - x[0]**2), (1 - x[0])])3 Do đó, thay vì hàm phức hợp m-d ban đầu của các biến phức N, chúng tôi tối ưu hóa hàm thực 2m-D của các biến thực 2N: >>> def fun_rosenbrock(x): ... return np.array([10 * (x[1] - x[0]**2), (1 - x[0])])4 Không phải là gìBình phương tối thiểu phi tuyến tính là hình thức phân tích bình phương tối thiểu được sử dụng để phù hợp với một tập hợp các quan sát M với mô hình phi tuyến tính trong các tham số chưa biết (M ≥ N). Nó được sử dụng trong một số hình thức hồi quy phi tuyến.the form of least squares analysis used to fit a set of m observations with a model that is non-linear in n unknown parameters (m ≥ n). It is used in some forms of nonlinear regression.
Làm thế nào để bạn chạy mộtĐối với vấn đề hồi quy phi tuyến tính, bạn có thể thử svr (), kneighborsregratoror () hoặc ra quyết định () từ sklearn và so sánh hiệu suất mô hình trên tập kiểm tra.Lưu câu trả lời này.SVR(), KNeighborsRegressor() or DecisionTreeRegression() from sklearn, and compare the model performance on the test set. Save this answer.
Vấn đề bình phương tối thiểu phi tuyến là gì?Bình phương tối thiểu phi tuyến (NLS) là một kỹ thuật tối ưu hóa có thể được sử dụng để xây dựng các mô hình hồi quy cho các bộ dữ liệu có chứa các tính năng phi tuyến.Các mô hình cho các bộ dữ liệu như vậy là phi tuyến trong các hệ số của chúng.an optimization technique that can be used to build regression models for data sets that contain nonlinear features. Models for such data sets are nonlinear in their coefficients.
Làm thế nào để bạn mã hóa bình phương ít nhất trong Python?Sử dụng phương pháp nghịch đảo trực tiếp.. Nhập Numpy dưới dạng NP từ Nhập SCIPY Tối ưu hóa nhập khẩu matplotlib.pyplot dưới dạng plt plt .. # Tạo X và Y X = NP.không gian linsp (0, 1, 101) y = 1 + x + x * np..... # Lắp ráp ma trận A A = NP.Vstack ([x, np. .... # Trực tiếp hồi quy bình phương nhỏ nhất alpha = np.DOT ((np. ... # Vẽ kết quả plt .. |