6
6
Regresi Linier
Pasangan data {xi, yi} dengan i = 1, .., N dapat dimodelkan secara linier dengan
berbagai cara, seperti grafik melalui pertimbangan visual (sembarang, sentroid atau
melalui suatu titik tertentu), atau dengan regresi linier [1] melalui metode kuadrat
terkecil [2].
(1)
agar sebanyak mungkin melewati pasangan data {xi, yi} dengan i = 1, .., N dapat
dilakukan secara visual yang umummnya dilakukan dengan terlebih dahulu
menggambarkan titik-titik data menggunakan kertas grafik, lalu menggambarkan suatu
persamaan garis secara subyektif. Persamaan garis yang baik adalah yang sebanyak
mungkin melewati titik-titik data.
Dapat pula didefinisikan suatu titik acuan (xo, yo) yang merupakan titik sembarang
tetapi memiliki makna fisis, ataupun nilai ini merupakan titik rata-rata data
x avg =
y avg =
1
N
1
N
(2)
(3)
i =1
N
i =1
Titik origin (0, 0) dapat pula merupakan kandidat dari titik (xo, yo) yang harus dilewati
Persaman (1).
2 Kuadrat terkecil
Kesalahan pemodelan dari Persamaan (1) terhadap suatu data (xi, yi) dapat dirumuskan
dalam bentuk
i = [ y i (c0 + c1 xi )]2 ,
(4)
di mana bentuk kuadrat dipilih agar memastikan nilai i yang berharga positif tidak
saling berkompensai dengan nilai i yang berharga negatif, yang akan terjadi bila bukan
1
= i .
(5)
i =1
=0
c 0
(6)
= 0.
c1
(7)
dan
(y
c 0 c1 x i ) = 0 ,
(8)
i =1
(x y
c 0 xi c1 xi2 = 0 .
(9)
i =1
Persamaan (8) dan (9) tak lain adalah persamaan dengan dua konstanta yang tidak
diketahui, yaitu c0 dan c1. Dengan melakukan substitusi maka nilai kedua konstanta
tersebut, sebagai fungsi dari {xi, yi} dengan i = 1, .., N, dapat diperoleh.
Persamaan (8) dapat dituliskan kembali menjadi
N
y
i =1
c 0 N c1 xi = 0 ,
(10)
i =1
x y
i
i =1
i =1
i =1
c0 xi c1 xi2 = 0 .
(11)
Temukan rumusan c0 dari Persamaan (10) dan substitusikan ke dalam Persamaan (11)
sehingga diperoleh
x y
i
i =1
N
c1 =
x y
i =1
N
x x
i
i =1
i =1
N
i =1
(12)
2
i
i =1
c0 =
x x y x y
i
i =1
2
i
i =1
i =1
x x
i
i =1
i =1
i =1
(13)
2
i
i =1
Persamaan (12) dan (13) merupakan persamaan untuk menentukan c0 dan c1. Selain itu
didefinisikan pula
N
)(
(14.a)
)(
(14.a)
)(
(14.a)
SS xy = xi x avg y i y avg ,
i =1
N
SS xx = xi x avg xi x avg ,
i =1
N
SS yy = y i y avg y i y avg ,
i =1
SS 2xy
SS xx SS yy
(15)
N
R2 =
i =1
N
N xi2
i =1
x y x y
i
i =1
2
N
x i N
i =1
i =1
i =1
2
N
y y i
i =1
2
i
3 Algoritma
Algoritma untuk penentuan c0, c1, dan R2 adalah sebagai berikut ini
Algoritma regresi linier
L1. (x1, y1), .., (xN, yN)?
L2. Sx = 0, Sy = 0, Sxy = 0, Sxx = 0
(16)
L3. i = 1
L4. Sx = Sx + xi, Sy = Sy + yi, Sxy = Sxy + xiyi, Sxx = Sxx + xi2
L5. i N L8
L6. i = i + 1
L7. L4
L8. c0 = (Sx Sxy Sxx Sy) / (Sx2 N Sxx), c1 = (Sx Sy N Sxy) / (Sx2 N Sxx), xavg = Sx /N, yavg = Sy /N
L9. SSxx = 0, SSyy = 0, SSxy = 0
L10. i = 1
2
2
L11. SSxx = SSxx + (xi xavg) , SSyy = SSyy + (yi yavg) , SSxy = SSxy + (xi xavg)(yi yavg),
L12. i N L15
L13. i = i + 1
L14. L11
L15. R2 = SSxy2 / (SSxx SSyy)
L16. ?c0, c1, R2
Langkah-langkah L1, L2, L4, L8, L9, L11, dan L16 dapat dijabarkan dalam beberapa langkah
apabila dirasakan terlalu kompleks, misalnya untuk langkah L16 dapat dijabarkan dalam tiga
baris, di mana masing-masing baris hanya menampilkan c0, c1, dan R2 sebagai keluaran.
Penggabungan langkah-langkah dalam satu baris untuk mereduksi jumlah baris dalam algoritma.
#include <cmath>
using namespace std;
string strval(int, int[]);
int main(int argc, char *argv[]) {
// Set content of, calculate size of, and show x and y
int x[] = {1, 2, 3, 4, 5};
int y[] = {3, 5, 7, 9, 10};
int N = sizeof(x) / sizeof(int);
cout << strval(N, x) << endl;
cout << strval(N, y) << endl;
// Define Sx, Sy, Sxx, Sxy and calculate them
double Sx = 0, Sy = 0, Sxx = 0, Sxy = 0;
for(int i = 0; i < N; i++) {
Sx += x[i];
Sy += y[i];
Sxy += (x[i] * y[i]);
Sxx += (x[i] * x[i]);
}
// Calculate c0 and c1
double c0 = (Sx * Sxy - Sxx * Sy) / (Sx * Sx - N * Sxx);
double c1 = (Sx * Sy - N * Sxy) / (Sx * Sx - N * Sxx);
// Calculate xavg and yavg
double xavg = Sx / N;
double yavg = Sy / N;
// Define SSxx, SSyy, Sxy, and calculate them
double SSxx = 0, SSyy = 0, SSxy = 0;
for(int i = 0; i < N; i++) {
SSxx += (x[i] - xavg)*(x[i] - xavg);
SSyy += (y[i] - yavg)*(y[i] - yavg);
SSxy += (x[i] - xavg)*(y[i] - yavg);
}
// Calculate R2
double R2 = SSxy * SSxy / (SSxx * SSyy);
// Show
cout <<
cout <<
cout <<
results
c0 << "\t";
c1 << "\t";
R2 << endl;
}
// Display content of int array
string strval(int N, int z[]) {
stringstream ss;
for(int i = 0; i < N; i++) {
ss << z[i];
if(i < N - 1) {
ss << "\t";
}
}
return ss.str();
}
3
4
7
9
0.987805
5
10
di mana baris pertama merupakan {x}, baris kedua {y}, dan baris ketiga merupakan c0,
c1, dan R2. Sebagai konfirmasi data yang sama digunakan dalam Microsoft Excel dan
dilakukan fitting dengan opsi trendline linier, yang hasilnya diberikan dalam Gambar 1.
12
10
8
y
6
y = 1.8x + 1.4
R = 0.987
4
2
0
0
Hasil yang diperoleh dari program linreg sama dengan hasil yang diperoleh
menggunakan aplikasi spreadsheet yang telah umum digunakan. Dengan demikian baik
algoritma maupun program yang dibuat untuk saat ini telah memberikan hasil yang
benar.
(17)
,
ci
(18)
j merupakan indeks iterasi, i = 0, 1, dan merupakan suatu kontanta yang bernilai kecil.
Untuk itu, diperlukan kedua ungkapan berikut
N
= 2 [ yi c0 c1 xi ] ,
c0
i =1
(19)
= 2
xi y i c 0 xi c1 x i2 .
c1
i =1
(20)
Substitusi Persaman (19) dan (20) ke Persaman (17) sehingga dapat diperoleh
c 0j +1 = c 0j + 2
[y
c 0 c1 xi ] ,
c 0 xi c1 xi2 ,
(21)
i =1
c1j +1 = c1j + 2
[x y
N
(22)
i =1
yang terus menerus dilakukan sampai Persamaan (5) memberikan nilai cukup kecil bila
tidak bisa nol. Untuk itu diperlukan tebakan awal c00 dan c10.
Algoritma regresi linier dengan gradient descent
L1. (x1, y1), .., (xN, yN)?
L2. c00, c10?
L3. , eps, jmax?
L4. j = 1
L5. c0 = 0, c1 = 0
L6. i = 1
L7. c0 = c0 + 2 (yi c0j-1 c1j-1 xi)
L8. c1 = c1 + 2 (xi yi c0j-1 xi c1j-1 xi2)
L9. i = i + 1
L10. i < N + 1 L7
L11. c0 = c0 + c0
L12. c1 = c1 + c1
L13. = 0
L14. i = 1
2
L15. = + (yi c0 c1 xi)
L16. i = i + 1
L17. i < N + 1 L15
L18. j =
L19. j = j + 1
L20. j < 3 L5
L21. = j-1 j-2
L22. > eps j < jmax L5
L23. Sx = 0, Sy = 0
L24. i = 1
L25. Sx = Sx + xi, Sy = Sy + yi
L26. i = i + 1
L27. i < N + 1 L25
L28. xavg = Sx / N, yavg = Sy / N
L29. SSxx = 0, SSyy = 0, SSxy = 0
L30. i = 1
2
2
L31. SSxx = SSxx + (xi xavg) , SSyy = SSyy + (yi yavg) , SSxy = SSxy + (xi xavg)(yi yavg),
L32. i = i + 1
L33. i < N + 1 L31
L34. c0 = c0j-1, c1 = c1j-1
L35. R2 = SSxy2 / (SSxx SSyy)
L36. ?j, c0, c1, R2
Terdapat hal menarik di sini, bahwa langkah L31 hanya bergantung dari data {xi, yi} dan
tidak bergantung dari c0 dan c1 yang diperoleh secara numerik. Untuk ke depan
diperlukan rumusan R2 yang bergantung c0 dan c1 yang diperoleh sehingga nilai R2 dapat
menjadi kriteria penghentian program.
Keluaran dari program dalam Kode 2 bergantung dari jumlah iterasi yang digunakan,
misalnya
$ ./linreg-gd
1
2
3
4
5
3
5
7
9
10
200
1.39443 1.80154 0.987805
dan
$ ./linreg-gd
1
2
3
500
5
7
9
10
1.39997 1.80001 0.987805
untuk 200 dan 500 iterasi. Nilai c0 = 1.4 dan c1 = 1.8 dapat diperoleh saat jmax > 611.
Kode 2. Program regresi linier dengan gradient descent.
/*
linreg-gd.cpp
Linear regression using gradient descent
Sparisoma Viridi | dudung@gmail.com
Compile: g++ linreg-gd.cpp -o linreg-gd
Execute: ./linreg-gd
20160904
Create this program.
*/
#include
#include
#include
#include
<iostream>
<sstream>
<cstring>
<cmath>
10
results
j << "\t";
c0 << "\t";
c1 << "\t";
R2 << endl;
11
Untuk data x = {1, 2, 3, 4, 5}, y = {3, 5, 7, 9, 11}, = 0.01, jmax = 1000, eps = 10-12
diperoleh hasil berikut
$ ./linreg-gd
1
2
3
5
729
1
3
7
2
4
9
1
5
11
sebagaimana diharapkan. Hasil terakhir merupakan tes bila masih dapat mencapai
nilai nol sehingga diperlukan nilai eps yang cukup kecil. Bila kondisi ini tidak dapat
tercapai jmax akan berperan untuk menghentikan iterasi.
2.002
2
1.998
1.996
c 1 1.994
1.992
1.99
1.988
1.986
0.99
1.01
1.02
1.03
1.04
1.05
c0
Gambar 2. Perubahan nilai c0 dan c1 untuk x = {1, 2, 3, 4, 5}, y = {3, 5, 7, 9, 11}, = 0.01, dan
-12
eps = 10 , serta jmax = 100 + 50n, n = 0, .., 11.
12
Perubahan nilai c0 dan c1 dengan bertambahnya j dapat dilihat dalam Gambar 2, yang
umumnya tidak harus linier.
6 Regresi polinomial
Dalam statistik salah satu bentuk regresi linier bilamana hubungan antara variabel
bebas x dan variabel tidak bebas y dimodelkan dalam bentuk polinomial berderajat M,
M
y = cm x m ,
(23)
m=0
disebut sebagai regresi polinomial [5]. Untuk model dengan N = 1 telah diperoleh
sebelumnya dua persamaan dalam c0 dan c1, yaitu Persamaan (10) dan (11) yang dapat
dituliskan kembali dalam bentuk matriks sebagai berikut
N
1
Ni =1
x
i
i =1
yi
0
i =1
= Ni =1
,
N
2 c1
xi
xi y i
i =1
i =1
N
x c
i
(24)
N = 1 .
(25)
i =1
2
xi
i =1
M
N
xM
i
i =1
i =1
N
2
i
i =1
N
x
i =1
N
3
i
i =1
3
i
4
i
M
M +1
i
x
i =1
x
i =1
N
x
i =1
N
i =1
i =1
N
i =1
2
i
M +1
i
M +2
i
i =1
O
M +2
i
M
i
M
N
x
i =1
2M
i
N
c0 yi
Ni =1
c1 xi yi
= iN=1
c2 xi2 yi
i =1
M
M
N
cM xiM yi
i =1
(26)
yang telah ditunjukkan sebelumnya [6]. Persamaan (26) tidak dapat dengan mudah
diselesaikan dengan cara sebelumnya sehingga dapat memperoleh Persamaan (12) dan
(13), melainkan memerlukan cara lain. Persamaan (26) tak lain merupakan kumpulan
persamaan linier yang dituliskan dalam bentuk matriks, di mana salah satu penyelesaiannya adalah dengan menggunakan eliminasi Gauss [7]. Detil mengenai penyelesaian
persamaan linier ini akan dibahas dalam bagian lain
13
7 Pertanyaan
1. Tunjukkan bagaimana Persamaan (15) dapat diubah menjadi Persamaan (16)!
2. Ubahkan program dalam Kode 1 sehingga dapat membaca masukan dari file yang
isinya setiap baris merupakan pasangan data {xi, yi} seperti
# x
1
2
3
4
5
y
2.1
3.9
6
8.1
9.9
8 Rujukan
1. Wikipedia-Autoren, "Lineare Regression", Wikipedia, Die freie Enzyklopdie,
de:157575928, 1 Sep 2016 | 15:10.
2. Wikipedia contributors, "Least squares", Wikipedia, The Free Encyclopedia,
en:737023359, 31 Aug 2016 | 08:46.
3. Stephanie, "Coefficient of Determination (R Squared): Definition, Calculation",
Statistics How To, 2016, URL http://www.statisticshowto.com/what-is-acoefficient-of-determination/ [20160904].
4. Wikipedia contributors, "Gradient descent", Wikipedia, The Free Encyclopedia,
en:737511475, 3 Sep 2016 | 08:42.
5. Wikipedia contributors, "Polynomial regression",
Encyclopedia, en:731752358, 27 Jul 2016 | 09:04.
Wikipedia,
The
Free
14