Algoritma Probit Model (Probability Unit)


Algoritma Probit Model (Probability Unit) adalah salah satu algoritma yang digunakan untuk pengelompokan data. Tetapi bisa juga digunakan untuk pengambilan keputusan. Contoh yang dibahas kali ini adalah mengenai penentuan penerimaan pengajuan kredit sepeda motor baru.
Proses perhitungan yang utama pada algoritma ini adalah mencari bobot pada data yang sudah ada. Setelah bobot selesai dihitung, maka nilai bobot tersebut akan digunakan untuk menghitung setiap data baru yang tidak diketahui hasilnya. Teknik yang digunakan pada algoritma ini adalah Simplex Optimization.
Simplex Optimization bekerja dengan cara membentuk segitiga solusi yang dikatakan sebagai solusi terbaik – lainnya – terburuk. Pada setiap perhitungan, segitiga ini akan dihitung sehingga semakin mendekati solusi yang terbaik. Apabila segitiga ini digambar secara berurutan pada setiap perulangan, gerakan segitiga yang terjadi mirip dengan pola gerakan amoeba, oleh karena itu metode ini juga disebut sebagai Algoritma AMO (Amoeba Method Optimization).



Diasumsikan ada 8 data pelanggan yang sudah diketahui datanya, yaitu Pelanggan A,B,C,D,E,F,G,H
Masing-masing pelanggan memiliki kriteria, yaitu umur, jenis kelamin, skor kepribadian, dan memiliki nilai hasil yaitu Diterima / Ditolak
Diasumsikan 8 data tersebut adalah sebagai berikut:

PelangganUmurJenis KelaminSkor KepribadianHasil
Pelanggan A44Laki-laki3.55Ditolak
Pelanggan B52Perempuan4.71Ditolak
Pelanggan C60Perempuan6.56Diterima
Pelanggan D56Laki-laki6.8Diterima
Pelanggan E51Laki-laki6.94Ditolak
Pelanggan F46Perempuan6.52Ditolak
Pelanggan G48Laki-laki4.25Ditolak
Pelanggan H58Perempuan5.71Ditolak

Selanjutnya ada 2 orang pelanggan baru yang mengajukan kredit sepeda motor
Maka tentukan pelanggan ini nantinya akan termasuk dalam kelompok Diterima / Ditolak
Diasumsikan data awalnya adalah sebagai berikut:

/tr>

PelangganUmurJenis KelaminSkor Kepribadian
Pelanggan I44Perempuan12.52
Pelanggan J55Laki-Laki6.38



Contoh data pelanggan tersebut adalah sebagai berikut:
Untuk Kriteria Jenis Kelamin:
Laki-laki dilambangkan dengan angka -1
Perempuan dilambangkan dengan angka +1
Untuk Kriteria Nilai Hasil:
Diterima dilambangkan dengan angka 1
Ditolak dilambangkan dengan angka 0

Dim data(9)() As Double
data(0) = New Double() {44, -1, 3.55, 0}
data(1) = New Double() {52, +1, 4.71, 0}
data(2) = New Double() {60, +1, 6.56, 1}
data(3) = New Double() {56, -1, 6.8, 1}
data(4) = New Double() {51, -1, 6.94, 0}
data(5) = New Double() {46, +1, 6.52, 0}
data(6) = New Double() {48, -1, 4.25, 0}
data(7) = New Double() {58, +1, 5.71, 0}

Contoh data pelanggan baru adalah sebagai berikut:
Untuk Kriteria Nilai Hasil, semua dilambangkan dengan nilai -1 karena belum diketahui hasilnya

data(8) = New Double() {44, +1, 12.52, -1}
data(9) = New Double() {55, -1, 6.38, -1}

Langkah-langkah penggunaan algoritma ini adalah

1. Lakukan normalisasi data untuk kriteria Umur dan Skor Kepribadian
Normalisasi data dihitung dengan (rumus data – (rata-rata kriteria tersebut)) / standar deviasi kriteria tersebut
Rata-rata adalah jumlah semua data dibagi dengan jumlah datanya
Standar deviasi adalah akar dari ((kuadrat dari (jumlah dari (data – rata-rata))) / jumlah data)

