A416 Astronomide Sayısal Çözümleme - II
4. Eğri Uyumlama ve Regresyon Analizi
Eğri Uyumlama
• Trend Analizi• İnterpolasyon ve Ekstrapolasyon• Hipotez testi
Chapra (2004)
Biraz Temel İstatistik…
• Merkezi Eğilim Ölçütleri– Aritmetik Ortalama– Medyan– Mod
• Dağılım Ölçütleri– Standart Sapma– Varyans– Değişim Katsayısı– Noktadan noktaya dağılım ∑
i=1
i=n−1
( y i+1− y i)2
2 N−1
Lineer Regresyon
Minimizasyon Stratejileri :
En uzak noktanın uzaklığı
Lineer Regresyon
ve
ε a1=√ (n∑ y i2−(∑ y i)
2−a12(n∑ x i2−(∑ x i )
2))
(n−2)( n∑ x i2−(∑ x i)2)
Katsayıların Hataları
ε a0=√ε
a12
∑ xi2
n
Lineer Regresyon
Örnek :
Bir roketin hızına karşılık maruz kaldığı hava direnci yandaki grafikte ve aşağıdaki çizelgede verilmiştir. En küçük kareler yöntemiyle en uygun doğru uyumlamasını yapınız.
Lineer Regresyon
Bu doğru bu veri setine yapılabilecek en iyi (“the best”) doğru uyumlamasıdır.
Lineer Regresyon
Regresyon katsayısı
Tahmin üzerindeki standart hata
Lineer Regresyon
Örnek :
Standart Sapma Tahmin Üzerindeki Standart Hata
Regresyon KatsayısıYani, veriyi lineer bir modelle temsil etmenin getirdiği iyileştirme bu düzeydedir. Bir başka deyişle, veri üzerindeki belirsizliğin %88.05’i lineer modelle açıklanabilmektedir!
Regresyon Katsayısına Dikkat!
y = 3 + 0.5x lineer uyumlaması için regresyon katsayısı eşit 4 farklı veri seti (Anscombe 1973)
Ders : Verinizi neyin daha iyi temsil edeceğini görmek istiyorsanız program çıktılarının yanı sıra grafiğe de mutlaka bakın!
Lineer Olmayan İlişkilerin Lineerleştirilmesi
Lineer Olmayan İlişkilerin Lineerleştirilmesi
Örnek :
Lineer Olmayan İlişkilerin Lineerleştirilmesi
Polinom Regresyonu
Polinom Regresyonu
∑ xi
∑ xi2
∑ xi2
∑ x i∑ x i
∑ xi3
∑ xi3 ∑ x
i4
n a0
a1
a2
=
∑ y i
∑ xi yi
∑ xi2 yi
∑ xi ∑ xi2
Polinom Regresyonu
∑ xi
∑ xi2
∑ xi2
∑ x i
∑ x i
∑ x i
∑ xi2
∑ xi3
∑ xi3 ∑ x
i4
n a0
a1
a2
=
∑ y i
∑ xi y i
∑ xi2 yi
Bu ifadeyi genelleştirelim...
.. .
.. .
.. .
∑ xim
.. .
.. .
.. .
∑ xim+1
.. .
.. .
.. .
∑ xim+2
.. . .. . .. . ∑ xim
∑ xim+1
∑ xim+2
.. . .. . .. .
.. . .. . .. .
.. .
.. .
.. .
∑ xi2m
.. .
.. .
.. .
am
.. .
.. .
.. .
∑ xim y i
Bu ifade için standart hata :
Sr=( y i−a0−a1 x−a2 x2−.. .−am xm
)2
Polinom RegresyonuÖrnek :
2. dereceden bir polinomla modellemek istiyor olalım.
∑ x i
∑ xi2
∑ x i ∑ xi2
∑ xi3∑ x
i2
∑ xi3 ∑ x
i4
n a0
a1
a2
=
∑ y i
∑ xi y i
∑ xi2 yi
Yani, verideki belirsizliğin %99.851’i 2. dereceden bir polinom modeliyle temsil edilebiliyor!
Polinom RegresyonuÖrnek (devam) :
Regresyon katsayısı :
Çok Değişkenli Lineer Regresyon
Çok değişkenli Lineer Regresyon
Çok Değişkenli Lineer Regresyon
Örnek :
Çok değişkenli bir lineer model arıyor olalım.
Çok Değişkenli Lineer Regresyon
∑ x1, i x2, i
∑ x2, i
2 ∑ x2, i xm,i
∑ x1, i
∑ x2, i
∑ x1, i
2
∑ x1, i ∑ x2, i
∑ x1, i x2, i
n a0
a1
a2
=
∑ y i
∑ x1, i y i
∑ x2, i y i
Bu ifadeyi genelleştirelim...
.. .
.. .
.. .
∑ xm ,i
.. .
.. .
.. .
∑ x1, i xm, i
.. .
.. .
.. .
∑ x2, i xm,i
.. . .. . .. . ∑ xm ,i
.. . .. . .. .
.. . .. . .. .
.. .
.. .
.. .
∑ xm ,i
2
.. .
.. .
.. .
am
.. .
.. .
.. .
∑ xm ,i y i
Bu ifade için standart hata :
Sr=( yi−a0−a1 x1−a2 x2−. ..−am xm)2
∑ x1, i xm, i
Lineer olmayan bazı ifadeleri yine lineer hale getirebiliriz :
En Küçük Kareler Yöntemi (Genel)
z0=1, z1=x1 , z2=z3=.. .= zm=0
z0=1, z1=x1 , z2=x2 , .. . , zm=xm
Lineer Regresyon
Çok Değişkenli Lineer Regresyon
z0=1, z1=x , z2=x2 ,. .. , zm= xmPolinom Regresyonu
minimize edilirse
En Küçük Kareler Yöntemi (Genel)
ŷi : En küçük kareler yöntemiyle belirlenen değer
ỹ : Aritmetik ortalama
Tüm durumlar için standart hata :
numpy.polyfit ve numpy.poly1d Metodları ile Doğru Uyumlama
Basit bir doğru uyumlama örneği ile başlayalım.
>>> import matplotlib.pyplot as plt>>> import numpy as np>>> x = [-7.3, -4.1, -1.7, -0.02564, 1.5, 4.5, 9.1]>>> y = [-0.8, -0.5, -0.2, 0.0, 0.2, 0.5, 0.8]>>> katsayilar = np.polyfit(x, y, 1) # Sondaki 1 dogru uyumlamasıini gosterir>>> katsayilararray([ 0.10160693, -0.02865838]) # dogrunun katsayilari>>> dogru = np.poly1d(katsayilar)>>> dogrupoly1d([ 0.10160693, -0.02865838])>>> y_dogru = dogru(x)>>> plt.plot(x,y,'ro')>>> plt.plot(x,y_dogru, 'b-')>>> plt.show()
numpy.polyfit ve numpy.poly1d Metodları ile Eğri Uyumlama
6. dereceden bir polinom uyumlamasıyla devam edelim.
>>> import matplotlib.pyplot as plt>>> import numpy as np>>> x = [2.53240, 1.91110, 1.18430, 0.95784, 0.33158,-0.19506, -0.82144, -1.64770, -1.87450, -2.2010]>>> y = [-2.50400, -1.62600, -1.17600, -0.87400, -0.64900, -0.477000, -0.33400, -0.20600, -0.10100, -0.00600]>>> katsayilar = np.polyfit(x, y, 6) # Sondaki 6 polinomun derecesini gosterir>>> polinom_6 = np.poly1d(katsayilar)>>> x_polinom6 = np.arange(-2.2, 2.6, 0.1)>>> y_polinom6= polinom_6(x_polinom6)>>> plt.plot(x,y,'ro')>>> plt.plot(x_polinom6, y_polinom6, 'b-')>>> plt.show()
Fermi Gamma Işını Teleskobu ile M82 Gözlemleri
Örnek 1 :
Astronomlar, Fermi Gamma Işını Teleskobu’nu kullanarak, 12 milyon ışık yılı uzaklıktaki M82’nin önemli bir gamma ışını kaynağı olduğunu keşfettiler. Yapılan araştırmalar bu cismin, aktif çekirdekli mini bir kuasar olduğunu ortaya koydu. Aşağıda bu cisimden alınan gamma ışınlarının MeV cinsinden enerjisine karşılık santimetrekareye 1 saniyede ulaşan sayısı verilmektedir. M82 için algılanan gamma ışını şiddeti ile sayısı arasındaki ilişkiyi en küçük kareler yöntemi ile bulunuz. Bu sonuca dayanarak 20000 MeV için saniyede santimetrekareye düşen gamma parçacığı sayısı için bir kestirimde bulununuz.
x (MeV) F (x)
407.38 1.94984E-06
1122.02 2.0893E-06
4466.84 7.07946E-07
1047128.55 2.0893E-07
1288249.55 1.90546E-07
2089296.13 1.38038E-07
Örnek 1: Çözüm Ders03_ornek_kodlar/ornek1.cozum.py
x = 20000 MeV icin F(x) = 6.29457255588e-07
Küresel Isınmanın Ciddiyeti
Karbondioksit seviyesinde 1960'dan bu yanaki değişim Keeling Eğrisi adı verilen bir eğriyle ifade edililr. Söz konusu değişim küresel ısınmaya neden olduğu gerekçesiyle endişe konusudur. Aşağıda 1960'dan bu yana geçen süre içerisinde onar yıllık ölçüm sonuçları milyon parçacık başına verilmiştir. Keeling Eğrisinin bir parabolle (2. dereceden bir polinomla) temsil edilebileceğini düşünerek ve eldeki veriyi kullanarak eğriye en uygun formülü bulunuz. Keeling Eğrisi yapısını korursa 2060 yılı sonunda parçacık başına kaç karbondioksit molekülü düşer hesaplayınız.
Örnek 2 :
Örnek 2: Çözüm
>>> import matplotlib.pyplot as plt>>> import numpy as np>>> x = np.array([ 0., 10., 20., 30., 40., 50.])>>> y = np.array([317, 326, 338, 354, 369, 390])>>> pol2ks = np.polyfit(x,y,2)>>> pol2 = np.poly1d(pol2ks)>>> xyeni = np.linspace(0,100,101)>>> yfit = pol2(xyeni)>>> plt.plot(x+1960,y,'ro',xyeni+1960,yfit,'b-',[2060],[pol2(100.)],"m*")>>> plt.xlabel('Yil')>>> plt.ylabel('n (CO$_{2}$) / Milyon Parcacik')>>> plt.title('Yil - CO$_{2}$ Bollugu')>>> plt.xlim((1950,2070))>>> plt.show()
Ders03_ornek_kodlar/ornek2.cozum.py
Levenberg-Marquardt Algoritması Doğrusal Olmayan En Küçük Kareler Yöntemi
✔ Matematik ve bilgisayar bilimlerinde Levenberg-Marquardt Algoritması (LMA), sönümlenmiş en küçük kareler yöntemi (Damped Least Squares, DLS) olarak da bilinir. m adet gözlemsel veriyi n tane bilinmeyenle modellemek üzere başlangıçta doğrusal bir model üretilip, modelin iterasyonlar sonucu iyileştirilerek doğrusal olmayan bir modelle değiştirilmesi prensibine dayanır.
✔ (x0, y0), (x1, y1), (x2, y2), … , (xm, ym) gözlemsel noktalarımız olsun. Bu noktaları f(x, β) gibi bir fonksiyonla fit etmek istiyor olalım. Burada m ≥ n olmak üzere β = (β0, β1, … , βn-1) fonksiyonun parametreleridir ve fonksiyon x ile birlikte bu parametrelere de bağlıdır. Algoritmada amaç en küçük kareler yöntemine benzer şekilde en küçük artıkları verecek S = Σr i
2 minimizasyonunun gerçekleşeceği β parametrelerini elde etmektir (ri = yi – f(xi, β)).
✔ Tıpkı en küçük kareler yönteminde olduğu gibi yine S'in bu kez β j (j = 0, 1, 2, … , n) 'e göre türevleri alınır ve 0'a eşitlenir. Doğrusal olmayan bir sistemde bu türevler hem x'e hem de β'ya bağlı olacağından doğrudan çözüm elde etmek yerine probleme uygun seçilmiş başlangıç parametreleri ile başlanır (β'lara başlangıç değerleri verilir) ve iteratif bir yaklaşımla her seferinde S hesaplanıp, daha öncekilerle ile karşılaştırılarak en küçük S'yi verecek parametre seti aranır. β her seferinde β + δ ile değiştirilir. δ'yı bulmak için f(xi, β + δ) doğrusallaştırmak üzere Taylor serisine açılır (f(x i, β + δ) ≈ f(xi, β ) + Jiδ, Ji: Jakobiyen). S'in β'ya görevi türevi 0 olduğunda S( β + δ) ≈ Σri2 = Σ (yi – f(xi, β) – Jiδ)2 toplamının δ'ya göre türevi de 0 olmalıdır ki minimizasyon sağlanmış olsun. Vektörel notasyonla (J T J) δ = JT |(yi – f(β)| denklemi δ için çözülür ve β parametreleri bulunur.
✔ Levenberg'in algoritmaya getirdiği yenilik bir sönümleme (damping) parametresi eklemiş olmasıdır. Böylece denklem (J T J + λI) δ = JT |(yi – f(β)| şeklini alır. Sönümleme parametresi λ her bir iterasyon adımında değiştirilir ve β + δ 'nın belirenen bir tolerans değerinin altına indiği anda iterasyon durdurulur. En son β vektörü fonksiyonun parametrelerini verir.
scipy.optimize.leastsq ile Levenberg-Marquardt Algoritması Kullanarak Fit
Ders03_ornek_kodlar/leastsq_ornek.py x = [1.0,2.5,3.5,4.0,1.1,1.8,2.2,3.7]
y = [6.008,15.722,27.130,33.772,5.257,9.549,11.098,28.828]
veri setine Levenberg-Marquardt algoritmasıyla bir doğru bir de Parabol fit etmek istiyor olalım. Yapmamız gereken leastsq fonksiyonuna gözlemsel x,y değerleri ile hesaplananlar arasındaki hatayı
veren bir HataFonksiyonu, birer başlangıç parametre seti (a0 + a1 x doğrusu için β = (β0, β1) = (a0, a1
)
parametreleri, a0 + a
1 x + a
2x2
parabolü için β = (β0, β1
, β2) = (a0, a1
, a2) parametreleri olarak sırasıyla (1.0, 2.0) ve (1.0,
2.0, 3.0)), ve veri setimizi (args = (x,y)) argümanlarını vermektir. Levenberg-Marquardt algoritması bu parametreler için en iyi değerleri hesaplar ve bu parametreleri doğru ve
parabol denklemlerinde yerine koyarak fitlerimizi elde etmiş oluruz.
scipy.optimize.optimization.curve_fit ile Levenberg-Marquardt Algoritması Kullanarak Fit
Ders03_ornek_kodlar/curvefit_ornek.py x = [0.0, 1.0, 2.0, 3.0, 4.0, 5.0]
y = [0.1, 0.9, 2.2, 2.8, 3.9, 5.1]
veri setine Levenberg-Marquardt algoritmasıyla bir parabol fit etmek istiyor olalım. Bu kez yapmamız gereken curve_fit fonksiyonuna gözlemsel x,y değerlerinin yanı sıra bir hata
fonksiyonu yerine doğrudan fit fonksiyonu, ve başlangıç parametre seti (a0 + a
1 x + a
2x2
parabolü için β =
(β0, β1, β
2) = (a0, a1
, a2) parametreleri olarak (0.0, 0.0, 0.0)) ve istersek gözlemsel hatalarımızı (sigma) vermektir.
Levenberg-Marquardt algoritması bu parametreler için en iyi değerleri hesaplar ve bu parametreleri parabol
denkleminde yerine koyarak fitimizi elde etmiş oluruz.
Levenberg-Marquardt Algoritması İle İgili Uyarılar
Algoritma verilen başlangıç parametrelerine en yakın yerel minimumu bulması nedeniyle
dezavantajlıdır. Bir süre benzer (ya da yakın) değerler alan fonksiyonlarda minimizasyon konusunda problemlidir (bu
noktalarda zig-zag yapar!). Bazı durumlarda (başlangıç parametrelerinin çözüme yakınlığı) oldukça hızlı çalışırken, bazı durumlarda
en iyi fiti verecek parametreleri bulmak konusunda oldukça yavaş olabilir. Örnek: curvefit_ornek2.py
Daha sofistike bir çözüm: LMFIT (1/3)
LMFIT, scipy.optimize modülü üzerine kurulu ve onun optimizasyon ve eğri uyumlama
yeteneklerini daha ileriye taşıyan bir paket. İndirmek ve kurmak için: http://cars9.uchicago.edu/software/python/lmfit/installation.html#installation
Örnek: Gözlemsel Veriye Gauss Fiti Uyumlaması (lmfit_ornek_gauss.py)
Bu örneği scipy.optimize.curve_fit fonksiyonu ile kolayca çözebiliriz.
>>> from numpy import random, sqrt, pi, exp, linspace>>> from scipy.optimize import curve_fit>>> def gauss(x, genlik, ortalama, stsapma): ... return genlik*exp(-(x-ortalama)**2/stsapma)>>> x = linspace(-10, 10)>>> y = gauss(x, 2.33, 0.21, 1.51) + random.normal(0, 0.2, len(x))>>> baslangicPar = [1, 0, 1]>>> params, kovaryans = curve_fit(gauss, x, y, p0 = baslangicPar)>>> paramsArray([ 2.13646343, 0.20518047, 1.70299407])>>> x2 = linspace(-10,10,100)>>> yfit = params[0]*exp(-(x2 – params[1])**2/params[2])>>> plt.plot(x,y,'ro',x2,yfit,'b-')>>> plt.show()
Ancak bu durumda LMFIT paketinin getirdiği bazı özelliklerden mahrum kalırız. Bunlardan biri LMFIT'in sağladığı Model metodudur. Bu metodun ürettiği modelin parametrelerinin sırasını bilmeniz gerekmez, adlarını bilmeniz yeterlidir.
Daha sofistike bir çözüm: LMFIT (2/3)
Aşağıdaki kodla tanınmlanan gmod modeli bağımsız değişkenin (x) ve model parametrelerinin (genlik, ortalama,
stsapma) adlarını bilmektedir
>>> from lmfit import Model>>> gmod = Model(gauss)>>> gmod.param_names['genlik','ortalama','stsapma']>>> gmod.independent_vars['x']
Model oluşturulduğunda parametreler oluşmaz. Bu sırada model parametrelerin ve bağımsız değişkenin adını bilir
ancak verinizin ne uzunlukta olduğundan ve ölçeğinden habersizdir. Dolayısıyla bu parametrelerin oluşuturlması ve
başlangıç değerlerinin atanmış olması icap eder. make_params() fonksiyonu bu işte size yardımcı olur.
>>> params = gmod.make_params('ortalama' = 5, 'genlik' = 200, stsapma = 1)
Modelin metotlarından eval() modeli çalıştırırken, fit() metodu ise modeli verilen veri setine
uyumlar.
>>> x = linspace(0, 10, 201)>>> y = gmod.eval(x=x, genlik=10, ortalama=6.2, stsapme=0.75)>>> sonuc = gmod.fit(y, x=x, genlik=5, ortalama=5, stsapma=1)>>> plt.plot(x, sonuc.init_fit, 'k--')>>> plt.plot(x, sonuc.best_fit, 'r-')>>> plt.show()
Daha sofistike bir çözüm: LMFIT (3/3)
Kodumuzu birleştirip (lmfit_ornek_gauss.py) çalıştıralım.
from numpy import sqrt, pi, exp, linspace, randomfrom scipy.optimize import curve_fitfrom matplotlib import pyplot as plt# scipy.optimize.curve_fit ile cozumdef gauss(x, genlik, ortalama, stsapma): return genlik * exp(-(x - ortalama)**2 /stsapma)x = linspace(-10,10)# Genligi 2.33, ortalama degeri 0.21, standart sapmasi 1.51 olan# bir Gaussian dagilim olusturup uzerine yine Gaussian bir gurultu ekleyelimA = 2.33mu = 0.21sigma = 1.51y = gauss(x, A, mu, sigma) + random.normal(0, 0.2, len(x))gmod = Model(gauss)# Modelimizi x, y verimize fit edelimsonuc = gmod.fit(y, x=x, genlik=2, ortalama=0, stsapma=1)print sonuc.fit_report()# Baslangic parametrelerimizle olusan fiti# Fit islemi sonrasi olusan en iyi uyumlamayi# ve verimizi bir grafikte gosterelimplt.plot(x, y, 'ro') # veriplt.plot(x, sonuc.init_fit, 'b--') # A=2, mu=0, sigma=1 icin fitplt.plot(x, sonuc.best_fit, 'g-') # Veri setine uyumlanan en iyi fitplt.show()# Fitimizin parametrelerini ekrana yazdiralimprint "En iyi uyumlamanin genligi = %.2f, ortalama degeri = %.2f, "\ "st.sapma = %.2f" % (sonuc.params['genlik'].value,\ sonuc.params['ortalama'].value,\ sonuc.params['stsapma'].value)
[[Model]] Model(gauss)[[Fit Statistics]] # function evals = 23 # data points = 50 # variables = 3 chi-square = 1.467 reduced chi-square = 0.031 Akaike info crit = -167.349 Bayesian info crit = -161.613[[Variables]] genlik: 2.19270401 +/- 0.111165 (5.07%) (init= 2) ortalama: 0.09067167 +/- 0.051070 (56.32%) (init= 0) stsapma: 1.52227546 +/- 0.178216 (11.71%) (init= 1)[[Correlations]] (unreported correlations are < 0.100) C(genlik, stsapma) = -0.577
En iyi uyumlamanin genligi = 2.19, ortalama degeri = 0.09, st.sapma = 1.52
Ödev 2 :Uzaklık Modülü Teslim Tarihi: 26 Nisan, Cuma
Yanda bir grup yıldız için görsel parlaklıkları ile mutlak parlaklıkları arasındaki farka karşılık uzaklıkları bir tablo halinde verilmiştir. Bu tablodan yararlanarak uzaklık modülünü (görsel parlaklık ile mutlak parlaklık arasındaki farkın uzaklığa ne şekilde bağlı olduğunu) gözlemsel (empirik) olarak bulunuz. Bu ifadeyi teorik uzaklık modeli ile karşılaştırınız. Bulduğunuz ifadeyi d= 20 pc uzaklığındaki bir yıldızın mutlak ve görsel parlaklıkları arasındaki farkı hesaplamak üzere kullanınız. Bulduğunuz değer üzerindeki bağıl hatayı hesaplayınız.
Not 1:. Sorunun Python programlama dilini kullanarak çözülmesi mecburidir!Not 2:. Nasıl bir fonksiyon aradığınıza ve onu nasıl ifade edeceğinize bağlı olarak linear uyumlama ya da logaritmik uyumlama yapmakta serbestsiniz.Not 3:. Programınız ekrana bulduğunuz ilişkinin parametreleri (a0,a1,korelasyon katsayisi, modelle gozlenen noktalar arasindaki farklarin kareleri toplami (Sr) ,standart hata) çıktısı vermelidir.Not 4: Sonuçta bulduğunuz eğriyi, gözlemsel noktaları ve d =20 pc için uyulamanızdan bulduğunuz değeri bir grafik üzerinde gösteriniz.
Yıldızm – M(kadir) d (pc)
Antares -6.15 170
Sirius 2.89 3
Castor -0.96 16
Pollux -0.08 10
Polaris -5.61 133
Vega 0.57 7
Deneb -8.18 430
Altair 1.45 5
Rigel -7.12 264
Betelgeuse -5.92 153
Kaynaklar
• Numerical Analysis Using Matlab and Excel 3rd ed., Steven T. Karris, Orchard Publications, 2007
• Numerical Methods for Engineers 6th ed., Steven C. Chapra, Raymond P. Canale, McGraw Hill, 2010
• Numerical Methods, Rao V. Dukkipati, New Age International, 2010