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 |