R ile Matris Örnekleri
Bu bölümde, R yardımıyla matris alıştırmaları bulacaksınız
İlk olarak 6x2 yani 6 satırlı ve 2 sütunlu bir matris oluşturalım ve A matrisi diyelim.
A <- matrix(c(3,4,2,16,5,9,4,7,33,8,9,48),nrow=6)
A
## [,1] [,2]
## [1,] 3 4
## [2,] 4 7
## [3,] 2 33
## [4,] 16 8
## [5,] 5 9
## [6,] 9 48
Gördüğünüz gibi R, yazmış olduğunuz her rakamı yukardan aşağıya doğru sütunlara göre yazdı ve 6 tane nrow (satır) belirledi. Eğer nrow değilde ncol (sütun) belirtseydik de aynı sonuca ulaşırdır.
B<- matrix(c(3,4,2,16,5,9,4,7,33,8,9,48),ncol=2)
B
## [,1] [,2]
## [1,] 3 4
## [2,] 4 7
## [3,] 2 33
## [4,] 16 8
## [5,] 5 9
## [6,] 9 48
Saıyların yazılışını, satırlara göre sıralamak istersek byrow seçeneğini eklemeliyiz.
C<- matrix(c(3,4,2,16,5,9,4,7,33,8,9,48),ncol=2, byrow = T)
C
## [,1] [,2]
## [1,] 3 4
## [2,] 2 16
## [3,] 5 9
## [4,] 4 7
## [5,] 33 8
## [6,] 9 48
dim komutuyla matrisin boyutunu daha sonra değiştirebiliriz. Örneğin 6x2’lik A matrisini, 4x3 matrise çevirmek istersek
dim(A) <- c(4,3)
A
## [,1] [,2] [,3]
## [1,] 3 5 33
## [2,] 4 9 8
## [3,] 2 4 9
## [4,] 16 7 48
komutunu kullanabiliriz.
Bazen kullandığımız matrislerde çok fazla gözlem olabilir. Bu durumda matrisin boyutunu yine dim yardımıyla öğrenebiliriz.
dim(A)
## [1] 4 3
dim(B)
## [1] 6 2
Bir matrisin transpose’u t() yardımıyla alınır.
t(C)
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 3 2 5 4 33 9
## [2,] 4 16 9 7 8 48
Diyelim ki bir matriste sadece bir sütuna veya bir satıra ihtiyacınız var, bu durumda kareli parantez kullanırız. kareli parantezin virgülden önce yazılan kısmı satırlar, sonrası sütunlar içindir.
Mesala, A matrisinin ikinci satırını kullunmak isterseniz
A[2,]
## [1] 4 9 8
yazarsınız.
Eğer A matrisinin 3’ncü sütununu kullanmak isterseniz
A[,3]
## [1] 33 8 9 48
yazarsınız.
Diyelim ki matrisin sadece bir öğesini görmek istiyorsunuz, 2’nci satırı ve 3’ncü sütunu
A[2,3]
## [1] 8
sonucunu verecektir.
Örneğin bu rakamın 8 değilde 15 olması lazım, o zaman
A[2,3]<- 15
A
## [,1] [,2] [,3]
## [1,] 3 5 33
## [2,] 4 9 15
## [3,] 2 4 9
## [4,] 16 7 48
yazabilirsiniz.
Diyelim ki üç ayrı vektörünüz var
a<- c(3,2,3)
a
## [1] 3 2 3
b<- c(5,2,1)
b
## [1] 5 2 1
c<- c(2,2,4)
c
## [1] 2 2 4
Bu vektörlerden 3x3 bir matris oluşturabilirsiniz. Öncelikle bu matrisleri, bir matrisin sütunları yapmak isterseniz cbind fonksiyonu, satırları yapmak isterseniz rbind fonksiyonunu kullanabilirsiniz.
Sutunlu<- cbind(a,b,c)
Sutunlu
## a b c
## [1,] 3 5 2
## [2,] 2 2 2
## [3,] 3 1 4
Satirli<- rbind(a,b,c)
Satirli
## [,1] [,2] [,3]
## a 3 2 3
## b 5 2 1
## c 2 2 4
Bu iki matrisin determinantını det() yardımıyla bulabiliriz.
det(Sutunlu)
## [1] 2.664535e-15
det(Satirli)
## [1] 2.664535e-15
Satirli ve Sutunlu matrisler birbirlerinin transpose’u oldukları için determinantları da eşit.
Kare matrisin tersi solve() fonksiyonu ile bulunabilir.
B <- matrix( c(2, 4, 6, 0, 1, 12, 10, 12,0), nrow=3)
B
## [,1] [,2] [,3]
## [1,] 2 0 10
## [2,] 4 1 12
## [3,] 6 12 0
solve(B)
## [,1] [,2] [,3]
## [1,] -1.0909091 0.9090909 -0.07575758
## [2,] 0.5454545 -0.4545455 0.12121212
## [3,] 0.3181818 -0.1818182 0.01515152
3x3 bir birim matris oluşturmak için
C <- diag(1,nrow=3)
C
## [,1] [,2] [,3]
## [1,] 1 0 0
## [2,] 0 1 0
## [3,] 0 0 1
kullanılabilir.
İki matrisi çarpmak için ilk matrisin sütun sayısıyla, ikinci matrisin satır sayısı eşit olmak zorundadır. B matrisiyle 3 satırlı herhangi bir D matrisi çarpılabilir. A 4x3 lük bir matris olmasına rağmen, A’nın transposu 3x4’lük bir matristir.
D<-t(A)
B %*% D
## [,1] [,2] [,3] [,4]
## [1,] 336 158 94 512
## [2,] 413 205 120 647
## [3,] 78 132 60 180
ilk dersin ödevini çözmek için aşağıdaki formülü kullanabilirsiniz.
K<-matrix(c(3,2,0,1,0,1,2,1,3),nrow=3)
L<-matrix(c(11,5,11),nrow=3)
solve(K,L)
## [,1]
## [1,] 1
## [2,] 2
## [3,] 3
Matrislerle işlem yapma
sadece birlerden oluşmuş bir vektöre ihtiyacımız var. Bu vektöre i diyoruz.
Veci <- c(rep(1, 12))
Veci
## [1] 1 1 1 1 1 1 1 1 1 1 1 1
rep kaç tane 1’e ihtiyacımız varsa o kadar tekrarlayıp bize bir satırlık vektör oluşturacaktır. 12 tane birden oluşan bir vektör yarattık. 1 yerine istediğiniz rakamı da yazabilirsiniz.
Biz şimdilik işlemleri anlayabilmek için 3x3 matrislerle işlem yapıyoruz ve 3 satırlık bir vektöre ihtiyacımız var.
veci <- c(rep(1, 3))
i <- matrix(veci, nrow = 3)
i
## [,1]
## [1,] 1
## [2,] 1
## [3,] 1
i vektörü işlemlerde bize bazı kolaylıklar sağlar. Örneğin elimizde başka bir 3 satırlı 1 sütunlu vektör varsa,
Örneğin
k <- matrix( c(7, 9, 26), nrow = 3)
k
## [,1]
## [1,] 7
## [2,] 9
## [3,] 26
t(i) ve k’nın çarpımı bize k vektörünün elementlerinin toplamını (7 + 9 + 26 = 42) verir. i vektörü 3x1 bir matristir. i’nin transpozu 1x3 matris olur. k 3x1 bir matristir. $i^T k$ b’ze 1x1 bir sonuç verecektir. Arada kalan 3 sütun ve 3 satır çarpım koşuludur.
t(i) %*% k
## [,1]
## [1,] 42
i matrisi daha büyük boyutlu matrislerde de işimize yarayacaktır.
Burdan da anlaşılacağı üzere $i^T i$ toplam kaç tane satır bulunduğunu söyler. Bizim örneğimizde satır sayısı üçtür.
t(i) %*% i
## [,1]
## [1,] 3
$(i^T i)^{-1}$ bize $1/n$‘i verecektir.
solve(t(i) %*% i)
## [,1]
## [1,] 0.3333333
$i^T k$ sütunun toplamını veriyor, $(i^T i)^{-1}$ ise $1/n$‘i veriyor. Buna göre $(i^T i)^{-1}i^T k$ bize bu sütunun ortalamasını verecektir.
solve(t(i) %*% i) %*% t(i) %*% k
## [,1]
## [1,] 14
Biliyorsunuz ki varyansı veya kovaryansı bulmak için her bir öğeyi ortalamasından çıkartmamız gerekebilir. Bizim örneğimizde bu ortalamayı 3x1 matris şekinde yazmak istersek i matrisiyle çarpmamız yetecektir.
i %*% solve(t(i) %*% i) %*% t(i) %*% k
## [,1]
## [1,] 14
## [2,] 14
## [3,] 14
Bu matrisi k matrisimizden çıkarırsak $k - \bar{k}$‘yı her bir öğe için bulmuş oluruz.
k - i %*% solve(t(i) %*% i) %*% t(i) %*% k
## [,1]
## [1,] -7
## [2,] -5
## [3,] 12
Ama biliyoruz ki ortalamaların toplamı sıfırı verir. Bu matrisi $t(i)$ ile çarparsak bütün sütunun öğelerinin toplayacağı için sonucu 0 olarak verecektir.
t(i) %*% (k - i %*% solve(t(i) %*% i) %*% t(i) %*% k)
## [,1]
## [1,] 0
Bu özellik bize birşeyler daha öğretecek.
$$ i^T(k - i(i^T i)^{-1}i^T k) = 0 $$ $$ i^T(I_n - i(i^T i)^{-1}i^T) k= 0 $$ $i^T$‘u parantez içine dağıtalım.
$$ (i^T - i^Ti(i^T i)^{-1}i^T) k= 0 $$ $i^Ti(i^T i)^{-1}$ birbirleribi götüreceklerdir.
$$ (i^T - i^T) k= 0 $$ $$ (0) k= 0 $$
Bu parantez içinde kalan matrise özel bir isim verelim.
$$ M_0 = I_n - i(i^T i)^{-1}i^T $$ $M_0$ matrisi simetrik bir matrisdir.
$$ M_0 = M_0^T = I_n - i(i^T i)^{-1}i^T = (I_n - i(i^T i)^{-1}i^T)^T $$ $M_0$‘yu $M_0$ ile çarparsak $M_0$ buluruz. Dolayısıyla $M_0$ idempotent’dir.
$$ M_0 M_0 = (I_n - i(i^T i)^{-1}i^T) (I_n - i(i^T i)^{-1}i^T) $$ $$ = I_n - i(i^T i)^{-1}i^T - i(i^T i)^{-1}i^T + i(i^T i)^{-1}i^Ti(i^T i)^{-1}i^T $$ $$ = I_n - i(i^T i)^{-1}i^T - i(i^T i)^{-1}i^T + i(i^T i)^{-1}i^T $$ $$ = I_n - i(i^T i)^{-1}i^T = M_0 $$