Skip to main content

Lineer Cebir

Bu bölümde lineer cebirin temel yapıtaşları olan skalarlar, vektörler, matrisler ve tensörler üzerinde duracağız. Ayrıca, bu yapılar üzerinde yapılabilecek bazı temel işlemleri inceleyeceğiz.

İlk adım olarak, gerekli kütüphaneleri içe aktaralım:

from numpy import random
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import cv2

Veri Yapıları

Bu kısımda farklı veri yapılarını inceleyeceğiz.

Veri yapılarını gösteren bir örnek resim

Scalar

Skalar, tek bir sayısal değerdir ve herhangi bir yönü yoktur. Bu, matematiksel işlemlerde sıklıkla kullanılan en basit veri yapısıdır.

scalar = np.array([15])
print("scale boyutu",scalar.ndim)
print("scale:{0}".format(scalar))
print("scale %i"%scalar)

scale boyutu 1
scale:[15]
scale 15

Vector

Vektörler, büyüklük ve yön içeren ve bir dizi şeklinde ifade edilebilen yapılar olarak tanımlanır.

array1 = np.array([1,2,3,4,5],ndmin=2)
array1

array([[1, 2, 3, 4, 5]])

array1.reshape(5,1)

array([[1],
[2],
[3],
[4],
[5]])

array1.shape

(1, 5)

print(f"Type,'Tip': {type(array1)}")
print(f"Shape,'Biçim': {array1.shape}")
print(f"Dimension,'Boyut': {array1.ndim}")

Type,'Tip': <class 'numpy.ndarray'>
Shape,'Biçim': (1, 5)
Dimension,'Boyut': 2

Matrix

Matrisler, iki boyutlu dizilerdir ve lineer cebirde sıkça kullanılırlar.

array2 = np.array([[1,2,3,4],
[5,6,7,8]])
array2

array([[1, 2, 3, 4],
[5, 6, 7, 8]])

print(f"Type,'Tip': {type(array2)}")
print(f"Shape,'Biçim': {array2.shape}")
print(f"Dimension,'Boyut': {array2.ndim}")

Type,'Tip': <class 'numpy.ndarray'>
Shape,'Biçim': (2, 4)
Dimension,'Boyut': 2

Tensor

Tensörler, genellikle görüntü işlemede kullanılan üç veya daha fazla boyutlu dizilerdir.

img = cv2.imread("ML.png",cv2.IMREAD_GRAYSCALE)
plt.imshow(img,cmap="gray")
print(f"Type,'Tip': {type(img)}")
print(f"Shape,'Biçim': {img.shape}")
print(f"Dimension,'Boyut': {img.ndim}")

Type,'Tip': <class 'numpy.ndarray'>
Shape,'Biçim': (600, 1000)
Dimension,'Boyut': 2

Tensör örneği

Diğer bazı temel tensör işlemleri:

np.zeros((3,3))

array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])

np.ones((3,3))

array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])

np.eye(3)

array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])

print(f"2 sayı arasında belirtildiği aralık ile adımlar ile yaklaşılması: {np.arange(2,15,2)}\n"
f"2 sayı arasında belirtilen adım sayısı kadar yaklaşılması: {np.linspace(2, 5, 5)}\n"
f"2 sayı aralığında belirtilen boyutta rastgele bir matris oluştur: \n {np.random.randint(10, 100, size= (3,3))}\n")

2 sayı arasında belirtildiği aralık ile adımlar ile yaklaşılması: [ 2 4 6 8 10 12 14]
2 sayı arasında belirtilen adım sayısı kadar yaklaşılması: [2. 2.75 3.5 4.25 5. ]
2 sayı aralığında belirtilen boyutta rastgele bir matris oluştur:
[[98 12 77][74 69 99]
[31 95 76]]

Matris İşlemleri

