2. Hafta Lab-1: Analitik Çözüm - Normal Denklem

BGM 565: Siber Güvenlik için Makine Öğrenme Yöntemleri

İstanbul Şehir Üni. - Bilgi Güvenliği Müh.

Dr. Ferhat Özgür Çatak

Bu lab çalışmasında doğrusal regresyon probleminin analitik çözümünde kullanılan normal denklemi sentetik bir kümesine uygulayacağız.

import pandas as pd
import numpy as np

Pandas kütüphanesi kullanarak ds2.txt dosyası verikumesi degişkenine (dataframe) atanmaktadır.

# veri kumesini oku
verikumesi = pd.read_csv("ds2.txt",delimiter="\t")
verikumesi
x1 x2 x3 x4 y
0 0.54 0.17 0.93 0.58 3.74
1 0.85 0.35 0.84 0.45 4.55
2 0.97 0.74 0.44 0.30 5.24
3 0.62 0.68 0.67 0.98 5.92
4 0.59 0.88 0.09 0.89 5.75
5 0.66 0.83 0.92 0.82 6.43
6 0.64 0.04 0.82 0.84 3.91
7 0.85 0.83 0.95 0.07 5.31
8 0.74 0.16 0.71 0.57 3.89
9 0.32 0.33 0.13 0.59 3.02

$x_0$ değişkeni için sadece 1’lerden oluşan yeni sütun ekle. insert metodunun loc parametresine 0 yazılarak ilk kolona eklenecektir.

verikumesi.insert(loc=0, column='x0', value=1)
verikumesi
x0 x1 x2 x3 x4 y
0 1 0.54 0.17 0.93 0.58 3.74
1 1 0.85 0.35 0.84 0.45 4.55
2 1 0.97 0.74 0.44 0.30 5.24
3 1 0.62 0.68 0.67 0.98 5.92
4 1 0.59 0.88 0.09 0.89 5.75
5 1 0.66 0.83 0.92 0.82 6.43
6 1 0.64 0.04 0.82 0.84 3.91
7 1 0.85 0.83 0.95 0.07 5.31
8 1 0.74 0.16 0.71 0.57 3.89
9 1 0.32 0.33 0.13 0.59 3.02

Bu lab uygulamasında kullanılan sentetik veri kümesi 6 sütunlu olduğu için $X$ matrisine ilk 5 sütun, $y$ değişkenine ise 5. sütun atanacaktır.

X = verikumesi.iloc[:,:-1].values
y = verikumesi.iloc[:,X.shape[1]].values

Normal denklem $\mathbf{w} = (X^T X)^{-1}X^Ty$. Numpy kütüphanesi içinde yer alan matmul metodu ile matris çarpımı gerçekleştirilecektir.

np.dot (Vector dot product): $\mathbf{x} \cdot \mathbf{y} = |\mathbf{x}| \times |\mathbf{y}| \times cos(\theta)$ veya $\mathbf{x} \cdot \mathbf{y} = x_1 \times y_1 + x_2 \times y_2$

# Normal equation
tmp = np.linalg.inv(np.matmul(X.T,X))
w = np.dot(np.matmul(tmp,X.T),y)
w
array([0.12490622, 1.9516536 , 2.98882317, 0.97638019, 1.96358802])

Bu veri kümesi içi hipotez: $h(\mathbf{x}) = 0.12490622 + 1.9516536 \cdot x_1 + 2.98882317 \cdot x_2 + 0.97638019 \cdot x_3 + 1.96358802 \cdot x_4$. Hipotez kullanılarak $X$ verikümesinin çıktı değerleri tahmin ederek y_pred vektörüne atayalım. $h(\mathbf{x}) = \mathbf{x} \cdot \mathbf{w}$

y_pred = np.matmul(X,w.T)
df = pd.DataFrame({"y":y,"y_pred":y_pred})
df
y y_pred
0 3.74 3.733814
1 4.55 4.533674
2 5.24 5.248423
3 5.92 5.945822
4 5.75 5.742014
5 6.43 6.402133
6 3.91 3.943563
7 5.31 5.329547
8 3.89 3.859817
9 3.02 3.021193