Dim kolom() As Integer = {0, 2}
Dim jumlahBaris As Integer = data.Length
Dim jumlahKolom As Integer = data(0).Length

Dim hasil(1)() As Double ' [0] = rata-rata, [1] = standar deviasi
For i = 0 To 1
	hasil(i) = New Double(jumlahKolom - 1) {}
Next i

For c = 0 To jumlahKolom - 1
	'Hitung nilai rata-rata tiap-tiap kolom
	'yaitu dengan rumus: jumlah semua data dibagi dengan jumlah datanya
	Dim total As Double = 0.0
	For r = 0 To jumlahBaris - 1
		total += data(r)(c)
	Next r
	Dim rata2 As Double = total / jumlahBaris
	hasil(0)(c) = rata2

	'Hitung nilai standar deviasi tiap-tiap kolom
	'yaitu dengan rumus: akar dari ((kuadrat dari (jumlah dari (data - rata-rata))) / jumlah data)
	Dim totalKuadrat As Double = 0.0
	For r = 0 To jumlahBaris - 1
		totalKuadrat += (data(r)(c) - rata2) * (data(r)(c) - rata2)
	Next r
	Dim stdDev As Double = Math.Sqrt(totalKuadrat / jumlahBaris)
	hasil(1)(c) = stdDev
Next c

For c = 0 To kolom.Length - 1
	Dim j As Integer = kolom(c) ' kolom yang dinormalisasi
	Dim mean As Double = hasil(0)(j) ' nilai rata-rata untuk kolom tersebut
	Dim stdDev As Double = hasil(1)(j)
	For i = 0 To jumlahBaris - 1
		data(i)(j) = (data(i)(j) - mean) / stdDev
	Next i
Next c

2. Tentukan Jumlah maksimal Epoch
Epoch adalah banyak perulangan yang dilakukan dalam 1 kali proses pembelajaran
Diasumsikan dalam kasus ini jumlah maksimal Epoch adalah 100

Const maksEpoch As Integer = 100

3. Cari bobot terbaik untuk setiap kriteria pada matriks contohData
Metode pembelajaran yang digunakan adalah metode Simplex Optimization
Langkah-langkah metode Simplex Optimization akan dibahas pada point dibawah ini (point 3a – 3j)

Dim bobotTerbaik() As Double = pc.ProsesPerhitungan(contohData, maksEpoch)

Penjelasan mengenai Metode Simplex Optimization adalah sebagai berikut:

3a. Ambil 3 nilai acak untuk dijadikan sebagai solusi sementara, yaitu solusi terbaik, terburuk, lainnya
Untuk masing-masing nilai tersebut, hitung tingkat kesalahannya menggunakan teknik MSE (Mean Squared Error)
yaitu jumlah dari (kuadrat dari (hasil terhitung – hasil pada data awal)) / jumlah data

Dim solusi(2) As Solution
For i = 0 To 2
	solusi(i) = New Solution(jumlahKriteria)
	solusi(i).bobot = CariSolusiAcak()
	solusi(i).nilaiKesalahan = MeanSquaredError(contohData, solusi(i).bobot)
Next i

* Gunakan fungsi ini untuk mencari nilai MSE (Mean Squared Error)
Hitung tingkat kesalahan nilai jawaban menggunakan teknik Mean Squared Error
dihitung dengan rumus jumlah dari (kuadrat dari (nilai jawaban – nilai hasil pada matriks data)) / jumlah data
Nilai jawaban yang baru bisa jadi mengembalikan nilai MSE yang lebih tinggi, sehingga nilai jawaban ini tidak bisa dipakai

Private Function MeanSquaredError(ByVal contohData()() As Double, ByVal bobot() As Double) As Double
	Dim indeksKriteriaHasil As Integer = contohData(0).Length - 1
	Dim jumlahKuadrat As Double = 0.0
	For i = 0 To contohData.Length - 1
		Dim xData(jumlahKriteria - 1) As Double
		Array.Copy(contohData(i), xData, jumlahKriteria)
		Dim hasilPerhitungan As Double = hitungNilaiOutput(xData, bobot)
		Dim hasilData As Double = contohData(i)(indeksKriteriaHasil)
		jumlahKuadrat += (hasilPerhitungan - hasilData) * (hasilPerhitungan - hasilData)
	Next i
	Return jumlahKuadrat / contohData.Length
End Function

3b. Urutkan solusi berdasarkan tingkat kesalahan terendahnya, kemudian masukkan nilai bobot terbaik – lainnya – terburuk sesuai urutan yang ada

Array.Sort(solusi) ' [0] = terbaik, [1] = lainnya, [2] = terburuk
Dim solusiTerbaik() As Double = solusi(indeksSolusiTerbaik).bobot
Dim solusiLainnya() As Double = solusi(indeksSolusiLainnya).bobot
Dim solusiTerburuk() As Double = solusi(indeksSolusiTerburuk).bobot

3c. Cari nilai centroid, yaitu nilai tengah dari solusi lainnya ke solusi terbaik

Dim centroid() As Double = Me.Centroid(solusiLainnya, solusiTerbaik)

* Gunakan fungsi ini untuk mencari nilai centroid

Private Function Centroid(ByVal lainnya() As Double, ByVal solusiTerbaik() As Double) As Double()
	Dim hasil(Me.jumlahKriteria) As Double
	For i = 0 To hasil.Length - 1
		hasil(i) = (lainnya(i) + solusiTerbaik(i)) / 2.0
	Next i
	Return hasil
End Function

3d. Cari nilai expanded, yaitu nilai centroid ditambah (nilai centroid – nilai terburuk) dikali 2
Kemudian hitung tingkat kesalahannya menggunakan teknik MSE (Mean Squared Error)
Jika nilai kesalahan expanded kurang dari nilai kesalahan terburuk, maka nilai expanded akan menggantikan nilai terburuk

Dim expanded() As Double = Me.Expanded(centroid, solusiTerburuk)
Dim nilaiKesalahanExpanded As Double = MeanSquaredError(contohData, expanded)
If nilaiKesalahanExpanded < solusi(indeksSolusiTerburuk).nilaiKesalahan Then
	Array.Copy(expanded, solusi(indeksSolusiTerburuk).bobot, jumlahKriteria + 1)
	solusi(indeksSolusiTerburuk).nilaiKesalahan = nilaiKesalahanExpanded
	Continue Do
End If

3e. Cari nilai reflected, yaitu nilai centroid ditambah (nilai centroid – nilai terburuk) dikali 1
Kemudian hitung tingkat kesalahannya menggunakan teknik MSE (Mean Squared Error)
Jika nilai kesalahan reflected kurang dari nilai kesalahan terburuk, maka nilai reflected akan menggantikan nilai terburuk

Dim reflected() As Double = Me.Reflected(centroid, solusiTerburuk)
Dim nilaiKesalahanReflected As Double = MeanSquaredError(contohData, reflected)
If nilaiKesalahanReflected < solusi(indeksSolusiTerburuk).nilaiKesalahan Then ' relected better than terburuk?
	Array.Copy(reflected, solusi(indeksSolusiTerburuk).bobot, jumlahKriteria + 1)
	solusi(indeksSolusiTerburuk).nilaiKesalahan = nilaiKesalahanReflected
	Continue Do
End If

3f. Cari nilai contracted, yaitu nilai centroid ditambah (nilai centroid – nilai terburuk) dikali – 0.5
Kemudian hitung tingkat kesalahannya menggunakan teknik MSE (Mean Squared Error)
Jika nilai kesalahan contracted kurang dari nilai kesalahan terburuk, maka nilai contracted akan menggantikan nilai terburuk

Dim contracted() As Double = Me.Contracted(centroid, solusiTerburuk)
Dim nilaiKesalahanContracted As Double = MeanSquaredError(contohData, contracted)
If nilaiKesalahanContracted < solusi(indeksSolusiTerburuk).nilaiKesalahan Then
	Array.Copy(contracted, solusi(indeksSolusiTerburuk).bobot, jumlahKriteria + 1)
	solusi(indeksSolusiTerburuk).nilaiKesalahan = nilaiKesalahanContracted
	Continue Do
End If

Gunakan 3 fungsi dibawah ini untuk mencari nilai reflected, expanded, contracted
Ilustrasi singkat adalah sebagai berikut:
b----------x----------c----------y----------z
buruk-----------------centroid

Tarik garis lurus antara posisi terburuk dengan posisi centroid
Kemudian tambahkan garis terusan dari posisi centroid sepanjang jarak sebelumnnya
Posisi Expanded berada pada posisi z, dengan jarak (centroid-buruk) * koefisien gamma, dalam contoh ini bernilai 2.0
Posisi Reflected berada pada posisi y, dengan jarak (centroid-buruk) * koefisien alpha, dalam contoh ini bernilai 1.0
Posisi Contracted berada pada posisi x, dengan jarak (centroid-buruk) * koefisien beta, dalam contoh ini bernilai 0.5

'Gunakan fungsi ini untuk mencari nilai expanded
Private Function Expanded(ByVal centroid() As Double, ByVal solusiTerburuk() As Double) As Double()
	Const gamma As Double = 2.0
	Dim hasil(Me.jumlahKriteria) As Double
	For i = 0 To hasil.Length - 1
		hasil(i) = centroid(i) + (gamma * (centroid(i) - solusiTerburuk(i)))
	Next i
	Return hasil
End Function

'Gunakan fungsi ini untuk mencari nilai reflected
Private Function Reflected(ByVal centroid() As Double, ByVal solusiTerburuk() As Double) As Double()
	Const alpha As Double = 1.0
	Dim hasil(Me.jumlahKriteria) As Double
	For i = 0 To hasil.Length - 1
		hasil(i) = centroid(i) + (alpha * (centroid(i) - solusiTerburuk(i)))
	Next i
	Return hasil
End Function

'Gunakan fungsi ini untuk mencari nilai contracted
Private Function Contracted(ByVal centroid() As Double, ByVal solusiTerburuk() As Double) As Double()
	Const rho As Double = -0.5
	Dim hasil(Me.jumlahKriteria) As Double
	For i = 0 To hasil.Length - 1
		hasil(i) = centroid(i) + (rho * (centroid(i) - solusiTerburuk(i)))
	Next i
	Return hasil
End Function

3g. Cari nilai acak lagi
Kemudian hitung tingkat kesalahannya menggunakan teknik MSE (Mean Squared Error)
Jika nilai kesalahannya kurang dari nilai kesalahan terburuk, maka nilai ini akan menggantikan nilai terburuk

Dim solusiAcak() As Double = CariSolusiAcak()
Dim nilaiKesalahanSolusiAcak As Double = MeanSquaredError(contohData, solusiAcak)
If nilaiKesalahanSolusiAcak < solusi(indeksSolusiTerburuk).nilaiKesalahan Then
	Array.Copy(solusiAcak, solusi(indeksSolusiTerburuk).bobot, jumlahKriteria + 1)
	solusi(indeksSolusiTerburuk).nilaiKesalahan = nilaiKesalahanSolusiAcak
	Continue Do
End If

3h. Jika nilai kesalahan dari posisi expanded – reflected – contracted – solusi acak tidak ada yang kurang dari nilai kesalahan solusi terburuk,
Maka hitung nilai solusi lainnya dan solusi terburuk yang baru.

3h1. Hitung nilai solusi terburuk yang baru, yaitu (nilai terburuk + nilai terbaik) dibagi 2
Kemudian hitung tingkat kesalahannya menggunakan teknik MSE (Mean Squared Error)

For j = 0 To jumlahKriteria
	solusi(indeksSolusiTerburuk).bobot(j) = (solusi(indeksSolusiTerburuk).bobot(j) + solusi(indeksSolusiTerbaik).bobot(j)) / 2.0
Next j
solusi(indeksSolusiTerburuk).nilaiKesalahan = MeanSquaredError(contohData, solusi(indeksSolusiTerburuk).bobot)

3h2. Hitung nilai solusi lainnya yang baru, yaitu (nilai lainnya + nilai terbaik) dibagi 2
Kemudian hitung tingkat kesalahannya menggunakan teknik MSE (Mean Squared Error)

For j = 0 To jumlahKriteria
	solusi(indeksSolusiLainnya).bobot(j) = (solusi(indeksSolusiLainnya).bobot(j) + solusi(indeksSolusiTerbaik).bobot(j)) / 2.0
Next j
solusi(indeksSolusiLainnya).nilaiKesalahan = MeanSquaredError(contohData, solusi(indeksSolusiLainnya).bobot)

3i. Lakukan perhitungan 3a – 3h sebanyak parameter maksEpoch

3j. Dapatkan solusi terbaik, yaitu solusi dengan nilai kesalahan terendah

Array.Copy(solusi(indeksSolusiTerbaik).bobot, Me.bobot, Me.jumlahKriteria + 1)

4. Lakukan perhitungan dari masing-masing data awal menggunakan matriks bobot yang sudah ditemukan

Dim output As Double = pc.hitungNilaiOutput(contohData(i), bobotTerbaik)

* Gunakan fungsi ini untuk menghitung nilai output

Public Function hitungNilaiOutput(ByVal data() As Double, ByVal bobot() As Double) As Double
	Dim z As Double = 0.0

	z += bobot(0)
	For i = 0 To bobot.Length - 2
		z += (bobot(i + 1) * data(i))
	Next i
	Return HitungDistribusiAkumulatif(z)
End Function

5. Jika nilai output bernilai kurang dari 0.5 maka pelanggan tersebut memiliki nilai hasil Ditolak
Jika nilai output bernilai lebih dari 0.5 maka pelanggan tersebut memiliki nilai hasil Diterima

If output <= 0.5 Then
	Console.Write("-> Ditolak ")
Else
	Console.Write("-> Diterima")
End If

6. Catat tingkat kecocokan perhitungan data dengan hasil awal pada data
Langkah ini tidak wajib, hanya untuk mengetahui seberapa besar tingkat kecocokan perhitungan untuk data baru yang akan dihitung selanjutnya

Console.WriteLine("Jumlah perhitungan benar = " & jumlahBenar & ", jumlah perhitungan salah = " & jumlahSalah)
Console.WriteLine("Tingkat kecocokan perhitungan dengan hasil data adalah " & (jumlahBenar / (jumlahBenar + jumlahSalah)).ToString("F2"))

7. Lakukan perhitungan yang sama (poin 4 dan 5) untuk masing-masing data baru

For i As Integer = 0 To dataBaru.Length - 1
	Console.Write("Pelanggan " & Chr(i + 65 + 8) & "   ")

	Dim input(jumlahKolom - 2) As Double
	Array.Copy(dataBaru(i), input, jumlahKolom - 1)
	For j = 0 To input.Length - 1
		Console.Write(input(j).ToString("F2").PadRight(5) & " ")
	Next j
	Console.Write(" ")

	Dim output As Double = pc.hitungNilaiOutput(dataBaru(i), bobotTerbaik)
	Console.Write(output.ToString("F4") & " ")

	If output <= 0.5 Then
		Console.Write("-> Ditolak ")
	Else
		Console.Write("-> Diterima")
	End If
	Console.WriteLine("")
Next

* Agar dapat menjalankan skrip diatas, maka diperlukan sebuah Class Solution untuk menampung data bobot dan nilai kesalahannya. Deklarasi Class Solution adalah sebagai berikut:

Private Class Solution
	Implements IComparable(Of Solution)
	Public bobot() As Double
	Public nilaiKesalahan As Double

	Public Sub New(ByVal jumlahKriteria As Integer)
		Me.bobot = New Double(jumlahKriteria) {}
		Me.nilaiKesalahan = 0.0
	End Sub

	'Fungsi untuk mengurutkan nilai kesalahan dari yang terendah (terbaik) ke tertinggi (terburuk)
	Public Function CompareTo(ByVal lainnya As Solution) As Integer Implements IComparable(Of Solution).CompareTo
		If Me.nilaiKesalahan < lainnya.nilaiKesalahan Then
			Return -1
		ElseIf Me.nilaiKesalahan > lainnya.nilaiKesalahan Then
			Return 1
		Else
			Return 0
		End If
	End Function
End Class

Hasil akhir adalah: (klik untuk perbesar gambar)

cmd23b

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 *