Anda di halaman 1dari 14

Sparisoma Viridi, 201609041 dalam Fisika Granular, Departemen Fisika, Institut Teknologi Bandung | Lisensi ITB 2016 | Penyebaran

dalam bentuk aslinya


diperbolehkan selama untuk tujuan pendidikan dan tak-komersial. Modifikasi dan pembuatan karya turunan memerlukan ijin dari penulis | dudung@gmail.com

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 Penentuan secara visual


Persamaan garis dalam bentuk
y = c 0 + c1 x

(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

berbentuk kuadrat. Selanjutnya kesalahan total untuk seluruh data adalah


N

= i .

(5)

i =1

Persoalan berikutnya adalah bagaimana menentukan c0 dan c1 agar nilai minimum.


Untuk itu c0 dan c1 merupakan variabel bebas. Perhatikan bahwa dalam hal ini {xi, yi}
adalah konstanta yang tidak dapat berubah karena merupakan data. Persamaan (5)
diminimumkan melalui

=0
c 0

(6)

= 0.
c1

(7)

dan

Persamaan (4) (6) akan memberikan


N

(y

c 0 c1 x i ) = 0 ,

(8)

i =1

sedangkan Persamaan (4), (5), dan (7) akan memberikan

(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

dan Persamaan (9) menjadi


N

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

Substitusi Persamaan (12) ke Persamaan (10) akan memberikan


N

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

sehingga dapat dihitung


R2 =

SS 2xy

SS xx SS yy

(15)

yang merupakan koefisien determinasi dengan bentuk lainnya [3] adalah


N

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.

4 Implementasi dari C++


Suatu program dalam C++ dapat dibangun untuk mengimplementasikan algoritma
regresi linier sebelumnya. Program yang disajikan ini merupakan salah satu
implementasi yang dapat dilakukan. Terdapat tak-berhingga ragam implementasi suatu
algoritma dalam suatu program.
Kode 1. Program regresi linier.
/*
linreg.cpp
Linear regression using formula from least square method
Sparisoma Viridi | dudung@gmail.com
Compile: g++ linreg.cpp -o linreg
Execute: ./linreg
20160904
Create this program.
*/
#include <iostream>
#include <sstream>
#include <cstring>

#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;

// Terminate program with success state


return 0;

}
// 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();
}

Hasil dari Kode 1 adalah


$ ./linreg
1
2
3
5
1.4
1.8

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

Gambar 1. Hasil fitting dengan fitur trendline pada Microsoft Excel.

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.

5 Pencarian secara numerik


Nilai c0 dan c1 dapat pula dicari secara numerik apabila Persaman (6) dan (7) tidak dapat
tercapai. Salah satu metode yang dapat digunakan adalah gradient descent [4]
cij +1 = cih i .

(17)

di mana dalam hal ini


i =

,
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>

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;
// Set
double
double
double

initial c0, c1, g;


c0 = 1;
c1 = 1;
g = 0.01;

// Define termination parameters


double erreps = 1E-4;
double err = 100;
int jmax = 611;
// Set iteration index and perform iteration
int j = 1;

10

while(err > erreps && j < jmax) {


// Calculate change of c0 and c1
double dc0 = 0, dc1 = 0;
for(int i = 0; i < N; i++) {
dc0 += 2 * g * (y[i] - c0 - c1*x[i]);
dc1 += 2 * g * (x[i]*y[i] - c0*x[i] - c1*x[i]*x[i]);
}
// Change c0 and c1
c0 += dc0;
c1 += dc1;
// Calculate error with new c0 and c1
err = 0;
for(int i = 0; i < N; i++) {
err += (y[i] - c0 - c1*x[i])*(y[i] - c0 - c1*x[i]);
}
j += 1;
}
// 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];
}
// 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 <<
cout <<

results
j << "\t";
c0 << "\t";
c1 << "\t";
R2 << endl;

11

// Terminate program with success state


return 0;
}
// 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();
}

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)

dengan mengunakan hubungan


N

N = 1 .

(25)

i =1

Dengan mengamati polanya Persamaan (24) dapat diperluas menjadi


N
1
i =1
N
xi
iN=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

3. Bagaimanakan bentuk rumusan ci bila metode kuadrat terkecil diterapkan untuk


N

mencari koefisien-koefisien dari persamaan y = ci x i ?


i =1

4. Gambarkan dalam ruang c0 dan c1 bagaimana proses perubahan nilai-nilainya


sehingga tercapai yang minimum! Jelaskan pula apakah proses ini telah cukup
efisien secara subyektif dengan hanya melihat bentuk lintasannya? Gunakan data
dari Soal 2.

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

6. A. Panduwirawan, L. Haris, G. W. P. Data, F. D. E. Latief, S. Viridi, "Program


Sederhana untuk Regresi Polinomial Orde n Berbasis C++", Prosiding Seminar
Kontribusi Fisika 2011 (SKF 2011), Eds. F. D. E. Latief et al., Bandung, Indonesia, 12 Desember 2011, pp. 198-205.

14

7. Eric W. Weisstein, "Gaussian Elimination", from MathWorld--A Wolfram Web


Resource,
URL
http://mathworld.wolfram.com/GaussianElimination.html
[20160905].

Anda mungkin juga menyukai