6.17. Çözücüler ve rastgele sayılar¶
İncelenen işlev, bir örnek arabelleği yerine Python koduyla tanımlandığında, farklı bir araç ailesi doğru tercihtir: işlevin kökü nerede, minimumu nedir, belirli bir aralıktaki integrali kaçtır? scipy.integrate ve scipy.optimize alt modülleri bu işi kapsar. Her algoritma, kullanıcının sağladığı Python işlevine geri çağrı yapar; bu nedenle yineleme başına maliyet, bir arabellek indirgemesinden daha yüksektir; kolaylık ise çözücüyü yazmak zorunda olmamaktır.
scipy.special alt modülü, bir olasılık dağılımının birikimli dağılım işlevini (CDF, bir örneğin en fazla belirli bir değerde olma olasılığı) veya olasılık yoğunluğu işlevini (PDF, belirli bir değerdeki göreceli olabilirlik) hesaplarken ortaya çıkan istatistiksel özel işlevleri (hata işlevi, gama) kapsar. numpy.random, kararma (dithering), simülasyon ve sentetik test verileri için sözde rastgele üreteci kapsar.
6.17.1. Bir çağrılabilirin sayısal integrasyonu¶
İntegrand, bir örnek arabelleği yerine bir Python işlevi olduğunda, scipy.integrate dört kuadratür algoritması sunar:
quad()– uyarlamalı Gauss-Kronrod. Düzgün integrandlar için doğru varsayılan.(value, error)döndürür.romberg()– klasik Romberg / Newton-Cotes. Tek bir float döndürür. Yukarı akışta kullanımdan kaldırılmıştır; uyumluluk için dahil edilmiştir.simpson()– uyarlamalı Simpson kuralı. Tek bir float döndürür.tanhsinh()– çift üstel kuadratür. İntegrandın uç nokta tekillikleri veya sonsuz bir limiti olduğunda kullanın.(value, error)döndürür.
Çift üstel kuralla (tanhsinh) hesaplanan Gauss integrali:
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))
Çıkış:
approx: 1.7724538... exact: 1.7724538...
6.17.2. Kök bulma ve minimizasyon¶
scipy.optimize, üç klasik tek değişkenli çözücüyü kapsar. Her yineleme, kullanıcının sağladığı Python işlevine geri çağrı yapar; bu nedenle saf Python çözücüye göre hızlanma mütevazıdır (kabaca 2 kat); kolaylık ise çözücüyü yazmak zorunda olmamaktır.
bisect()– aralığı ikiye bölerek[a, b]üzerindefişlevinin bir kökünü bulur.f(a)vef(b)zıt işaretlere sahip olmalıdır:def f(x): return x * x - 1 sp.optimize.bisect(f, 0, 4) # ~1.0
newton()– sekant / Newton-Raphson yinelemesini kullanarak bir kök bulur:def f(x): return x * x * x - 2.0 sp.optimize.newton(f, 3., tol=0.001, rtol=0.01) # ~1.260
fmin()– aşağı yönlü simpleks (Nelder-Mead) yöntemini kullanarak yerel bir minimum bulur:def f(x): return (x - 1) ** 2 - 1 sp.optimize.fmin(f, 3.0) # ~1.0
Tek değişkenli kapsam, kamera tarafındaki çoğu optimizasyon için yeterlidir – bir sensörün kalibrasyon sabiti, bir kontrast ölçümünü maksimize eden kazanç, bir histogram iki kipliliğinin en keskin olduğu eşik. Çok değişkenli problemler için doğru yanıt genellikle, genel bir doğrusal olmayan optimize edici aramak yerine problemi küçük bir doğrusal cebir çözümü olarak yeniden formüle etmektir.
6.17.3. Özel işlevler¶
scipy.special, evrensel işlevler gibi davranan – bir skaler, bir yinelenebilir veya bir ndarray kabul eden ve bir float ndarray döndüren – bir avuç istatistiksel ve olasılık işlevi sunar:
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
Hata işlevi ve onun tümleyeni, bir Gauss dağılımının CDF’sinde ortaya çıkar – ölçülen bir z-skorunu bir olasılığa dönüştürmek veya bir normal dağılımın kuyruk integralini hesaplamak için tercih edilen uygulamadır. Gama ve log-gama işlevleri beta / ki-kare / student-t hesaplamalarında görünür; gammaln, gamma işlevinin kendisinin taşma yapacağı büyük argümanlar için sayısal olarak kararlı biçimdir.
6.17.4. Rastgele sayılar¶
numpy.random, yaygın dağılımlardan örnekler çeken bir Generator sınıfı sağlar. Üreteç durum bilgilidir: her çağrı iç durumunu ilerletir, böylece ardışık çağrılar bağımsız örnekler döndürür:
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))
Çıkış dtype’ı her zaman float tipindedir. size= bir tamsayı (1 boyutlu çıkış) veya bir demet (n boyutlu çıkış) kabul eder; atlandığında tek bir Python float değeri döndürülür.
Üreteç; simülasyon, kararma (dithering), sentetik test verileri ve kriptografik gücün gerekmediği diğer her uygulama için uygundur. Anahtarlar veya tokenlar için uygun değildir; bunlar için os aracılığıyla sistem rastgele kaynağını kullanın.
6.17.5. Derleme zamanı kullanılabilirliği¶
Her alt modülün gerçekte mevcut olup olmadığı, kameranın nasıl derlendiğine bağlıdır. scipy.optimize ve scipy.special her kamerada etkin değildir; kameranın içermediği bir işlevi çağırmak AttributeError hatası verir. dir(sp), dir(sp.optimize), dir(np.random) ve benzerleri, hedeflenen kamerada nelerin mevcut olduğunu bildirir.