Algoritma Bipolar Slope One 4


Algoritma Bipolar Slope One adalah salah satu algoritma yang dapat digunakan untuk memprediksikan sebuah kejadian. Contoh yang dibahas kali ini adalah mengenai penentuan rating sebuah barang berdasarkan data-data yang sudah ada.
Algoritma ini merupakan pengembangan dari Algoritma Slope One, dimana dalam algoritma ini, data input akan dipecah menjadi 2 bagian untuk mendapatkan masing-masing sumbu atau polar, kemudian dilakukan perhitungan pada masing-masing data polar, dan hasil kembali digabung untuk mendapatkan jawaban akhir.



Diasumsikan ada 10 nama cafe yang tersedia
Kemudian diketahui terdapat 12 pengguna yang sudah memberi rating pada beberapa cafe yang disukai pengguna tersebut
Diasumsikan data rating dari masing-masing pengguna tersebut adalah sebagai berikut:
Akan terdapat 10 kolom angka yang menandakan masing-masing cafe
Tanda – berarti tidak memberikan rating, selain itu berarti memberikan rating

Nama Pengguna
Pengguna 1:6364738
Pengguna 2:473635
Pengguna 3:3849464
Pengguna 4:57485648
Pengguna 5:34888683
Pengguna 6:4635475
Pengguna 7:6364738
Pengguna 8:74743635
Pengguna 9:3839464
Pengguna 10:5485648
Pengguna 11:43833643
Pengguna 12:46535475

Contoh data rating adalah sebagai berikut:

Dim dataRating As Integer()() = {({6, -1, 3, 6, -1, 4, 7, -1, 3, 8}), _
								({-1, 4, 7, -1, 3, 6, -1, 3, 5, -1}), _
								({3, 8, -1, 4, 9, -1, 4, 6, -1, 4}), _
								({5, 7, 4, 8, -1, 5, 6, -1, 4, 8}), _
								({3, 4, 8, -1, 8, -1, 8, 6, 8, 3}), _
								({4, 6, -1, 3, 5, -1, 4, 7, -1, 5}), _
								({6, -1, 3, 6, -1, 4, 7, -1, 3, 8}), _
								({7, 4, 7, 4, 3, 6, -1, 3, 5, -1}), _
								({3, 8, 3, -1, 9, -1, 4, 6, -1, 4}), _
								({5, -1, 4, 8, -1, 5, 6, -1, 4, 8}), _
								({-1, 4, 3, -1, 8, 3, 3, 6, 4, 3}), _
								({4, 6, 5, 3, 5, -1, 4, 7, -1, 5})}

Maka tentukan rating cafe yang belum diberi rating pada pengguna tertentu (yang bertanda – pada data tersebut)

Langkah-langkah penggunaan algoritma ini adalah

1. Lakukan pemisahan data rating menjadi 2 bagian,
data rating pertama adalah rating suka dengan data rating yang diambil adalah data rating dengan nilai >= 5
data rating kedua adalah rating tidak suka dengan data rating yang diambil adalah data rating dengan nilai < 5

Dim dataRatingSuka As Integer()() = New Integer(dataRating.Length - 1)() {}
Dim dataRatingTidakSuka As Integer()() = New Integer(dataRating.Length - 1)() {}
For i As Integer = 0 To dataRating.Length - 1
	dataRatingSuka(i) = New Integer(dataRating(i).Length - 1) {}
	dataRatingTidakSuka(i) = New Integer(dataRating(i).Length - 1) {}

	For j As Integer = 0 To dataRating(i).Length - 1
		If dataRating(i)(j) > -1 Then
			If dataRating(i)(j) >= 5 Then
				dataRatingSuka(i)(j) = dataRating(i)(j)
				dataRatingTidakSuka(i)(j) = 0
			ElseIf dataRating(i)(j) < 5 Then
				dataRatingSuka(i)(j) = 0
				dataRatingTidakSuka(i)(j) = dataRating(i)(j)
			End If
		Else
			dataRatingSuka(i)(j) = -1
			dataRatingTidakSuka(i)(j) = -1
		End If
	Next
Next

2. Tentukan pengguna yang akan dicari rating cafenya

Console.WriteLine("Tentukan pengguna yang akan dicari rating cafenya (1-12)")
Dim input As Integer = CInt(Console.ReadLine)

3. Lakukan perhitungan data rating suka dengam menggunakan Algoritma Slope One
Proses perhitungan algoritma ini secara detail dapat dilihat pada halaman ini

