5

Şubat
2012

Python ile Lineer Cebir (SciPy Kullanarak)

Yazar: Gur@y  |  Kategori: Python  |  Yorum: Yok   |  560 görüntüleme

Numpy üzerine inşaa edilmiş olan scipy modülü lineer cebir konusunda bize birçok fonksiyon ve imkan sağlıyor. Özellikle matris tersleri, ayrışımlar ve denklem çözümlerini bulacağımız sınıfın adı ise scipy.linalg. Matris tanımlamayı anlatarak işe başlayalım.

1. Python’da Matris Tanımlama ve Temel Matris İşlemleri

Python’da matris tanımlamak için scipy içinde bulunan mat modülünü import etmemiz gerekir. Import işlemini gerçekleştirip sonra matris tanımlamaya devam edelim.

Kendi kaynağında yazdığına göre “matrix”in kısaltılmışı olarak mat kullanılıyormuş. Şimdi matrisimizi tanımlayalım. Bu şekilde yaptığımız bir import işlemi bize tanımlamada sadece mat ifadesini kullanma imkanı sağlar. Örnek olarak 3×3′lük bir A matrisi tanımlayalım:

Matris tanımlamamız burda bitti. Aslına bakarsak parantez ve tırnaklar dışında matlab ile aralarında bir fark yok. Şimdi bu matris üzerinde birkaç işlem yapalım.

Son işlemi yaptığımızda aldığımız çıktı:

matrix([[-1323641347, 1188523678, -562824162],
[ 297060756, 657153947, 49455326],
[-1170646356, 1814223194, -2120650911]])

olur. Baştaki matrix ibaresinden rahatsız olursak

diyerek bundan kurtulabiliriz. Matris üzerinde gördüğümüz gibi istediğimiz işlemi yapabiliyoruz. Şimdi de matrisin tersini alalım. Beklenilenin aksine aslında oldukça kolay bir işlem:

Verdiği çıktı ise:

[[-1. -1. 1. ]
[ 0.4 2. -1.4]
[ 0.4 -1. 0.6]]

şeklinde olur. Kontrol etmek için A ile A’nın tersini çarpıp I’ya eşit mi diye kontrol edelim.

Aldığımız çıktı biraz farklı görünse de birim matrise eşittir. Matris tersini alırken scipy.linalg sınıfını kullanabiliriz. Bu sınıftaki inv() fonksiyonu işimizi görecektir. Bunu da bir örnekle gösterelim:

1. satırda gerekli sınıfı aldık ve 2. satırda tersmatris adlı değişkene A’nın tersini atadık. Yukarıda bulduğumuz B ile aynı olduğuna da dikkat edelim.

Not: Burada istediğimiz iki matrisi * işareti ile çarpabileceğimizi de görmüş olduk.

2. Python ile Lineer Denklem Sistemi Çözümü

Ax=b şeklindeki bir lineer denklem sistemini çözmek için aslında yukarıda öğrendiğimiz ters matrisi kullanmak oldukça işe yarayan bir yöntemdir. Ters matrisin olmadığı yerlerde ayrışımları kullanacağız. Onları da yazının devamında göreceğiz. Ancak şu an bir lineer denklem sistemini çözdürmek için uygulayabileceğimiz yöntem yukarıda gördüğümüz linalg sınıfının solve fonksiyonu. Bu fonksiyon 2 parametre alıyor. Ax=b lineer denklem sisteminde linalg.solve(A,b) dememiz bize x vektörünün verilmesi için aslında yeterli. Şu şekilde bir lineer denklem sistemi tanımlayalım ve çözelim:

x + 2y + 3z = 6

4x + 5y + 5z = 5

6x + 7y + 8z = 13

Bu denklem sistemini Ax=b şeklinde yazmak istersek A ve b matrisleri:

A = [1 2 3; 4 5 5; 6 7 8] ve b = [6;5;13] olarak elde edilir. Burda “;” lerin satır ayracı olduğunu belirtmekte fayda var. Şimdi bu tanımlamaları Python’a yapalım:

Bu bölümün başında belirttiğimiz gibi kullanacağımız fonksiyon linalg.solve(). Zaten artık işimiz bitti sayılır:

from scipy import linalg

Verdiği çıktı da deklem sisteminin çözümü olan [[ 2. ],[-5.8], [ 5.2]] ifadesi, yani x vektörü. Bundan dönen ifadenin türünün bir dizi, yani array olduğuna dikkat edelim. Benim henüz işime yaramasa da eminim birilerinin işine yarayacaktır.