Matrisler, lineer cebirde temel yapıtaşlarından biridir ve çeşitli matematiksel işlemler için kullanılırlar. Bu bölümde, matris toplama, çıkarma, çarpma ve bölme işlemleri üzerinde duracağız.

Toplama ve Çıkarma İşlemi

Matris toplama ve çıkarma işlemleri, sadece aynı boyutlara sahip matrisler için tanımlanır. Bu işlemler sırasında, matrislerin karşılıklı elemanları toplanır veya çıkarılır ve sonuç yeni bir matris şeklinde oluşturulur.

Matris toplama ve çıkarma örneği

A_matrix = np.random.randint(5,10,size=(5,5))
B_matrix = np.random.randint(4,12,size=(5,5))
A_matrix

array([[9, 8, 5, 5, 6],
[8, 7, 5, 5, 5],
[5, 9, 9, 9, 8],
[5, 9, 5, 5, 9],
[6, 6, 9, 5, 9]])

B_matrix

array([[11, 8, 7, 7, 7],
[10, 4, 5, 8, 10],
[6, 4, 8, 6, 8],
[8, 9, 4, 5, 9],
[8, 5, 4, 6, 4]])

addition_matrix = A_matrix + B_matrix
subtriction_matrix = A_matrix - B_matrix
print(f"toplama işlemi: \n{addition_matrix}\n"
f"#################\n"
f"çıkarma işlemi: \n{subtriction_matrix}")

toplama işlemi:
[[20 16 12 12 13][18 11 10 13 15]
[11 13 17 15 16][13 18 9 10 18]
[14 11 13 11 13]]
#################
çıkarma işlemi:
[[-2 0 -2 -2 -1][-2 3 0 -3 -5]
[-1 5 1 3 0][-3 0 1 0 0]
[-2 1 5 -1 5]]

Çarpma ve Bölme İşlemi

Skaler Çarpım

Skaler çarpım, iki matrisin karşılıklı elemanlarının çarpılması ile elde edilir. Bu işlem sonucu, orijinal matrislerin boyutları korunur.

Skaler çarpım örneği

multip = A_matrix * B_matrix
multip

array([[99, 64, 35, 35, 42],
[80, 28, 25, 40, 50],
[30, 36, 72, 54, 64],
[40, 81, 20, 25, 81],
[48, 30, 36, 30, 36]])

multip1 = B_matrix * A_matrix
multip1

array([[99, 64, 35, 35, 42],
[80, 28, 25, 40, 50],
[30, 36, 72, 54, 64],
[40, 81, 20, 25, 81],
[48, 30, 36, 30, 36]])

Vektörel Çarpım (Dot

Product)

Vektörel çarpım, iki matrisin satır ve sütunlarının çarpımlarının toplamı ile elde edilen yeni bir matris oluşturur. Bu işlem için ilk matrisin sütun sayısı ile ikinci matrisin satır sayısının eşit olması gerekir.

Vektörel çarpım örneği

A_matrix.shape

(5, 5)

B_matrix.shape

(5, 5)

dot_product = A_matrix.dot(B_matrix)
dot_product

array([[297, 199, 187, 218, 252],
[268, 182, 171, 197, 231],
[335, 233, 220, 254, 310],
[287, 186, 176, 216, 246],
[292, 198, 200, 223, 255]])

Matris çarpma işlemleri, lineer cebirde önemli bir yer tutar ve çeşitli matematiksel ve fiziksel problemlerin çözümünde kullanılır. Özellikle sistem denklemlerinin çözümleri, matris çarpımı ile elde edilebilir.

Matrislerde Çarpma İşleminin Özellikleri:

