{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# AST416 Astronomide Sayısal Çözümleme - II #\n",
"## Ders - 02b Python'da Belirsizliğin İfadesi ve Yayılımı ##"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Doç. Dr. Özgür Baştürk
\n",
"Ankara Üniversitesi, Astronomi ve Uzay Bilimleri Bölümü
\n",
"obasturk at ankara.edu.tr
\n",
"http://ozgur.astrotux.org"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Bu derste neler öğreneceksiniz?#\n",
"## Python'da Belirsliziğin İfadesi ve Yayılımı ##\n",
"\n",
"* [Belirsizliğin İfadesi](#Belirsizliğin-İfadesi)\n",
"* [Belirsizliğin Yayılımı](#Belirsizliğin-Yayılımı)\n",
"* [uncertainties Modülü](#uncertainties-Modülü)\n",
" * [Kovaryans ve Korelasyon Matrisleri](#Kovaryans-ve-Korelasyon-Matrisleri)\n",
" * [numpy Dizileriyle İşlemlerde Belirsizliğin Yayılımı](#numpy-Dizileriyle-İşlemlerde-Belirsizliğin-Yayılımı)\n",
" * [unmpy Alt Modülü](#unmpy-Alt-Modülü)\n",
" * [umatrix Alt Modülü](#umatrix-Alt-Modülü)\n",
"* [Kaynaklar](#Kaynaklar)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Belirsizliğin İfadesi #\n",
"\n",
"Pek çok kaynağı olabilecek bir ölçüm hatası ya da bir model üzerinden belirlenmiş bir parametrenin tahmini değerinin üzerindeki belirsizlik genel olarak\n",
"\n",
"$$ x \\pm \\Delta x $$\n",
"\n",
"gösterimiyle ifade edilir. \n",
"\n",
"Buradaki $\\Delta x$ değerinin ne olduğu (ölçüm aletinin limiti, standart hata, standart sapma gibi) ayrıca açıkça belirtilmelidir. Hatta bilimsel çalışmalarda parametre belirsizliklerinin nasıl türetildiği için özel bölümler ayrıldığı ve konunun ayrıntısıyla anlatıldığı da olur.\n",
"\n",
"Parametrenin olası değerlerinin olasılık dağılımının elde edildiği ve dağılımın asimetrik olduğu durumlarda negatif ve pozitif yönde belirli bir persantil değeri (genellikle 16 ve 84. persantil tercih edilir) kullanılarak parametre belirsizlikleri verilir. \n",
"\n",
"$$ x^{+\\Delta_1}_{-\\Delta_2} $$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Belirsizliğin Yayılımı #\n",
"\n",
"Bir parametrenin üzerindeki belirsizlik ona bağlı olarak türetilen bir diğer parametreye belirsizliğin yayılmasına ilişkin kurallar takip edilerek yansıtılmalıdır. Bu noktada parametreler arası ilişkiler (korelasyonlar) de dikkate alınır. \n",
"\n",
"Python'da da bu kurallara uyularak belirsizlik hesabı parametre hesabıyla birlikte yapılabileceği, bunun için özel fonksiyonlar yazılabileceği gibi bu amaçla özel olarak geliştirilen `uncertainties` modülü fonksiyonlarına da başvurulabilir. `uncertainties` gelişmiş bir [paket](https://github.com/lebigot/uncertainties) olup, [dokümantasyonu](https://pythonhosted.org/uncertainties/user_guide.html) da detaylıdır. Aynı amaçla yazılmış ve veri görselleştirmeleri için de kullanılabilen [uncertainty-toolbox](https://github.com/uncertainty-toolbox/uncertainty-toolbox) gibi başka paketler de bulunmaktadır."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# uncertainties Modülü #\n",
"\n",
"`uncertainties` paketi, üzerinde belirsizlik bulunan parametre değerleriyle ($3.14 \\pm 0.01$ gibi) hesap yapılmasına ve belirsizliğin bu hesapların yayılmasına olanak sağlayan ücretsiz, platform-bağımsız bir Python modülüdür. Ayrıca herhangi bir ifadenin türevlerini de verebilir.\n",
"\n",
"Bir hesaplamanın karmaşıklığı ne olursa olsun, bu paket, parametre belirsizliklerini hata yayılım teorisinin öngördüğü şekilde uygulayarak hesap sonucunu bir belirsizlik değeriyle döndürür. Türevleri otomatik olarak hesaplar ve belirsizlikleri hesaplamak için kullanır. Hemen hemen tüm belirsizlik hesaplamaları analitik olarak yapılır. Değişkenlerin tanımlanma şekline bağlı olarak aralarındaki korelasyonu da otomatik olarak yönetir.\n",
"\n",
"Birkaç basit örnekle modülün nasıl çalıştığını görelim. Her şeyden önce üzerinde belirsizlik bulunan parametre değerleri `ufloat` fonksiyonuyla birer `uncertainties.core.Variable` nesnesi olarak tanımlanmalıdır. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from uncertainties import ufloat\n",
"x = ufloat(3,1)\n",
"print(x**2 - 2*x + 4)\n",
"print(type(x)) "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"x = ufloat(0.25,0.02)\n",
"y = ufloat(0.45,0.08)\n",
"print(x-y)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Parametre hassasiyetini belirtmek için \"u\" notasyonu (precision modifier) yer tutucu olarak aşağıdaki şekilde kullanılabilir."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"x = ufloat(0.2,0.01)\n",
"print('1 anlamli rakam : {:.1u}'.format(x))\n",
"print('3 anlamli rakam : {:.3u}'.format(x))\n",
"print('1 anlamli rakam ussel notasyon : {:.1ue}'.format(x))\n",
"print('1 anlamli rakam yuzde notasyonu : {:.1u%}'.format(x))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`math` paketindeki fonksiyonların belirsizliklerle işlem yapabilen ve bu belirsizlikleri hatanın yayılımı prensipleri çerçevesinde sonuçlara yansıtan benzerlerine `uncertainties.umath` fonksiyonları ile erişilir. Ancak matematiksel sabitlerin `math` kütüphanesinden indirilmesi gerekir."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from math import pi,e\n",
"from uncertainties.umath import *\n",
"r = ufloat(2.552,0.005)\n",
"print(\"Cevre = \",(2*pi*r))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"theta = ufloat(pi/4,pi/32)\n",
"print(sin(2*theta))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Parametreler arası korelasyonlar da otomatik olarak yönetilier. Örneğin $\\theta$ parametresi ölçüm belirsizliği ile tanımlanmış olmakla birlikte $\\theta - \\theta$ işlemine giren parametreler korele olduğu için sonucun üzerindeki belirsizlik 0'dır!"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"theta - theta"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Parametrenin belirsizlik belirleme için tabi tutulduğu türev alma işleminin sonucuna da erişilebilir."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"(sin(theta-pi/4)).derivatives[theta]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Kovaryans ve Korelasyon Matrisleri\n",
"\n",
"İlgilenilen parametreler arasında bir korelasyonun olması durumunda bu korelasyon; kovaryans ve korelasyon matrisleri incelenerek araştırılabilir. Örneğin bbirbirlerinden bağımsız olarak belirlenen iki sayının toplamı bu sayılara bağlı olacak ve onlarla korelasyon gösterecektir."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"u = ufloat(1, 0.1, \"u degiskeni\") # Tag (ya da label)\n",
"v = ufloat(10, 0.1, \"v degiskeni\")\n",
"toplam = u + 2*v\n",
"print(toplam)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import uncertainties\n",
"kovaryans_matrisi = uncertainties.covariance_matrix([u, v, toplam])\n",
"np.set_printoptions(precision=2)\n",
"print(np.array(kovaryans_matrisi))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Kovaryans matrisinin ilk iki sütunundaki 0 değerleri u ve v değişkenlerinin bağımısız olduğunu , diğer sütunun 0 olmaması ise toplam değişkeninin bu iki değişkene bağlı olduğunu, dolayısıyla aralarında bir korelasyon bulunduğunu göstermektedir. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"toplam - (u + 2*v)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"İstendiği takdirde kovaryans matrisine erişilebildiği gibi korelasyon matrisine de erişilebilir."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"korelasyon_matrisi = uncertainties.correlation_matrix([u, v, toplam])\n",
"korelasyon_matrisi"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Aralarında kovaryans matrisinin işaret ettiği ilişkiler bulunan ve değerleri verilen değişkenlerin üzerindeki belirsizlikler `correlated_values` fonksiyonuyla hesaplanır."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"(u2, v2, toplam2) = uncertainties.correlated_values([1, 10, 21], kovaryans_matrisi)\n",
"print(u2)\n",
"print(v2)\n",
"print(toplam2)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"toplam2 - (u2 + 2*v2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Aslında buradaki belirsizliğin de 0 olması gerekirdi ama yuvarlama hataları 0'a yakın ama 0 olmayan bir belirsizliğin elde edilmesine neden olmuştur."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## numpy Dizileriyle İşlemlerde Belirsizliğin Yayılımı \n",
"\n",
"`uncertainties` fonksiyoları `numpy` dizileriyle birlikte tanımlanarak kullanılabilir."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"x = np.array([ufloat(2.00, 0.01), ufloat(4.00, 0.1)])\n",
"x**2"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"3*x[0] + x[1]**2 - x[0]*x[1]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Nesnenin \"\\__print()\\__\" işlem sonundaki anlamlı rakam sayısını dikkate alarak sonuç üzerindeki belirsizliğin ifadesine yardımcı olur."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(3*x[0] + x[1]**2 - x[0]*x[1])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ancak istenirse formatlama seçenekleri kullanılarak da sonucun hassasiyetinin ifadesi yönteilebilir. Yuvarlama işlemlerinde Parçacık Fiziği Grubu'nun takip ettiği [kurallar](http://pdg.lbl.gov/2010/reviews/rpp2010-rev-rpp-intro.pdf) takip edilmektedir."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"print(\"{:.4f}\".format(3*x[0] + x[1]**2 - x[0]*x[1]))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## unumpy Alt Modülü\n",
"\n",
"Her ne kadar `ufloat` üzerinde uygulanan fonksiyonlar bir `numpy` dizisinin elemanlarına uygulanabilir olsa da `unumpy` alt modülü daha ileri düzey ihtiyaçlar için kolaylıklar getirir.\n",
"\n",
"Bir dizi tanımlarken önce parametre değerleri (nominal values) sonra da belirsizlikleri (uncertainties) liste, tuple ya da numpy dizisi gibi bir \"iterable\" ile sağlanır."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from uncertainties import unumpy\n",
"dizi = unumpy.uarray([0, 1], [0.1, 0.005])\n",
"dizi"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Bir dizinin içindeki parametre değerleri `nominal_values`, belirsizlikleri `std_devs` fonksiyonlarıyla alınabilir."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(unumpy.nominal_values(dizi))\n",
"print(unumpy.std_devs(dizi))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Tıpkı `ufloat` için olduğu gibi `unumpy` için de matematik fonksiyonları tanımlıdır."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"theta = unumpy.uarray([0,pi/3,pi/4,pi/6,pi/2],[pi/16]*5)\n",
"theta"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(unumpy.cos(theta))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Bu değerleri belirsizlikleri ile birlikte bir dosyaya yazdırmak istediğinizde `savetxt` fonksiyonunu kullanabilirsiniz."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"np.savetxt('cos_theta.txt', unumpy.cos(theta), fmt='%r')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"İstendiğinde bu dosya tekrar `uncertainties.ufloat_fromstr()` kullanılarak okunabilir."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"converters = dict.fromkeys(range(1),\n",
" lambda col_bytes: uncertainties.ufloat_fromstr(col_bytes.decode(\"utf8\")))\n",
"cos_th = np.loadtxt('cos_theta.txt', converters=converters, dtype=object)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"cos_th"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## umatrix Alt Modülü\n",
"\n",
"Matris işlemleri yapabilmek için tanımlanmış ayrıca bir `umatrix` alt modülü ve bu modülün fonksiyonları da bulunmaktadır."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"mat1 = unumpy.umatrix([1, 2], [0.01, 0.002])\n",
"mat2 = unumpy.umatrix([[3],[4]], [0.01, 0.002])\n",
"mat1*mat2"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(mat1.I)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"a = np.random.randn(100).reshape(50,2)\n",
"print(a)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"np.savetxt(\"a.txt\",a)\n",
"b = np.loadtxt(\"a.txt\")\n",
"a.T[0]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Kaynaklar #\n",
"\n",
"* [Belirsizliğin Yayılımı İle İlgili Temel Prensipler (wikipedia)](https://en.wikipedia.org/wiki/Propagation_of_uncertainty)\n",
"\n",
"* [Yuvarlama ve Belirsizliğin Yayılımı Kuralları (Review of Particle Physics (2010)](https://pdg.lbl.gov/2010/reviews/rpp2010-rev-rpp-intro.pdf)\n",
"\n",
"* [uncertainties Modülü Dokümantasyonu](https://pythonhosted.org/uncertainties/index.html)\n",
"\n",
"* [uncertainties Kullanıcı Rehberi](https://pythonhosted.org/uncertainties/user_guide.html)\n",
"\n",
"* [uncertainties-toolbox Modülü](https://github.com/uncertainty-toolbox/uncertainty-toolbox)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.18"
}
},
"nbformat": 4,
"nbformat_minor": 2
}