6.17. Solver dan angka acak¶
Ketika fungsi yang dipelajari didefinisikan oleh kode Python daripada buffer sampel, keluarga alat yang berbeda adalah pilihan yang tepat: di mana akar fungsi, minimumnya, integralnya di atas interval tertentu? Submodul scipy.integrate dan scipy.optimize mencakup pekerjaan tersebut. Setiap algoritma memanggil balik ke fungsi Python yang disediakan pengguna, sehingga biaya per iterasi lebih tinggi daripada reduksi buffer; kenyamanannya adalah tidak perlu menulis solver sendiri.
Submodul scipy.special mencakup fungsi khusus statistik (fungsi error, gamma) yang muncul saat menghitung cumulative distribution function (CDF, probabilitas bahwa sampel paling banyak bernilai tertentu) atau probability density function (PDF, kemungkinan relatif pada nilai tertentu) dari distribusi probabilitas. numpy.random mencakup generator pseudo-random untuk dithering, simulasi, dan data uji sintetis.
6.17.1. Integrasi numerik dari callable¶
Ketika integran adalah fungsi Python daripada buffer sampel, scipy.integrate mengekspos empat algoritma kuadratur:
quad()-- Gauss-Kronrod adaptif. Default yang tepat untuk integran halus. Mengembalikan(value, error).romberg()-- Romberg / Newton-Cotes klasik. Mengembalikan satu float. Sudah usang di upstream; disertakan untuk kompatibilitas.simpson()-- aturan Simpson adaptif. Mengembalikan satu float.tanhsinh()-- kuadratur double-exponential. Gunakan ketika integran memiliki singularitas titik akhir atau batas tak terhingga. Mengembalikan(value, error).
Integral Gaussian dievaluasi dengan aturan double-exponential (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))
Keluaran:
approx: 1.7724538... exact: 1.7724538...
6.17.2. Pencarian akar dan minimisasi¶
scipy.optimize mencakup tiga solver satu-variabel klasik. Setiap iterasi memanggil balik ke fungsi Python yang disediakan pengguna, sehingga percepatan dibandingkan solver Python murni cukup sederhana (sekitar 2x); kenyamanannya adalah tidak perlu menulis solver sendiri.
bisect()-- menemukan akar darifpada[a, b]dengan membagi setengah interval.f(a)danf(b)harus memiliki tanda yang berlawanan:def f(x): return x * x - 1 sp.optimize.bisect(f, 0, 4) # ~1.0
newton()-- menemukan akar menggunakan iterasi secant / 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()-- menemukan minimum lokal menggunakan metode downhill-simplex (Nelder-Mead):def f(x): return (x - 1) ** 2 - 1 sp.optimize.fmin(f, 3.0) # ~1.0
Cakupan satu variabel sudah cukup untuk sebagian besar optimisasi di sisi kamera -- konstanta kalibrasi sensor, gain yang memaksimalkan pengukuran kontras, ambang batas di mana bimodalitas histogram paling tajam. Untuk masalah multi-variabel, jawaban yang tepat biasanya adalah memformulasikan ulang masalah sebagai penyelesaian aljabar linear kecil daripada menggunakan optimiser nonlinear umum.
6.17.3. Fungsi khusus¶
scipy.special mengekspos sejumlah fungsi statistik dan probabilitas yang berperilaku seperti fungsi universal -- fungsi-fungsi tersebut menerima skalar, iterable, atau ndarray dan mengembalikan 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
Fungsi error dan komplemennya muncul dalam CDF Gaussian -- aplikasi pilihan untuk mengkonversi antara z-score terukur dan probabilitas, atau untuk menghitung integral ekor distribusi normal. Fungsi gamma dan log-gamma muncul dalam perhitungan beta / chi-squared / student-t; gammaln adalah bentuk yang stabil secara numerik untuk argumen besar di mana gamma itu sendiri akan overflow.
6.17.4. Angka acak¶
numpy.random menyediakan kelas Generator yang mengambil sampel dari distribusi umum. Generator bersifat stateful: setiap panggilan memajukan status internalnya, sehingga panggilan berurutan mengembalikan sampel yang independen:
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 keluaran selalu float. size= menerima integer (keluaran 1-D) atau tuple (keluaran n-D); ketika dihilangkan, satu Python float dikembalikan.
Generator cocok untuk simulasi, dithering, data uji sintetis, dan aplikasi lain di mana kekuatan kriptografi tidak diperlukan. Generator ini tidak cocok untuk kunci atau token; gunakan sumber acak sistem melalui os untuk keperluan tersebut.
6.17.5. Ketersediaan saat build¶
Apakah setiap submodul benar-benar ada tergantung pada bagaimana kamera dibangun. scipy.optimize dan scipy.special tidak diaktifkan pada setiap kamera; memanggil fungsi yang tidak disertakan kamera akan memunculkan AttributeError. dir(sp), dir(sp.optimize), dir(np.random) dan sejenisnya melaporkan apa yang tersedia pada kamera yang ditargetkan.