Regresi Linier dengan Dekomposisi Cholesky


Dalam statistika, regresi linier adalah sebuah pendekatan untuk memodelkan hubungan antara variabel terika Y dan satu atau lebih variabel beas yang disebut X. Salah satu kegunaan dari regresi linier adalah untuk melakukan prediksi berdasarkan data-data yang telah dimiliki sebelumnya Contoh yang dibahas kali ini adalah mengenai penentuan penerimaan pengajuan kredit sepeda motor baru berdasarkan kelompok data yang sudah ada.
Ada beberapa cara menyelesaikan permasalahan regresi linier, salah satunya adalah melalui teknik Dekomposisi Cholesky. Teknik ini mendekomposisi sebuah matriks A menjadi sebuah matriks L, yaitu matriks segitiga bawah. Teknik ini juga memiliki batasan bahwa matriks input harus dalam keadaan simetris dan positif definite. Matriks simetris adalah matriks yang hasil transpos sama dengan matriks awal. Matriks positif definite adalah matriks yang semua elemennya bernilai positif.



Diasumsikan persamaan linier adalah sebagai berikut:

10X + 3Y + 7Z = 12
3X + 5Y + 2Z = 4
7X + 2Y + 8Z = 15

Contoh data awal adalah sebagai berikut:

Dim dataSisiKiri As Double()() = {New Double() {10, 3, 7}, _
								  New Double() {3, 5, 2}, _
								  New Double() {7, 2, 8}}

Dim dataSisiKanan As Double()() = {New Double() {12}, _
								   New Double() {4}, _
								   New Double() {15}}



Selanjutnya gunakan nilai koefisien X,Y,Z untuk menghitung hasil persamaan berikut

9X + -2Y + 8Z
-3X + 10Y + 6Z

Contoh data baru adalah sebagai berikut:

Dim dataBaru As Double()() = {New Double() {9, -2, 8}, _
							  New Double() {-3, 10, 6}}

Langkah-langkah penggunaan algoritma ini adalah

* Catat matriks persamaan sisi kiri pada layar

Dim A As New ObyekMatriks(dataSisiKiri)

* Catat matriks persamaan sisi kanan pada layar

Dim b As New ObyekMatriks(dataSisiKanan)

1. Lakukan proses dekomposisi matriks menggunakan metode dekomposisi Cholesky

Dim CD As CholeskyDecomposition = New CholeskyDecomposition(A)

* Skrip tersebut akan melakukan inisialisasi pada Class CholeskyDecomposition. Class ini berisi tentang variabel dan fungsi-fungsi yang digunakan untuk melakukan dekomposisi. Deklarasi Class CholeskyDecomposition adalah sebagai berikut:

Public Class CholeskyDecomposition
    Private L As Double()()
    Private ukuranMatriks As Integer
    Private isSimetrisDanPositifDefinite As Boolean

    'Algoritma Cholesky untuk matriks simetris dan positif definite
    Public Sub New(Arg As ObyekMatriks)
        ' Proses Inisialisasi
        Dim A As Double()() = Arg.SalinArray
        ukuranMatriks = Arg.GetUkuranBaris
        L = New Double(ukuranMatriks - 1)() {}
        For i As Integer = 0 To ukuranMatriks - 1
            L(i) = New Double(ukuranMatriks - 1) {}
        Next
        isSimetrisDanPositifDefinite = (Arg.GetUkuranKolom = ukuranMatriks)

        'Proses Utama
        For j As Integer = 0 To ukuranMatriks - 1
            Dim Lrowj As Double() = L(j)
            Dim d As Double = 0.0
            For k As Integer = 0 To j - 1
                Dim Lrowk As Double() = L(k)
                Dim s As Double = 0.0
                For i As Integer = 0 To k - 1
                    s += Lrowk(i) * Lrowj(i)
                Next
                Lrowj(k) = (A(j)(k) - s) / L(k)(k)
                s = (A(j)(k) - s) / L(k)(k)
                d = d + s * s
                isSimetrisDanPositifDefinite = isSimetrisDanPositifDefinite And (A(k)(j) = A(j)(k))
            Next
            d = A(j)(j) - d
            isSimetrisDanPositifDefinite = isSimetrisDanPositifDefinite And (d > 0.0)
            L(j)(j) = Math.Sqrt(Math.Max(d, 0.0))
            For k As Integer = j + 1 To ukuranMatriks - 1
                L(j)(k) = 0.0
            Next
        Next
    End Sub
	
	. . .
End Class

2. Dapatkan matriks segitiga bawah (L) dari proses dekomposisi tersebut

Dim L As ObyekMatriks = CD.GetL

3. Lakukan rekonstruksi matriks A dengan rumus:
A = L * L’

Dim LT As ObyekMatriks = L.Transpos
Dim hasil As ObyekMatriks = L.PerkalianMatriks(LT)

4. Hitung koefisien dari masing-masing kolom yang ada

Dim X As ObyekMatriks = CD.HitungPenyelesaian(b)

* Lakukan proses penyelesaian persamaan linier A * X = B
Hasil pengembalian nilai fungsi adalah matriks X, sehingga L * L’ * X = B

