Regresi Linier dengan Dekomposisi LU


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 LU. Teknik ini disebut juga faktorisasi LU, dan yang dilakukan adalah mendekomposisi sebuah matriks A menjadi 2 matriks L dan U. L adalah matriks segitiga bawah dan U adalah matriks segitiga atas.



Diasumsikan ada 3 tipe motor yang sudah diketahui datanya, yaitu Motor A,B,C
Masing-masing tipe motor memiliki kriteria, yaitu harga, jarak tempuh per liter, cc, dan memiliki hasil jual dalam unit
Diasumsikan data dari 3 tipe motor tersebut adalah sebagai berikut:

MotorHargaJarak tempuh per literccUnit Terjual
Motor A10.000.0003511020
Motor B11.000.0004015012
Motor C14.000.00037.512517

Contoh data awal adalah sebagai berikut:

Dim dataSisiKiri As Double()() = {New Double() {10000000, 35, 110}, _
								  New Double() {11000000, 40, 150}, _
								  New Double() {14000000, 37.5, 125}}

Dim dataSisiKanan As Double()() = {New Double() {20}, _
								   New Double() {12}, _
								   New Double() {17}}



Selanjutnya ada 4 buah motor lagi, yaitu E,F,G,H, yang baru akan diluncurkan, sehingga tidak diketahui hasil jualnya
Maka tentukan data-data ini nantinya diperkirakan memiliki hasil jual berapa unit
Diasumsikan data awalnya adalah sebagai berikut:

MotorHargaJarak tempuh per litercc
Motor E13.000.00045125
Motor F12.000.00047110
Motor G10.500.00043110
Motor H13.500.00035125

Contoh data baru adalah sebagai berikut:

Dim dataBaru As Double()() = {New Double() {13000000, 45, 125}, _
							  New Double() {12000000, 47, 110}, _
							  New Double() {10500000, 43, 110}, _
							  New Double() {13500000, 35, 125}}

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 LU

Dim LUD As LUDecomposition = New LUDecomposition(A)

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

Public Class LUDecomposition
    Private LU As Double()()
    Private ukuranBaris As Integer, ukuranKolom As Integer, tandaPivot As Integer
    Private vektorPivot As Integer()

    'Proses dekomposisi LU
    Public Sub New(A As ObyekMatriks)
        'Menggunakan perkalian dot matriks dengan algoritma Crout/Doolittle

        Dim tmpA As ObyekMatriks = A.Clone
        LU = tmpA.GetArray
        ukuranBaris = A.GetUkuranBaris
        ukuranKolom = A.GetUkuranKolom
        vektorPivot = New Integer(ukuranBaris - 1) {}
        For i As Integer = 0 To ukuranBaris - 1
            vektorPivot(i) = i
        Next
        tandaPivot = 1
        Dim LUrowi As Double()
        Dim LUcolj As Double() = New Double(ukuranBaris - 1) {}

        For j As Integer = 0 To ukuranKolom - 1
            ' Buat salinan referensi dari kolom j
            For i As Integer = 0 To ukuranBaris - 1
                LUcolj(i) = LU(i)(j)
            Next

            ' Lakukan transformasi sebelumnya

            For i As Integer = 0 To ukuranBaris - 1
                LUrowi = LU(i)

                ' Sebagian banyak waktu akan diperlukan untuk melakukan perkalian dot matriks

                Dim kmax As Integer = Math.Min(i, j)
                Dim s As Double = 0.0
                For k As Integer = 0 To kmax - 1
                    s += LUrowi(k) * LUcolj(k)
                Next

                LUrowi(j) -= s
                LUcolj(i) -= s
            Next

            ' Cari pivot dan tukar jika diperlukan

            Dim p As Integer = j
            For i As Integer = j + 1 To ukuranBaris - 1
                If Math.Abs(LUcolj(i)) > Math.Abs(LUcolj(p)) Then
                    p = i
                End If
            Next
            If p <> j Then
                For k As Integer = 0 To ukuranKolom - 1
                    Dim t As Double = LU(p)(k)
                    LU(p)(k) = LU(j)(k)
                    LU(j)(k) = t
                Next
                Dim k2 As Integer = vektorPivot(p)
                vektorPivot(p) = vektorPivot(j)
                vektorPivot(j) = k2
                tandaPivot = -tandaPivot
            End If

            ' Hitung faktor pengali

            If j < ukuranBaris And LU(j)(j) <> 0.0 Then
                For i As Integer = j + 1 To ukuranBaris - 1
                    LU(i)(j) /= LU(j)(j)
                Next
            End If
        Next
    End Sub
	
	. . .