Yukarıda yaptıklarımızı bu kadar uzatmadan, bölümün başında belirttiğimiz tersini alma yoluyla da bulabiliriz. B’yi A’nın tersi olarak tanımlarsak( B=inv(A) ), A’nın tersini 1. bölümde gördüğümüz üzere A.I ile bulabiliyorduk. O zaman Ax=b’de her tarafı B ile çarparsak:

B*Ax = B*b ifadesini elde ederiz. B*A ifadesi birim matrise eşit olduğundan(yukarıda çarpıp kontrol etmiştik.) solda sadece x çözüm vektörü kalacaktır. Sağ tarafa matris çarpımı uyguladığımızda cevabı alırız. Bunu koda dökersek:

Aldığımız çıktı ise yine

matrix([[ 2. ],
[-5.8],
[ 5.2]])

ifadesi olur. Farkın öncekinde dönen sonucun türünün dizi, burda matris olduğuna dikkat edelim.

3. Python ile Determinant ve Norm Hesabı (SciPy kullanarak)

SciPy ile determinant hesaplamak için yine linalg sınıfının bir fonksiyonu olan det fonksiyonunu kullanacağız. Determinantın nasıl hesaplandığıyla ilgili kısa bir hatırlatma SciPy’nin kendi sayfasında bu kısımda yapılmış(kofaktörler yardımıyla). Kısa ve güzel bir anlatım incelemenizi tavsiye ederim. Lafı daha fazla uzatmadan bir determinant hesaplayalım. Bunun için her zaman olduğu gibi bir matrise ihtiyacımız olacak.

Şimdi de determinantı hesaplamak için linalg.det(degisken) ifadesinden yararlanacağız.

Aldığımız sonuç: -5. İsterseniz Sarrus kuralıyla kendiniz de kısa birkaç işlem yaparak sonucu kontrol edebilirsiniz.

Matrisin normunu hesaplarken de SciPy modülünün linalg.norm özelliğini kullanacağız. Yukarıda halihazırda tanımladığımız A matrisinin normunu hesaplayalım:

Çalıştırdığımızda aldığımız sonuç: 15.1327459504

4. SciPy ve Python ile Matrislerin LS (En Küçük Kareler, Last Squares) Çözümlerinin Bulunması

Ax=b lineer denklem sisteminde yukarıda yaptığımız çözümleri uygularken A matrisinin tersinin olduğunu varsaymıştık. Eğer A matrisinin tersi yoksa o çözümler geçersiz olacağından en iyi yaklaşık çözümü bulmamız gerekir. Bunun için matrisin LS ayrışımını ya da genelleştirilmiş tersini kullanırız. (Genelleştirilmiş ters: A+ = (A**t*A)**-1*A). Konuyla ilgili olanlar için LS çözümünün nasıl bulunacağı yine SciPy’nin sitesinde burada özetlenmiş. Şimdi LS çözümünün nasıl bulunacağını görelim:

A matrisinin en küçük kareler çözümünü ne zaman uygulanacağını da neden bu matrisi seçtiğimi belirterek açıklamaya çalışayım. Daha önceki örneklerde tanımladığımız A matrisinin determinantı sıfırdan farklıydı ve dolayısıyla tersi alınabiliyordu. Böyle bir durumda denklem sistemini zaten çözebildiğimiz için ek bir işleme gerek kalmıyordu. Ancak burda tanımladığımız matrisin ilk iki satırını orantılı seçtik ve determinantının 0 olmasını, çözümünün olmamasını sağladık. Sonra da en yakın çözümü en küçük kareler yöntemini uygulayarak bulduk. Daha bilimsel bir ifadesini yukarıda verdiğim linkte grafiğiyle beraber bulabilirsiniz.

En son tanımladığımız A matrisinin genelleştirimiş tersini bulmak için de linalg.pinv(degisken) ve linalg.pinv2(degisken) yapıları işimizi görür. İlk fonksiyon en küçük kareler yöntemi ile genelleştirilmiş ters bulma işini görürken ikinci fonksiyon tekil değerleri kullanarak genelleştirilmiş ters bulma işlemini gerçekleştiriyor. Verdikleri sonuçlar ise aynı.

Yazının 2. kısmı için tıklayınız.

Facebook FriendFeed Twitter RSS Beslemesi
sponsor reklamlar

125x125 Reklam 125x125 Reklam 125x125 Reklam 125x125 Reklam

© Tüm Hakları Saklıdır - Güray YILDIRIM | Blog
Tüm içerik lisansı:
Creative Commons Lisansı

Wordpress wordpress tema alexa bilgilerim Webmaster Creative Commons v3 ile Lisanslanmıştır!