Public Overridable Function HitungPenyelesaian(B As ObyekMatriks) As ObyekMatriks
	If B.GetUkuranBaris <> ukuranMatriks Then
		Throw New ArgumentException("Ukuran baris matriks harus sama.")
	End If
	If Not isSimetrisDanPositifDefinite Then
		Throw New SystemException("Matriks harus simetris dan positif definite.")
	End If

	'Salin array B sebagai array hasil output persamaan
	Dim tmpB As ObyekMatriks = B.Clone
	Dim X As Double()() = tmpB.GetArray
	Dim nx As Integer = B.GetUkuranKolom

	Console.WriteLine("Perlu diingat bahwa X harus memenuhi syarat L * L' * X = B")
	Console.WriteLine("1. Lakukan perhitungan substitusi L * Y = B untuk mendapatkan matriks Y")
	'Hitung L * Y = B
	Dim tmpY(L.Length - 1)() As Double
	For j As Integer = 0 To L.Length - 1
		tmpY(j) = New Double(0) {}

		For k As Integer = 0 To j
			If j <> k Then
				X(j)(nx - 1) -= L(j)(k) * tmpY(k)(0)
			Else
				tmpY(j)(0) = X(j)(nx - 1) / L(j)(k)
			End If
		Next
	Next

	Console.WriteLine("2. Lakukan perhitungan substitusi L' * X = Y untuk mendapatkan matriks X")
	''Hitung L' * X = Y
	Dim LT(L.Length - 1)() As Double
	For j As Integer = 0 To LT.Length - 1
		LT(j) = New Double(L(j).Length - 1) {}

		For k As Integer = 0 To LT(j).Length - 1
			LT(j)(k) = L(k)(j)
		Next
	Next

	Dim tmpX(LT.Length - 1)() As Double
	For j As Integer = LT.Length - 1 To 0 Step -1
		tmpX(j) = New Double(0) {}

		For k As Integer = LT.Length - 1 To j Step -1
			If j <> k Then
				tmpY(j)(0) -= LT(j)(k) * tmpX(k)(0)
			Else
				tmpX(j)(0) = tmpY(j)(0) / LT(j)(k)
			End If
		Next
	Next

	Console.WriteLine("")
	Return New ObyekMatriks(tmpX, ukuranMatriks, nx)
End Function

5. Lakukan perhitungan dari masing-masing data awal menggunakan matriks koefisien X yang sudah ditemukan
Kemudian catat tingkat kecocokan perhitungan data dengan hasil awal pada data, untuk membandingkan apakah nilai X sudah cocok pada contoh data

Dim jumlahBenar As Integer = 0, jumlahSalah As Integer = 0
For i As Integer = 0 To dataSisiKiri.Length - 1
	Console.Write(dataSisiKiri(i)(0).ToString.PadLeft(2) & "X + ")
	Console.Write(dataSisiKiri(i)(1).ToString.PadLeft(2) & "Y + ")
	Console.Write(dataSisiKiri(i)(2).ToString.PadLeft(2) & "Z = ")

	Dim y As Double = HitungUnitTerjual(dataSisiKiri(i), X.GetArray)
	Console.Write(y.ToString("F0").PadRight(5))

	If Math.Round(y) = dataSisiKanan(i)(0) Then
		jumlahBenar += 1
		Console.Write("Benar" & vbCrLf)
	Else
		jumlahSalah += 1
		Console.Write("Salah" & vbCrLf)
	End If
Next
Console.WriteLine("Jumlah perhitungan benar = " & jumlahBenar & ", jumlah perhitungan salah = " & jumlahSalah)
Console.WriteLine("Tingkat kecocokan perhitungan dengan hasil data adalah " & (jumlahBenar / (jumlahBenar + jumlahSalah)).ToString("F4"))

* Gunakan fungsi ini untuk menghitung hasil persamaan linier untuk data yang baru

Public Function HitungUnitTerjual(ByVal data() As Double, X()() As Double) As Double
	Dim hasil As Double = 0
	For i As Integer = 0 To data.Length - 1
		hasil += data(i) * X(i)(0)
	Next
	Return hasil
End Function

6. Untuk masing-masing data baru, hitung perkiraan hasil unit terjual menggunakan koefisien beta yang sudah ditentukan

For i As Integer = 0 To dataBaru.Length - 1
	Console.Write(dataBaru(i)(0).ToString.PadLeft(2) & "X + ")
	Console.Write(dataBaru(i)(1).ToString.PadLeft(2) & "Y + ")
	Console.Write(dataBaru(i)(2).ToString.PadLeft(2) & "Z = ")

	Dim y As Double = HitungUnitTerjual(dataBaru(i), X.GetArray)
	Console.Write(y.ToString("F0") & vbCrLf)
Next

Hasil akhir adalah: (klik untuk perbesar gambar)

cmd143

Contoh modul / source code dalam bahasa VB (Visual Basic) dapat didownload disini:



Jika membutuhkan jasa kami dalam pembuatan program, keterangan selanjutnya dapat dilihat di Fasilitas dan Harga
Jika ada yang kurang paham dengan langkah-langkah algoritma diatas, silahkan berikan komentar Anda.
Selamat mencoba.

Tinggalkan sebuah komentar

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *