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: | 6 | – | 3 | 6 | – | 4 | 7 | – | 3 | 8 |
Pengguna 2: | – | 4 | 7 | – | 3 | 6 | – | 3 | 5 | – |
Pengguna 3: | 3 | 8 | – | 4 | 9 | – | 4 | 6 | – | 4 |
Pengguna 4: | 5 | 7 | 4 | 8 | – | 5 | 6 | – | 4 | 8 |
Pengguna 5: | 3 | 4 | 8 | – | 8 | – | 8 | 6 | 8 | 3 |
Pengguna 6: | 4 | 6 | – | 3 | 5 | – | 4 | 7 | – | 5 |
Pengguna 7: | 6 | – | 3 | 6 | – | 4 | 7 | – | 3 | 8 |
Pengguna 8: | 7 | 4 | 7 | 4 | 3 | 6 | – | 3 | 5 | – |
Pengguna 9: | 3 | 8 | 3 | – | 9 | – | 4 | 6 | – | 4 |
Pengguna 10: | 5 | – | 4 | 8 | – | 5 | 6 | – | 4 | 8 |
Pengguna 11: | – | 4 | 3 | – | 8 | 3 | 3 | 6 | 4 | 3 |
Pengguna 12: | 4 | 6 | 5 | 3 | 5 | – | 4 | 7 | – | 5 |
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.
apakah ada contoh perhitungan manual dari bipolar slope one atau perhitungan menggunakan excel ?
Mohon maaf untuk permintaan tersebut masih belum tersedia, tetapi untuk algoritma Slope One saya sudah pernah membagikan dalam bentuk dokumen excel. Silahkan anda lihat pada dokumen ini
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
Mohon maaf pertanyaan tersebut tidak berhubungan dengan pembahasan algoritma ini.