3a. Masukkan data rating suka pada semua variabel yang dibutuhkan

Dim ratingSuka As New Dictionary(Of Integer, Single)()
For i As Integer = 0 To dataRatingSuka.Length - 1
	ratingSuka = New Dictionary(Of Integer, Single)()

	For j As Integer = 0 To dataRatingSuka(i).Length - 1
		If dataRatingSuka(i)(j) > 0 Then ratingSuka.Add(j + 1, dataRatingSuka(i)(j))
	Next

	soRatingSuka.TambahRating(ratingSuka)
Next

Dim ratingPenggunaSuka As New Dictionary(Of Integer, Single)()

* Gunakan fungsi ini untuk menambahkan rating ke dalam daftar selisih rating

Public Sub TambahRating(ratingPengguna As IDictionary(Of Integer, Single))
	For Each item1 As KeyValuePair(Of Integer, Single) In ratingPengguna
		Dim item1Id As Integer = item1.Key
		Dim item1Rating As Single = item1.Value
		Items.Add(item1Id)

		For Each item2 As KeyValuePair(Of Integer, Single) In ratingPengguna
			If item2.Key <= item1Id Then Continue For

			Dim item2Id As Integer = item2.Key
			Dim item2Rating As Single = item2.Value

			Dim selisihRating As Rating
			If DictselisihRating.Contains(item1Id, item2Id) Then
				selisihRating = DictselisihRating(item1Id, item2Id)
			Else
				selisihRating = New Rating()
				DictselisihRating(item1Id, item2Id) = selisihRating
			End If

			selisihRating.NilaiRating += item1Rating - item2Rating

			selisihRating.Frekuensi += 1
		Next
	Next
End Sub

4b. Cari rating tidak suka untuk nama cafe yang belum diberi rating pada pengguna tersebut
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

soRatingTidakSuka.HitungPrediksi(ratingPenggunaTidakSuka, dataRatingTidakSuka, input)

* Gunakan fungsi ini untuk menghitung prediksi nama cafe yang belum diberi rating

Public Sub HitungPrediksi(ratingPengguna As IDictionary(Of Integer, Single), ByVal dataRatingSuka As Integer()(), ByVal input As Integer)
	prediksiNilaiRating = New Single(dataRatingSuka(0).Length - 1)() {}
	prediksiFrekuensi = New Integer(dataRatingSuka(0).Length - 1)() {}
	For i As Integer = 0 To dataRatingSuka(0).Length - 1
		prediksiNilaiRating(i) = New Single(dataRatingSuka(0).Length - 1) {}
		prediksiFrekuensi(i) = New Integer(dataRatingSuka(0).Length - 1) {}
	Next

	For Each itemId As Integer In Me.Items
		If ratingPengguna.Keys.Contains(itemId) Then Continue For
		If dataRatingSuka(input - 1)(itemId - 1) = 0 Then Continue For

		Dim itemRating As New Rating()

		For Each item As KeyValuePair(Of Integer, Single) In ratingPengguna
			If item.Key = itemId Then Continue For

			Dim inputItemId As Integer = item.Key

			If DictselisihRating.Contains(itemId, inputItemId) Then
				Dim selisihRating As Rating = DictselisihRating(itemId, inputItemId)
				itemRating.NilaiRating = (item.Value + selisihRating.Ratarata * (If((itemId < inputItemId), 1, -1))) '* selisihRating.Frekuensi
				itemRating.Frekuensi = selisihRating.Frekuensi

				prediksiNilaiRating(itemId - 1)(inputItemId - 1) = itemRating.NilaiRating
				prediksiFrekuensi(itemId - 1)(inputItemId - 1) = itemRating.Frekuensi
			End If
		Next
	Next
End Sub

4. Lakukan perhitungan data rating tidak suka dengam menggunakan Algoritma Slope One
Proses perhitungan algoritma ini secara detail dapat dilihat pada halaman ini

4a. Masukkan data rating tidak suka pada semua variabel yang dibutuhkan

Dim ratingTidakSuka As New Dictionary(Of Integer, Single)()
For i As Integer = 0 To dataRatingTidakSuka.Length - 1
	ratingTidakSuka = New Dictionary(Of Integer, Single)()

	For j As Integer = 0 To dataRatingTidakSuka(i).Length - 1
		If dataRatingTidakSuka(i)(j) > 0 Then ratingTidakSuka.Add(j + 1, dataRatingTidakSuka(i)(j))
	Next

	soRatingTidakSuka.TambahRating(ratingTidakSuka)