End Class

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

Dim L As ObyekMatriks = LUD.L

3. Dapatkan matriks segitiga atas (U) dari proses dekomposisi tersebut

Dim U As ObyekMatriks = LUD.U

4. Dapatkan pivot, yaitu urutan baris matriks dari proses dekomposisi tersebut

Dim P() As Integer = LUD.Pivot

5. Lakukan rekonstruksi matriks A dengan rumus:
A = L * U

Dim hasil As ObyekMatriks = L.PerkalianMatriks(U)

6. Urutkan baris data sesuai pivot yang telah ditemukan

Dim arrayHasil()() As Double = hasil.Clone.GetArray
For i As Integer = 0 To P.Length - 1
	For j As Integer = 0 To P.Length - 1
		If i = P(j) Then
			For k As Integer = 0 To arrayHasil(P(j)).Length - 1
				hasil.SetElement(i, k, arrayHasil(j)(k))
			Next
		End If
	Next
Next

7. Hitung koefisien dari masing-masing kolom yang ada

Dim X As ObyekMatriks = LUD.HitungPenyelesaian(b)

* Lakukan proses penyelesaian persamaan linier A * X = B
Hasil pengembalian nilai fungsi adalah matriks X, sehingga L * U * X = B(piv,:)

Public Overridable Function HitungPenyelesaian(B As ObyekMatriks) As ObyekMatriks
	If B.GetUkuranBaris <> ukuranBaris Then
		Throw New ArgumentException("Ukuran baris matriks harus sama.")
	End If
	If Not Me.IsNonSingular Then
		Throw New SystemException("Matriks harus singular.")
	End If

	'Salin array B sebagai array hasil output persamaan beserta vektor pivot
	Dim nx As Integer = B.GetUkuranKolom
	Dim Xmat As ObyekMatriks = B.GetMatriks(vektorPivot, 0, nx - 1)
	Dim X As Double()() = Xmat.GetArray

	Console.WriteLine("Perlu diingat bahwa X harus memenuhi syarat L * U * X = B(piv,:)")
	Console.WriteLine("1. Lakukan perhitungan substitusi L * Y = B(piv,:) untuk mendapatkan matriks Y")
	' Hitung L * Y = B(piv,:)
	For k As Integer = 0 To ukuranKolom - 1
		For i As Integer = k + 1 To ukuranKolom - 1
			For j As Integer = 0 To nx - 1
				X(i)(j) -= X(k)(j) * LU(i)(k)
			Next
		Next
	Next

	Console.WriteLine("2. Lakukan perhitungan substitusi U * X = Y untuk mendapatkan matriks X")
	' Hitung U * X = Y;
	For k As Integer = ukuranKolom - 1 To 0 Step -1
		For j As Integer = 0 To nx - 1
			X(k)(j) /= LU(k)(k)
		Next
		For i As Integer = 0 To k - 1
			For j As Integer = 0 To nx - 1
				X(i)(j) -= X(k)(j) * LU(i)(k)
			Next
		Next
	Next

	Console.WriteLine("")
	Return Xmat
End Function

8. 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("Motor " & Chr(i + 65) & "  ")
	Console.Write(dataSisiKiri(i)(0).ToString("N0").PadRight(11) & " ")
	Console.Write(dataSisiKiri(i)(1).ToString.PadRight(23) & " ")
	Console.Write(dataSisiKiri(i)(2).ToString.PadRight(4) & " ")

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

	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

9. 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("Motor " & Chr(i + 65 + 4) & "  ")
	Console.Write(dataBaru(i)(0).ToString("N0").PadRight(11) & " ")
	Console.Write(dataBaru(i)(1).ToString.PadRight(23) & " ")
	Console.Write(dataBaru(i)(2).ToString.PadRight(4) & " ")

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

Hasil akhir adalah: (klik untuk perbesar gambar)

cmd141

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 *