6.17. Bộ giải và số ngẫu nhiên¶
Khi hàm cần nghiên cứu được định nghĩa bởi mã Python thay vì một bộ đệm mẫu, một nhóm công cụ khác là lựa chọn phù hợp: nghiệm của hàm nằm ở đâu, cực tiểu của nó, tích phân của nó trên một khoảng cho trước? Các submodule scipy.integrate và scipy.optimize bao trùm công việc đó. Mỗi thuật toán gọi lại vào hàm Python do người dùng cung cấp, do đó chi phí mỗi lần lặp cao hơn so với phép rút gọn bộ đệm; sự tiện lợi là không phải tự viết bộ giải.
Submodule scipy.special bao trùm các hàm đặc biệt thống kê và xác suất (hàm lỗi, hàm gamma) xuất hiện khi tính hàm phân phối tích lũy (CDF, xác suất một mẫu có giá trị không vượt quá một giá trị nhất định) hoặc hàm mật độ xác suất (PDF, xác suất tương đối tại một giá trị nhất định) của một phân phối. numpy.random bao trùm bộ tạo số giả ngẫu nhiên để dithering, mô phỏng và dữ liệu kiểm thử tổng hợp.
6.17.1. Tích phân số của hàm có thể gọi được¶
Khi tích phân là một hàm Python thay vì một bộ đệm mẫu, scipy.integrate cung cấp bốn thuật toán cầu phương:
quad()-- Gauss-Kronrod thích nghi. Mặc định đúng đắn cho các tích phân trơn. Trả về(value, error).romberg()-- Romberg / Newton-Cotes cổ điển. Trả về một float đơn. Đã lỗi thời ở thượng nguồn; được giữ lại để tương thích.simpson()-- quy tắc Simpson thích nghi. Trả về một float đơn.tanhsinh()-- cầu phương mũ kép. Sử dụng khi tích phân có kỳ dị tại điểm đầu cuối hoặc giới hạn vô hạn. Trả về(value, error).
Tích phân Gaussian được tính bằng quy tắc mũ kép (tanhsinh):
from math import exp
from math import pi
from math import sqrt
from ulab import numpy as np
from ulab import scipy as sp
f = lambda x: exp(-x * x)
value, err = sp.integrate.tanhsinh(f, -np.inf, np.inf)
print("approx:", value, " exact:", sqrt(pi))
Đầu ra:
approx: 1.7724538... exact: 1.7724538...
6.17.2. Tìm nghiệm và cực tiểu¶
scipy.optimize bao gồm ba bộ giải biến đơn cổ điển. Mỗi lần lặp gọi lại vào hàm Python do người dùng cung cấp, do đó tốc độ tăng so với bộ giải Python thuần túy là vừa phải (xấp xỉ 2x); sự tiện lợi là không phải tự viết bộ giải.
bisect()-- tìm nghiệm củaftrên[a, b]bằng cách chia đôi khoảng.f(a)vàf(b)phải có dấu ngược nhau:def f(x): return x * x - 1 sp.optimize.bisect(f, 0, 4) # ~1.0
newton()-- tìm nghiệm bằng phương pháp cát tuyến / Newton-Raphson:def f(x): return x * x * x - 2.0 sp.optimize.newton(f, 3., tol=0.001, rtol=0.01) # ~1.260
fmin()-- tìm cực tiểu cục bộ sử dụng phương pháp downhill-simplex (Nelder-Mead):def f(x): return (x - 1) ** 2 - 1 sp.optimize.fmin(f, 3.0) # ~1.0
Phạm vi biến đơn đủ cho hầu hết các tối ưu hóa phía camera -- hằng số hiệu chỉnh cảm biến, độ khuếch đại tối đa hóa phép đo độ tương phản, ngưỡng nơi tính lưỡng modal của biểu đồ tần suất sắc nét nhất. Đối với các bài toán nhiều biến, câu trả lời đúng thường là tái định dạng bài toán thành một phép giải đại số tuyến tính nhỏ thay vì dùng đến bộ tối ưu phi tuyến tổng quát.
6.17.3. Các hàm đặc biệt¶
scipy.special cung cấp một số hàm thống kê và xác suất hoạt động như các hàm phổ dụng -- chúng nhận một scalar, một iterable, hoặc một ndarray và trả về một ndarray float:
x = np.linspace(0, 4, num=8)
sp.special.erf(x) # error function
sp.special.erfc(x) # complementary error function
sp.special.gamma(x + 1) # gamma function
sp.special.gammaln(x + 1) # log-gamma function
Hàm lỗi và phần bù của nó xuất hiện trong CDF của phân phối Gaussian -- ứng dụng được chọn để chuyển đổi giữa z-score đo được và xác suất hoặc để tính tích phân đuôi của phân phối chuẩn. Các hàm gamma và log-gamma xuất hiện trong các tính toán beta / chi bình phương / student-t; gammaln là dạng ổn định về số học cho các đối số lớn nơi gamma tự nó sẽ tràn.
6.17.4. Số ngẫu nhiên¶
numpy.random cung cấp một lớp Generator lấy mẫu từ các phân phối phổ biến. Bộ tạo có trạng thái: mỗi lệnh gọi tiến trạng thái nội bộ, vì vậy các lệnh gọi liên tiếp trả về các mẫu độc lập:
from ulab import numpy as np
rng = np.random.Generator(seed=42)
rng.random(size=5) # 5 uniform [0.0, 1.0) samples
rng.uniform(low=-1.0, high=1.0, size=10)
rng.normal(loc=0.0, scale=1.0, size=(2, 4))
Dtype đầu ra luôn là float. size= chấp nhận một số nguyên (đầu ra 1 chiều) hoặc một tuple (đầu ra n chiều); khi bỏ qua, trả về một float Python đơn.
Bộ tạo phù hợp cho mô phỏng, dithering, dữ liệu kiểm thử tổng hợp và bất kỳ ứng dụng nào không yêu cầu độ mạnh mật mã. Nó không phù hợp cho khóa hoặc token; sử dụng nguồn ngẫu nhiên hệ thống qua os cho những mục đó.
6.17.5. Tính khả dụng khi biên dịch¶
Liệu mỗi submodule có thực sự tồn tại hay không phụ thuộc vào cách camera được biên dịch. scipy.optimize và scipy.special không được bật trên mọi camera; gọi một hàm mà camera không bao gồm sẽ phát sinh AttributeError. dir(sp), dir(sp.optimize), dir(np.random) và các lệnh tương tự báo cáo những gì có sẵn trên camera đang được nhắm mục tiêu.