Python ile Lineer Cebir – Ayrışımlar (2. Kısım)

SciPy modülünün linalg sınıfını incelemeye devam edip bugün ayrışımlar (decompositions) konusunda bildiklerimi elimden geldiğince açıklayacağım. Yanlışlarım olabilir şimdiden özür dilerim.

1. Özdeğer ve Özvektörler (Eigenvalues and Eigenvectors)

Ax=b denkleminde x vektörü üzerine A ile aynı etkiyi yapabilen bir skaler mevcutsa(ya da birden fazla) bu skalere özdeğer(eigenvalue) diyorduk. Özdeğerleri bulurken | işaretlerini determinant olarak alırsak uyguladığımız formül:

| A-lambda.I | = 0

idi. Burada lambdanın alacağı her değer bize özdeğerler kümesini oluşturan elemanları, yani özdeğerleri verir. Özdeğerlerin çarpımının determinantı, toplamının da matrisin izi(trace)ni verdiğini hatırlatarak devam edelim. Yukarıda verdiğimiz formülden elde edeceğimiz özdeğerler için özvektörleri bulurken de Ax=b mantığınının homojen lineer denklem sistemleri için olan versiyonu, yani Ax=0’ı uygun şekilde kullanacağız. Yani şöyle bir kullanım olacak:

lambda1 değerimiz 3 olsun.

(A-I.Lambda)*x=0 => (A-3)*x=0

burdaki çözümü istediğimiz yöntemle yaptığımızda (mesela Gauss yöntemi veya Gauss-Jordan İndirgenme yöntemi) her bir özdeğer için elde edeceğimiz vektörlere özvektörler deniz. Çözümü yaparken elde edeceğimiz bağımsız değişkenlere de uygun değerler vererek bu özvektörlerden 1 tane seçmemiz bir germe kümesi span oluşturmamız için bize yeterlidir.

Python ve SciPy modülü bizim için özdeğer ve özvektörleri bir kerede bulur. Özvektörleri bir matris halinde döndüreceğinden sütunlarına ayırıp kullanmamız gerekir. Şimdi bir örnek yapıp uygulamasını göreceğiz. Özdeğer ve özvektörleri bulurken linalg.eig(matrisdegiskeni) yapısını kullanacağız. Bu fonksiyonun bir demet(tuple) döndürdüğüne ve aldığımız değeri ayrıştırırken:

degisken1,degisken2 = demet

şeklinde olduğuna, yani demetin 2 öğeden oluştuğuna dikkat edelim. Örneğimizin kodlarını yazalım:

from scipy import linalg, mat # mat’ı matris tanımlamak için import ettik.

atamamızı bitirmiş olduk.

2. Tekil Değer Ayrışımı

SVD ayrışımı olarak da görebileceğimiz tekil değer ayrışımını yaparken bir matrisin 0’dan farklı özdeğerlerinin karekökleri(matrisin tekil değerleri) önemli bir işleve sahipti. Bunlardan oluşturduğumuz ve kalan kısımları 0 lar ile doldurduğumuzda sigmayı elde ediyorduk. Normalde bunun devamında da oldukça uzun işlemler sonucunda elde ettiğimiz SVD ayrışımını yaparken linalg.svd() ve linalg.diagsvd() fonksiyonunu kullanacağız. Bir A matrisi tanımlayarak svd ayrışımını bulalım ve elde ettiğimiz matrisleri çarparak A matrisini geri elde edelim. Bu arada SVD’nin Singular-Value Decomposition olduğunu da belirtmek ismin akılda kalması açısından faydalı olacaktır.

linalg.svd() fonksiyonu bize U ve Vhermityen matrisini sağlarken linalg.diagsvd() fonksiyonu sigma değerini bulmamızı sağlar. Diagsvd fonksiyonu 3 parametre kabul eder. Bunlardan birincisi A matrisinin tekil değerleri, ikinci ve üçüncüsü satır ve sütun sayılarıdır. Satır ve sütun sayılarını uygun şekilde alırken shape niteliğini kullanıyoruz.

Yukarıdaki kodu yazdığımızda 3×3 türündeki bir matriste (3L,3L) tipinde(demet) bir dönüş olacaktır. Bu demeti çözümleyerek diagsvd fonksiyonuna gönderirsek sigmayı elde etmiş oluruz.

Kodumuza bakacak olursak:

Kodları yazdırdığımızda aldığımız çıktı da ilk başta tanımladığımız A matrisine eşit olmalıdır. Şu şekilde bir çıktı almamız gerekiyor:

[[ 1.  2.  3.]
 [ 4.  5.  5.]
 [ 6.  7.  8.]]

Gerekli değişkenleri elde ettiğimize göre istediğimizi yazdırıp ayrışımın elemanlarını görebilir, gereken yerlerde kullanabiliriz.

3. LU Ayrışımı

Denklem sistemlerinin çözümünde sıkça kullanılan ve büyük kolaylıklar sağlayan, çözüm vektörüne hızla ulaşılmasını sağlayan ayrışımlardan olan LU ayrışımını da SciPy modülü ile elde etmemiz mümkün. Burada U‘nun üst üçgen ve L’nin alt üçgen olduğunu, ayrıca A’nın indirgenmesiyle U’nun elde edildiğini ve bu esnadaki elemanter matrislerin tersinin çarpımının L’yi verdiğini belirmeliyiz. Bir Ax=b lineer denklem sisteminde A = LU şeklinde yaptığımız bu ayrışımda A yerine elde ettiğimiz LU’yu koyacak olursak LUx = b elde edilmiş olur. Burada Ux değerine y dersek Ly = b gibi bir ifade elde ederiz ki L alt üçgen olduğundan y’yi, Ux = y ifadesinde de U üst üçgen olduğundan x çözüm vektörünü rahatlıkla bulabiliriz. Bu L ve U matrislerinin SciPy’de elde edilmesine gelirsek, kullanacağımız fonksiyon yine linalg sınıfının bir fonksiyonları olan linalg.lu_factor() ve linalg.lu_solve() olacaktır.  Bu fonksiyonların kullanımına gelecek olursak,  linalg.lu_factor() fonksiyonu ile elde ettiklerimizi linalg.lu_solve() fonksiyonunda Ax = b deki b ifadesi ile birlikte kullanacağız. Kodlarımıza bakacak olursak:

LU ayrışımında denklemleri direk olarak çözebildiğimize dikkat edelim. Bunların dışında, eğer ilk satırda pivot elemanından önce sıfır bulunuyorsa ilk satır altlara kayıyordu. Bu durumdaki yer değiştirmeyi P permütasyon matrisi ile belirliyoruz ve bu matris sayesinde  sorun çıkaran işlemlerden kurtuluyoruz. Permütasyon matrisini kullanmamız gerekli olursa A = Pt*L*U olarak ayrışır. Buradaki Pt, P matrisinin devriğini(transpozesini) temsil eder.

4. QR Ayrışımı

# Bu yazı devam edecektir.