Next

Dim ratingPenggunaTidakSuka As New Dictionary(Of Integer, Single)()

4b. Cari rating tidak suka untuk nama cafe yang belum diberi rating pada pengguna tersebut
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

soRatingTidakSuka.HitungPrediksi(ratingPenggunaTidakSuka, dataRatingTidakSuka, input)

5. Lakukan proses penggabungan data rating dari kedua data rating suka dan data rating tidak suka
Hitung penjumlahan data nilai rating dari nilai rating suka dan nilai rating tidak suka
Nilai rating masing-masing dihitung dengan rumus:
total rating = total rating + (selisih rating * frekuensi)
Dapatkan pula nilai frekuensi dengan menjumlahkan semua frekuensi yang sudah didapatkan sebelumnya

For i As Integer = 0 To dataRating(input - 1).Length - 1
	Dim totalItemRating As Single = 0
	Dim totalFrekuensi As Integer = 0
	If dataRating(input - 1)(i) = -1 Then
		For j As Integer = 0 To soRatingSuka.prediksiNilaiRating(i).Length - 1
			totalItemRating += soRatingSuka.prediksiNilaiRating(i)(j) * soRatingSuka.prediksiFrekuensi(i)(j)
			totalFrekuensi += soRatingSuka.prediksiFrekuensi(i)(j)
		Next

		For j As Integer = 0 To soRatingTidakSuka.prediksiNilaiRating(i).Length - 1
			totalItemRating += soRatingTidakSuka.prediksiNilaiRating(i)(j) * soRatingTidakSuka.prediksiFrekuensi(i)(j)
			totalFrekuensi += soRatingTidakSuka.prediksiFrekuensi(i)(j)
		Next

		Console.WriteLine("Cafe ke " & (i + 1).ToString.PadRight(2) & " Rating: " & (totalItemRating / totalFrekuensi).ToString("F2"))
	End If
Next

* Agar dapat menjalankan skrip diatas, maka diperlukan 3 buah Class
Class Rating digunakan untuk menampung data rating dan jumlah frekuensi data tersebut
Class DictSelisihRating digunakan untuk menampung data selisih rating masing-masing cafe
Class SlopeOne sebagai class utama untuk menambah rating dan menghitung prediksi
Deklarasi masing-masing class tersebut adalah sebagai berikut:

Public Class Rating
    Private m_nilaiRating As Single
    Private m_frekuensi As Integer

    Public Property NilaiRating() As Single
        Get
            Return m_nilaiRating
        End Get
        Set(value As Single)
            m_nilaiRating = value
        End Set
    End Property

    Public Property Frekuensi() As Integer
        Get
            Return m_frekuensi
        End Get
        Set(value As Integer)
            m_frekuensi = value
        End Set
    End Property

    Public ReadOnly Property Ratarata() As Single
        Get
            Return NilaiRating / Frekuensi
        End Get
    End Property
End Class

Public Class DictSelisihRating
    Inherits Dictionary(Of String, Rating)

    Private Function GetKey(Item1Id As Integer, Item2Id As Integer) As String
        Return If((Item1Id < Item2Id), Item1Id & "/" & Item2Id, Item2Id & "/" & Item1Id)
    End Function

    Public Function Contains(Item1Id As Integer, Item2Id As Integer) As Boolean
        Return Me.Keys.Contains(GetKey(Item1Id, Item2Id))
    End Function

    Default Public Overloads Property Item(Item1Id As Integer, Item2Id As Integer) As Rating
        Get
            Return Me(Me.GetKey(Item1Id, Item2Id))
        End Get
        Set(value As Rating)
            Me(Me.GetKey(Item1Id, Item2Id)) = value
        End Set
    End Property
End Class

Public Class SlopeOne
    Private DictselisihRating As New DictSelisihRating()    'Untuk menyimpan hasil selisih nilai rating pada masing-masing cafe per pelanggan
    Private Items As New HashSet(Of Integer)()              'Berapa banyak cafe yang ada
	
	. . .
End Class

Hasil akhir adalah: (klik untuk perbesar gambar)

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 *

4 pemikiran di “Algoritma Bipolar Slope One

  • Ifan Zalukhu

    Mas, bisa minta bantu apa saja algoritma yg sejenis dengan Slope One tapi dia minimal 5 tahun maks 10 thn terakhir di publish. Lagi cari referensi algoritma untuk tugas kampus soalnya. Algoritma slope one gk bisa krn dia di publish 2005. Sdh lebih 10 thn. Terima kasih