Matris çarpımı, belirli kurallara göre gerçekleştirilen bir işlemdir. Aşağıda, matris çarpma işleminin bazı temel özellikleri verilmiştir:

  1. Değişme Özelliği Yoktur: Matris çarpımı, genelde değişken değildir. Yani, A ve B matrisleri için, genellikle A.B ≠ B.A olur.
  2. Dağılma Özelliği: A, B ve C matrisleri için, A(B+C) = A.B + A.C eşitliği geçerlidir.
  3. Birleşme Özelliği: A(B.C) = (A.B)C eşitliği her zaman sağlanır.
  4. Birim Matris ile Çarpım: Herhangi bir A matrisi için, A.I = I.A = A eşitliği geçerlidir. Burada I, birim matristir.

Bölme İşlemi

Matris bölmesi, genellikle bir matrisin diğer matrisin tersi ile çarpımı şeklinde tanımlanır. Ancak matrisler arasında doğrudan bir bölme işlemi tanımlı değildir; bunun yerine bir matrisin tersinin alınması ve bu ters matris ile çarpım yapılması gerekir.

Matris bölme işlemi

Bir Matrisin Transpozu

Matrisin transpozu, matrisin satırları ile sütunlarının yer değiştirmesiyle elde edilen yeni bir matristir. mxn boyutundaki bir A matrisinin transpozu ( A^T ) şeklinde gösterilir ve boyutu nxm olur.

Matrisin transpozu

Orj_matris = np.array([[3,5,10,4,1],
[4,2,8,4,2],
[8,12,16,4,5]])
Tran_matris = np.transpose(Orj_matris)
print(f"Orjinal matris: \n{Orj_matris}\n"
f"Orjinal matris boyutu: {Orj_matris.shape}\n"
f"Transpoze matris: \n{Tran_matris}\n"
f"Transpoze matris boyutu: {Tran_matris.shape}")

Orjinal matris:
[[ 3 5 10 4 1][ 4 2 8 4 2]
[ 8 12 16 4 5]]
Orjinal matris boyutu: (3, 5)
Transpoze matris:
[[ 3 4 8][ 5 2 12]
[10 8 16][ 4 4 4]
[ 1 2 5]]
Transpoze matris boyutu: (5, 3)

İnverse Matris (Bir matrisin tersini alma)

Bir matrisin tersi, o matrisle çarpıldığında birim matrisi (identity matrix) veren matristir. Her matrisin tersi bulunmaz; sadece kare matrislerin ve determinantı sıfır olmayan matrislerin tersi alınabilir.

Birim matris, Matris ve ters matris

Bir matrisin tersini almak, özellikle sistem denklemlerinin çözümünde önemlidir.

matrix_1 = np.array(np.ones((2,2))*np.random.randint(5,100,size=(2,2)))
matrix_1

array([[87., 14.],
[25., 26.]])

matrix_2 = np.array(np.ones((3,3))*np.random.randint(5,100,size=(3,3)))
matrix_2

array([[96., 83.,94.],
[61., 24., 92.],
[37., 15., 40.]])

invers_1 = np.linalg.inv(matrix_1)
invers_1

array([[ 0.01359833, -0.00732218],
[-0.01307531, 0.04550209]])

invers_2 = np.linalg.inv(matrix_2)
invers_2

array([[-0.00994554, -0.04522851, 0.12739758],
[ 0.02282737, 0.00857211, -0.07336017],
[ 0.00063936, 0.03862183, -0.0653327 ]])

Birim Matris Elde Edebilecek miyiz??

Identity_1 = matrix_1.dot(invers_1)
Identity_1

array([[1.00000000e+00, 0.00000000e+00],
[5.55111512e-17, 1.00000000e+00]])

Identity_2 = np.dot(matrix_2,invers_2)
Identity_2

array([[ 1.00000000e+00, -6.10622664e-16, 1.11022302e-15],
[-1.55691432e-16, 1.00000000e+00, 1.33226763e-15],
[-1.01481323e-16, -2.22044605e-16, 1.00000000e+00]])

Bu kısımda, matrislerin temel işlemleri, özellikle ters ve transpoze alma gibi işlemler üzerinde durduk. Bu işlemler, matrislerle yapılan daha karmaşık hesaplamaların temelini oluşturur.