Algoritma 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 adalah bentuk yang paling mudah dari teknik Collaborative Filtering barang yang berbasis pada rating. Kemudahan ini menyebabkan algoritma ini mudah untuk diterapkan dengan tingkat ketepatan yang tidak kalah dari algoritma dengan perhitungan yang jauh lebih sulit. Dan algoritma ini akhirnya digunakan sebagai dasar untuk pengembangan beberapa algoritma lain.
Diasumsikan ada 12 data barang yang dijual, dengan data sebagai berikut:
Barang | |||
---|---|---|---|
Pensil | Pensil 2B | Pensil 3B | Pensil 4B |
Pena | Pena Merah | Pena Biru | Pena Hitam |
Penggaris | Penggaris 15cm | Penggaris 20cm | Penggaris 30cm |
Buku | Buku Tulis | Buku Gambar | Komik |
Contoh data barang adalah sebagai berikut:
Dim barang() As String = New String() {"Pensil 2B", "Pensil 3B", "Pensil 4B", _ "Pena Merah", "Pena Biru", "Pena Hitam", _ "Penggaris 15cm", "Penggaris 20cm", "Penggaris 30cm", _ "Buku Tulis", "Buku Gambar", "Komik"}
Kemudian diketahui terdapat 10 pelanggan yang sudah memberi rating pada beberapa barang yang disukai pelanggan tersebut
Diasumsikan 10 data rating pelanggan tersebut adalah sebagai berikut:
Akan terdapat 12 kolom angka dengan urutan barang sesuai dengan urutan barang diatas
Angka 0 berarti tidak memberikan rating, selain itu berarti memberikan rating
Nama Pelanggan | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Pelanggan A | 3 | 3 | 1 | 10 | 3 | 3 | 4 | 10 | 2 | 8 | 0 | 3 |
Pelanggan B | 8 | 10 | 3 | 3 | 3 | 8 | 2 | 5 | 2 | 3 | 10 | 5 |
Pelanggan C | 8 | 5 | 4 | 2 | 4 | 4 | 9 | 0 | 9 | 2 | 10 | 5 |
Pelanggan D | 0 | 5 | 4 | 0 | 1 | 3 | 4 | 4 | 6 | 4 | 9 | 2 |
Pelanggan E | 3 | 9 | 6 | 2 | 1 | 1 | 1 | 3 | 8 | 7 | 9 | 3 |
Pelanggan F | 7 | 10 | 7 | 6 | 5 | 0 | 3 | 2 | 4 | 0 | 7 | 3 |
Pelanggan G | 5 | 0 | 4 | 9 | 5 | 4 | 9 | 0 | 5 | 1 | 0 | 8 |
Pelanggan H | 1 | 2 | 4 | 4 | 4 | 2 | 10 | 6 | 10 | 0 | 4 | 10 |
Pelanggan I | 2 | 9 | 4 | 4 | 0 | 1 | 4 | 6 | 1 | 0 | 7 | 7 |
Pelanggan J | 9 | 0 | 9 | 10 | 6 | 10 | 3 | 0 | 5 | 7 | 9 | 9 |
Contoh data rating pelanggan adalah sebagai berikut:
Dim pelanggan(9)() As Integer pelanggan(0) = New Integer() {3, 3, 1, 10, 3, 3, 4, 10, 2, 8, 0, 3} pelanggan(1) = New Integer() {8, 10, 3, 3, 3, 8, 2, 5, 2, 3, 10, 5} pelanggan(2) = New Integer() {8, 5, 4, 2, 4, 4, 9, 0, 9, 2, 10, 5} pelanggan(3) = New Integer() {0, 5, 4, 0, 1, 3, 4, 4, 6, 4, 9, 2} pelanggan(4) = New Integer() {3, 9, 6, 2, 1, 1, 1, 3, 8, 7, 9, 3} pelanggan(5) = New Integer() {7, 10, 7, 6, 5, 0, 3, 2, 4, 0, 7, 3} pelanggan(6) = New Integer() {5, 0, 4, 9, 5, 4, 9, 0, 5, 1, 0, 8} pelanggan(7) = New Integer() {1, 2, 4, 4, 4, 2, 10, 6, 10, 0, 4, 10} pelanggan(8) = New Integer() {2, 9, 4, 4, 0, 1, 4, 6, 1, 0, 7, 7} pelanggan(9) = New Integer() {9, 0, 9, 10, 6, 10, 3, 0, 5, 7, 9, 9}
Maka tentukan rating barang untuk barang-barang yang belum diberi rating pada pelanggan tertentu (yang bernilai 0 pada data tersebut)
Langkah-langkah penggunaan algoritma ini adalah
1. Masukkan data rating barang semua pelanggan pada semua variabel yang dibutuhkan
Dim ratingPelanggan As New Dictionary(Of Integer, Single)() For i As Integer = 0 To pelanggan.Length - 1 ratingPelanggan = New Dictionary(Of Integer, Single)() For j As Integer = 0 To pelanggan(i).Length - 1 If pelanggan(i)(j) <> 0 Then ratingPelanggan.Add(j + 1, pelanggan(i)(j)) Next so.TambahRating(ratingPelanggan) Next
Memasuki perhitungan pada fungsi TambahRating
1a. Lakukan perhitungan untuk setiap data rating pelanggan (poin 1a1 – 1a2)
For Each item1 As KeyValuePair(Of Integer, Single) In ratingPelanggan Dim item1Id As Integer = item1.Key Dim item1Rating As Single = item1.Value . . .
1a1. Simpan indeks barang tersebut
Items.Add(item1Id)
1a2. Lakukan perhitungan untuk setiap data rating pelanggan lainnya (poin 1a2a – 1a2d)
For Each item2 As KeyValuePair(Of Integer, Single) In ratingPelanggan . . .
1a2a. Jika indeks barang sama, maka lanjutkan perhitungan ke barang lainnya
Karena tidak perlu menyimpan data yang sudah pernah disimpan sebelumnya
If item2.Key <= item1Id Then Continue For
1a2b. Hitung nilai selisih rating antara 2 barang yang dibandingkan
Dim selisihRating As Rating If DictselisihRating.Contains(item1Id, item2Id) Then selisihRating = DictselisihRating(item1Id, item2Id) Else selisihRating = New Rating() DictselisihRating(item1Id, item2Id) = selisihRating End If
1a2c. Simpan nilai selisih barang tersebut
selisihRating.NilaiRating += item1Rating - item2Rating
1a2d. Simpan pula berapa ada berapa banyak pelanggan yang memberi rating untuk kedua barang tersebut
selisihRating.Frekuensi += 1
2. Tentukan pelanggan yang akan dicari rating barangnya
Console.WriteLine("Tentukan pelanggan yang akan dicari rating barangnya (1-10)") Dim input As Integer = CInt(Console.ReadLine)
3. Cari rating barang untuk barang-barang yang belum diberi rating pada pelanggan tersebut
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini
Dim prediksi As IDictionary(Of Integer, Single) = so.HitungPrediksi(r)
Memasuki perhitungan pada fungsi HitungPrediksi
3a. Lakukan perhitungan pada setiap indeks barang yang sudah memiliki rating (poin 3a1 – 3a3)
For Each itemId As Integer In Me.Items . . .
3a1. Jika barang tersebut sudah memiliki rating, maka lanjutkan ke perhitungan berikutnya
If ratingPelanggan.Keys.Contains(itemId) Then Continue For
3a2. Lakukan perhitungan untuk setiap data rating pelanggan lainnya (poin 3a2a – 3a2b)
For Each item As KeyValuePair(Of Integer, Single) In ratingPelanggan . . .
3a2a. Jika indeks barang sama, maka lanjutkan perhitungan ke barang lainnya
Karena Tidak perlu menghitung rating barang yang sama
If item.Key = itemId Then Continue For
3a2b. Hitung nilai rating masing-masing barang dengan rumus = frekuensi * selisih rating
Kemudian jumlahkan semua nilai rating ini
Hitung pula frekuensi dengan rumus penjumlahan dari semua frekuensi barang tersebut
If DictselisihRating.Contains(itemId, inputItemId) Then Dim selisihRating As Rating = DictselisihRating(itemId, inputItemId) itemRating.NilaiRating += selisihRating.Frekuensi * (item.Value + selisihRating.Ratarata * (If((itemId < inputItemId), 1, -1))) itemRating.Frekuensi += selisihRating.Frekuensi End If
3a3. Simpan data prediksi rating untuk masing-masing barang yang belum diberi rating
prediksi.Add(itemId, itemRating.Ratarata)
* 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 barang
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 barang per pelanggan Private Items As New HashSet(Of Integer)() 'Berapa banyak barang yang ada . . . End Class
Hasil akhir adalah: (klik untuk perbesar gambar)
Contoh modul / source code dalam bahasa VB (Visual Basic) dapat didownload disini:
[sdm_download id=”1552″ fancy=”0″]
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.
Leave a Reply