Tuesday, December 7, 2021

Bedah kode Aplikasi Storage di Android

Storage/Media penyimpanan merupakan hal yang penting pada aplikasi berbasis mobile, salah satunya di Android. Berdasarkan data penyimpanan, di Android terdapat 2 jenis yaitu: data temporary dan data persistence. Data temporary umumnya diproses melalui internal storage dalam bentuk cache, sedangkan data persistence disimpan secara permanen dalam suatu file.

Pada artikel ini akan kita bahas jenis yang kedua yaitu data persistence. Android menyediakan beberapa solusi untuk menangani data persistence, tergantung dari sifatnya apakah private atau public. Beberapa solusi yang dipilih harus sesuai dengan kebutuhan spesifiknya, seperti apakah data yang disimpan akan bersifat private atau boleh diakses secara bebas (public) serta berapa banyak space yang dibutuhkannya. Selain itu, Android juga menyediakan cara untuk membuka data private ke aplikasi lain (apabila diperlukan), melalui Content Provider (inshaAllah akan dibahas di posting lainnya).

Images are taken from flaticon

Storage data persistence ini terbagi lagi menjadi 2 yaitu: 
  • Internal storage: direktori private yang hanya diakses pada aplikasi itu sendiri.
  • External storage: direktori public dapat diakses secara lebih luas pada aplikasi itu sendiri dan aplikasi lainnya.
Karakteristik internal storage:
  • Selalu tersedia/dapat diakses.
  • Menggunakan file sistem dari device.
  • Hanya bisa diakses pada aplikasi itu sendiri, kecuali secara eksplisit diatur agar dapat dibaca/tulis.
  • Saat aplikasi di-uninstall/clear data, sistem akan menghapus data di internal strorage.
Karakteristik exsternal storage:
  • Tidak selalu tersedia/dapat dihapus.
  • Menggunakan file sistem dari device atau external seperti SdCard.
  • World-readable, semua aplikasi dapat membaca.
  • Saat aplikasi di-uninstall, sistem tidak menghapus file tersebut.

Bedah kode aplikasi MyStorage

Langkah awal dengan membuat project baru di Android Studio, disini saya menggunakan nama aplikasi MyStorage dengan nama package net.ariflaksito.mystorage, minimal SDK adalah Android 5.0. Setelah itu di kita akan membuat contoh penggunaan internal dan external storage, pada MainActivity akan saya buat dua tombol untuk menuju ke activity InStorageActivity dan ExStorageActivity menggunakan Intent.

Jika anda ingin memahami lebih detail tentang Intent bisa disimak video berikut ini:


Silahkan anda siapkan layout seperti pada tampilan dibawah ini:

Tampilan awal MainActivity

Setelah itu kita bisa membuat 2 activity baru (Empty Activity) dengan nama : InStorageActivity dan ExStorageActivity. Untuk layout kedua activity tersebut, kita siapkan 4 Button dan 1 TextView seperti pada tampilan berikut :

Tampilan layout editor file

Untuk kode dari layout tersebut seperti dibawah ini:

Pada kode xml diatas kita perlu tambahkan beberapa resource di file strings.xml karena data-data text kita simpan di file res/values/strings.xml. Jika nanti diperlukan localize resource seperti aplikasi yang support multi bahasa lebih mudah dalam me-manage string tersebut.

Kode Activity Internal Storage

Selanjutnya kita edit bagian inStorageActivity. Pertama kita tambahkan class attribut nama-file, button dan textview seperti ini:

public static final String FILENAME = "myfile.txt";
Button btnCreate, btnEdit, btnRead, btnDelete;
TextView tvRead;

Selanjutnya kita set masing-masing komponen tersebut dan kita tambahkan label untuk ActionBar pada method onCreate( ) seperti berikut:

String title = getResources().getString(R.string.title_in_storage);
getSupportActionBar().setTitle(title);

btnCreate = findViewById(R.id.btn_create_file);
btnEdit = findViewById(R.id.btn_edit_file);
btnRead = findViewById(R.id.btn_read_file);
btnDelete = findViewById(R.id.btn_del_file);
tvRead = findViewById(R.id.tv_read);

Selanjutnya kita buat 4 method baru untuk menjalankan masing-masing fungsi, yaitu: createFile( ), editFile( ), readFile( ) dan deleteFile( ). Pada model internal storage kita gunakan fungsi getFilesDir( ) untuk meng-akses path dari storage. Untuk kode method createFile( ) seperti berikut:

void createFile() {
String isiFile = "Hello world!";
File file = new File(getFilesDir(), FILENAME);

FileOutputStream outputStream = null;
try {
file.createNewFile();
outputStream = new FileOutputStream(file, true);
outputStream.write(isiFile.getBytes());
outputStream.flush();
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}

Secara lengkap kode fungsi-fungsi yang lain dalam Activity tersebut seperti berikut:

Lokasi/path dari myfile.txt tersebut pada device berada di /data/data/(package-name)/files/myfile.txt. Kita dapat melihat melalui device file explorer di Android Studio untuk lokasi file tersebut. Sedangkan dari device file explorer akses ke path tersebut tidak bisa kecuali device anda sudah di root.

Lokasi file di internal storage

Kode Activity External Storage

Pada metode penyimpanan external, kita perlu tambahkan beberapa kode untuk melakukan cek perijinan dari Android API 23 keatas. Selain mendefinisikan nama file, kita perlu mendefinisikan code request untuk kembalian dari cek perijinan tersebut. Selanjutnya kita siapkan method baru yaitu checkPermission( ) dan onRequestPermissionsResult( ).

Pada method tersebut aplikasi akan menampilkan alert/pop-up ke pengguna apakah pengguna memberikan ijin aplikasi untuk merubah data-data di storage. Jika pengguna menekan tombol allow maka akan dilanjutkan ke proses selanjutnya, jika tidak maka akses ke storage tidak bisa dilakukan oleh aplikasi.

Alert pada device untuk perijinan akses storage

Selain itu, untuk external storage ini perlu menambahkan code permission di AndroidManifest.xml yaitu sebagai berikut:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

Pada element <application> di file manifest juga perlu ditambahkan atribut berikut: 

android:requestLegacyExternalStorage="true"

Untuk akses lokasi/path dari file tersebut, disni kita menggunakan method yang berada di class Environment, yaitu: Environment.getExternalStorageDirectory(). Pada method createFile( ) dan editFile( ) juga perlu ditambahkan validasi untuk cek apakah media storage tersebut sudah di mount atau belum dengan kode berikut:

String state = Environment.getExternalStorageState();

if (!Environment.MEDIA_MOUNTED.equals(state)) {
return;
}

Layout di activity ExStorageActivity menggunakan file yang sama pada activity sebelumnya. Untuk kode lengkap nya seperti dibawah ini:

Anda bisa ujicoba aplikasi tersebut dengan membuat file baru, melihat isi datanya, kemudian cek di device explorer, apakah sudah ada nama file tersebut. Selain itu anda bisa coba edit isi file dan hapus file.

Kesimpulan

Kapan kita perlu menggunakan internal dan external storage? Internal storage paling baik digunakan jika tidak ada yang boleh mengakses file selain aplikasi itu sendiri. Sebaliknya, external storage paling baik digunakan jika file tidak memerlukan batasan akses, file dapat di share ke aplikasi lain atau user diperbolehkan akses file melalui usb atau pc.

Sunday, September 12, 2021

Mengenal Regresi linear dan perhitungannya

Disini kita akan bahas salah satu model statistik yang umum digunakan untuk Machine Learning untuk melakukan prediksi dengan cara supervised learning, yaitu regresi linear. Metode ini melibatkan 2 variabel dimana salah satunya adalah variabel independen (x) dan satu lagi adalah variabel dependen (y)

  • Independen berarti variabel ini sebagai variabel utama yang mungkin akan mempengaruhi nilai variabel kedua (dependen). 
  • Dependen berarti nilai variabel ini akan tergantung dari nilai variabel independennya, jika korelasi tinggi maka dependensi juga tinggi.

Untuk memudahkan pemahaman, kita gunakan data sample berat dan tinggi badan dari 10 orang sebagai berikut ini:

Data Tinggi Badan(cm) : 151,174,138,186,128,136,179,163,152,131
Data Berat Badan (Kg) : 63, 81, 56, 91, 47, 57, 76, 72, 62, 48

Regresi Linear adalah proses mencari garis linear yang menujukkan korelasi antara kedua variabel tersebut, garis linear itu akan didapat dengan sebuah persamaan :

y = ax + b atau y = w1x + w0

dimana: 
a atau w1 adalah slope / gradient / coefficient
b atau w0 adalah intercept / bias

Ciri dari problem regresi ini adalah kasusnya diminta menebak angka. Jenis outputnya bersifat continuous. Contoh lain dari regresi ini misalnya menebak curah hujan, harga rumah, jumlah kendaraan pemudik, dsb.

Perhitungan Manual

Untuk mendapatkan nilai coef(A) dan intercept/bias(B) digunakan rumus:


Gambar diatas menjelaskan detail perhitungan dari rumus tersebut kedalam excel. Dalam mencari nilai coef A dan intercept/bias B di excel digunakan formula pada sheet berikut:

A =((C25*C24)-(C23*C21))/((C25*C22)-(C23*C23))
B =((C21*C22)-(C23*C24))/((C25*C22)-(C23*C23))

Menggunakan Python

Perhitungan di python lebih sederhana, dimana kita bisa menggunakan library sklearn, seperti pada contoh kode dibawah ini:

Nilai coef dan intercept didapatkan dari kode baris ke-19 dan-20 diatas, sehingga akan didapatkan persamaan linear sebagai berikut:

y = 0.674 * x + (-38.455)

Sedangkan hasil dari plot data seperti pada gambar dibawah, dimana garis merah merupakan nilai prediksi dari model linear regresi dan titik-titik biru adalah 10 data training yang digunakan.

Regresi Linear Berganda

Regresi Linear Berganda adalah model regresi linear dengan melibatkan lebih dari satu variable bebas/independen dan persamaannya adalah

y = a1x1 + a2x2 + .. + anxn + b

Untuk pembahasan prediksi menggunakan regresi liner berganda kali ini akan diambil dari paper yang telah dipublish oleh mas Ervan Triyanto di jurnal Rabit, Juli 2019. Kasus ini adalah prediksi jumlah produksi padi di kabupaten Bantul dengan data yang digunakan dari tahun 2009 sampai dengan 2017. Di penelitian tersebut perhitungan nya diimplementasikan ke dalam aplikasi web menggunana PHP sebagai bahasa pemrogramannya. Di artikel ini akan digunakan python untuk perhitungannya dengan alasan kemudahannya.

Downlod pada link ini untuk mendapatkan artikelnya.  

Terdapat 1 variabel dependen yaitu jumlah produksi padi (dalam ton), sedangkan terdapat 3 variabel independen yaitu: curah hujan, luas lahan dan tingkat serangan hama. 

Berikut contoh code di Python untuk menghitung kasus produksi padi diatas:

Dari data diatas, didapatkan persamaan untuk prediksi sebagai berikut:

y = 5.929528x1 + 118.27991767x2 -175.71483753x3 + 8306.792151921123
dimana: luas lahan(x1), curah hujan(x2) dan hama(x3)

Evaluasi

Evaluasi untuk model linear regresi dapat dilakukan dengan beberapa metrik evaluasi seperti: MAE (Mean Absolute Error), MSE (Mean Squared Error) atau RMSE (Root Mean Squared Erorr).

RMSE merupakan salah satu cara untuk mengevaluasi model regresi linear dengan mengukur tingkat akurasi hasil perkiraan suatu model. RMSE dihitung dengan mengkuadratkan error (prediksi – observasi) dibagi dengan jumlah data (rata-rata), lalu diakarkan. RMSE tidak memiliki persamaan:

Pada kode python diatas, evaluasi model dituliskan pada baris kode ke-50 dengan menggunakan library metrics dari sklearn dan didapatkan score RMSE yaitu: 3.5045

Kesimpulan

Meskipun Linear regresi mudah diimplementasikan untuk melakukan prediksi pada data yang bersifat continuous, tetapi terdapat juga kekurangannya yaitu mudah terjadi overfitting dan sulit dilakukan prediksi jika relasi antara variabel dipenden dan independen tidak linear atau korelasi sangat rendah.

Jika membutuhkan dataset tersebut bisa tulis email pada komentar ya.. Bisa anda gunakan untuk penelitian dengan metode machine learning lainya dan silahkan dibandingkan nilai errornya dengan penelitian ini.

Referensi

  1. Jimy, Regresi Linier dengan R dan Python, https://medium.com/@jrendz/regresi-linier-dengan-r-dan-python-ebb80662c6da
  2. Jasme Moody,What does RMSE really mean?, https://towardsdatascience.com/what-does-rmse-really-mean-806b65f2e48e
  3. Triyanto, E., Sismoro, H., & Laksito, A. (2019). Implementasi Algoritma Regresi Linear Berganda untuk Memprediksi Produksi Padi di Kabupaten Bantul. Rabit : Jurnal Teknologi Dan Sistem Informasi Univrab, 4(2), 73-86. https://doi.org/10.36341/rabit.v4i2.666

Friday, August 20, 2021

Menghitung Similarity dan Prediksi rating pada Collaborative filtering menggunakan Python

Melanjutkan artikel sebelumnya, bagaimana menghitung similarity antara user di sistem rekomendasi collaborative filtering(CF) dengan menggunakan excel, pada artikel ini saya akan share menghitung similarity user dan prediksi rating dengan menggunakan bahasa python di jupyter notebook.

Prediksi rating

Pada eksperimen ini akan digunakan sample data yang sama seperti pada artikel sebelumnya, lebih detail bisa anda simak disini: "Memahami Collaborative filtering di Sistem rekomendasi". Untuk pembahasan notebook tersebut saya bagi kedalam 2 bagian yaitu: User-based dan Item-based.

User-based CF Notebook

Pertama diperlukan membuat sample data dari library pandas yang kemudian kita susun menjadi matrix untuk user, item, dan rating. Pada matrix tersebut, nilai Nan/kosong di ubah menjadi rating dengan nilai 0.


Matrix user-based rating

Selanjutnya kita akan buat nilai rerata dari tiap user dan membuat matrix baru dengan nilai rating diambil dari selisih rerata dan rating asli.


Untuk menghitung similarity, dapat menggunakan library dari sklearn yaitu cosine_similarity. Disini kita perlu membuat suatu fungsi dengan parameter yaitu matrix rating, user aktif (yang akan kita cari nilai rating kosongnya) dan nilai k (jumlah tetangga/neighbor).


Output dari fungsi diatas akan menghasilkan nilai similarity dari user: Arif ke user lainnya berdasar dari matrix yang kita inputkan di parameter.

(['Don', 'Bob'], [0.7071067811865476, 0.30151134457776363])
Langkah terakhir adalah kita buat fungsi predict( ) untuk menghitung prediksi nilai kosong dari matrix tersebut pada user Arif di item-4.


Output dari fungsi tersebut adalah prediksi rating pada kolom item-4 seperti berikut:

array([[4.42526623],
       [1.93594684],
       [3.42953847]])

Item-based CF Notebook

Sedikit berbeda dengan code sebelumnya, pada code item-based ini kita akan melakukan prediksi pada beberapa rating kosong. Mari kita bedah code tersebut dari awal. Dimulai dari membuat matrix rating data sample data seperti pada postingan ini: "Memahami Collaborative filtering di Sistem rekomendasi".


Matrix item-based rating

Berikutnya kita bisa buat fungsi untuk menghitung similarity antara 2 item


Sedangkan fungsi predict( ) untuk item-based ini sedikit lebih complicated, berikut langkah-langkah penjelasannya:
  1. Perulangan pertama adalah menjadikan nilai setiap item menjadi list
  2. Perulangan ke-2 kita gunakan untuk memfilter rating 0 dari tiap user
  3. Didalam perulangan ke-2, terdapat perulangan lagi untuk menghitung nilai prediksi dengan membaca per-baris dari rating item.

Setelah kita running fungsi diatas, maka akan menghasilkan output dalam bentuk list beberapa rating prediksi dari rating 0 di matrix yang kita inputkan pada parameter.

[2.4899844588770113, 3.4286096052067627, 2.0]
Sebagai informasi, pada kedua kode diatas belum ada fungsi untuk mengenerate item rekomendasi, disini hanya fokus pada bagaimana menghitung nilai similarity dan prediksi saja. Jika anda ingin mendapatkan kode lengkap di file python notebook (*.ipynb), silahkan isi pada kolom komentar dengan email anda, inshaAllah akan saya share kode lengkap tersebut.

Referensi

  1. Gambar diambil dari https://www.formstack.com/resources/blog-new-rating-field
  2. User-based collaborative filtering, https://www.geeksforgeeks.org/user-based-collaborative-filtering/
  3. Item-based collaborative filtering, https://www.geeksforgeeks.org/item-to-item-based-collaborative-filtering/

Sunday, August 8, 2021

Keep productive during the pandemic


Since the beginning of 2020, most people have spent more than two-thirds of a day at home. Firstly, it seems enjoyable, because they do not need to go to school or the office as usual. However, it becomes hard to deal with it as time goes by since we are social creatures.

I really concede that it is a big problem when it happens to my students. The online meeting could not substitute offline classes where students learn and spend time discussing anything with their friends.

I will share amazing tips for students to deal with their mood to keep productive and finish studying on time.

1. Wake up early. 

Most computer engineering students enjoy doing their work, such as writing code, testing systems, or resolving bugs at midnight. Try to change your habit as I wrote in this article, "Kapan waktu efektif coding?"

2. Doing exercise

It is easy for people who have sport hobbies like cycling, running, or swimming to do it regularly. However, others think it will be a serious difficulty to start a routine exercise. You can download an exercise video from youtube, "7 minutes workout by Lifehack". I suggested starting small and regular ( twice or a third a week, every day will be better). For me, it is a tough moment; as a basketball fan, I should await my hobby activity until safe condition.

3. Clean up your desk and computer

It is believed that a tidy and clean workspace could maintain a great feeling. As a result, time will be productive to finish work. In this technology era, a computer is a vital part of students and workers. Unnecessary files in several folders sometimes make us frustrated. Allocate time for organizing this problem, although it is a dull activity.

Clean Downloads directory

4. Make it a habit

When you make any points above regularly, it is possible to become a healthy habit. Keep on track, and you will get advantages in your study.

Keep healthy. Stay strong!

Thursday, July 8, 2021

Memahami Collaborative filtering di Sistem rekomendasi

Collaborative filtering adalah teknik dalam sistem rekomendasi yang populer digunakan saat ini. Banyak penelitian yang membahas tentang teknik ini karena beberapa keunggulannya seperti: menghasilkan serendipity(tak terduga) item,  sesuai trend market, mudah diimplementasikan dan memumgkinkan diterapkan pada beberapa domain (book, movies, music, dll). 

Pengenalan sistem rekomendasi dan teknik lainnya bisa anda temukan pada artikel berikut:

Cara kerja teknik ini adalah dengan memanfaatkan data pada komunitas dengan cara mencari kemiripan atar pengguna, yaitu mengasumsikan bahwa pengguna yang memiliki preferensi serupa di masa lalu cenderung memiliki preferensi yang sama di masa depan. Pada dasarnya kita akan lebih percaya dengan rekomendasi dari orang yang memiliki preferensi sama dengan kita, inilah dasar yang digunakan oleh collaborative filtering dalam mengenerate item rekomendasi.


Dalam menghasilkan rekomendasi, sistem perlu mengumpulkan data. Tujuan dari pengumpulan data ini adalah untuk mendapatkan ide preferensi pengguna, dimana nantinya akan dibuat suatu rekomendasi berdasarkan preferensi tersebut. Terdapat 2 cara dalam mengumpulkan data, yaitu: Implicit dan Explicit.

Explicit merupakan cara pengumpulan informasi yang membutuhkan effort dari pengguna dengan memberikan feedback terhadap sistem, seperti mengisikan rating pada item (skala 1-5 atau skala lainnya) dan memilih tombol like atau dislike. Di sisi lain, implisit tidak membutuhkan interaksi dari pengguna ke sistem. Dengan kata lain, sistem secara otomatis mempelajari behavior dari pengguna saat menggunakan sistem, seperti melakukan perekaman informasi lama waktu saat melihat item, genre/kategori apa saja yang sering dilihat dan item apa saja yang pernah dibeli. Cara explisit lebih susah diterapkan, karena tidak semua pengguna melakukan penilaian terhadap item, hal ini yang akan menyebabkan kendala pada teknik collaborative filtering karena banyaknya rating kosong.

Collaborative filtering sendiri terbagi menjadi 2 bagian, yaitu Memory-based dan Model-based. Memory-based melakukan komputasi secara real-time, sedangkan Model-based menggunakan beberapa teknik di machine learning atau matrix factorization untuk melakukan training model terlebih dahulu dan bisa dilakukan secara offline. Memory-based memiliki keunggulan dalam hal kemudahan implementasi tetapi terkendala pada ukuran matrix besar yang menyebabkan scalablity dalam perhitungan. Teknik Memory-based terbagi ke dalam 2 class, yaitu: User-based dan Item-based. Teknik lain yaitu Model-based dengan beberapa metode seperti: Matrix factorization, Neural network, Bayesian, dll akan saya bahas di artikel lain. Kali ini saya akan detail bahas untuk yang Memory-based Collaborative filtering.

Kategori collaborative filtering


User-based vs Item-based CF

Memory-based collaborative filtering sering disebut juga dengan neighborhood-based collaborative filtering algorithms. Berikut ini penjelasan detail dari kedua class dalam Memory-based:

1. User-based collaborative filtering

Merupakan teknik yang digunakan untuk memprediksi item yang mungkin disukai pengguna berdasarkan penilaian yang diberikan pada item tersebut oleh pengguna lain yang memiliki selera yang sama dengan pengguna target. Berikut ini contoh penerapan dalam excel:



Pada matrix diatas, pengguna target adalah Arif, dimana kita akan memprediksi rating pada item_5. Tahap awal yang dilakukan adalah mencari pengguna yang memiliki preferensi sama dengan Arif. Lakukan perhitungan rata-rata rating dari setiap pengguna untuk item selain item_5, dihasilkan seperti berikut:



Kolom terakhir tersebut merupakan rata-rata dari tiap pengguna, misalkan Arif = (5+4+1+4)/4 = 3.50. Jika anda gunakan excel maka akan sangat cepat melakukan hitungan tersebut. Selanjutnya kita buat matrix baru yang berisi selisih dari rating asal dengan nilai rata-rata dari tiap pengguna.


Jika anda perhatikan rating Arif - item_1 didapatkan dari rating asal dikurangkan nilai rerata pengguna, yaitu:  5 - 3.5 = 1.5, rating Arif - item_2, yaitu:  4 - 3.5 = 0.5, dan seterusnya. Tahapan berikutnya adalah kita menghitung nilai similarity antar Arif dengan pengguna lainnya. Disini akan digunaan rumus cosine similarity yaitu seperti ini:

Misalkan kita akan hitung nilai similarity Arif dan Bob, maka didapatkan hasil seperti dibawah:

Dengan bantuan excel cukup kita drag saja rumus tersebut dan hasil dari similarity dari Arif dan ketiga pengguna lainnya adalah sebagai berikut:


Dari hasil perhitungan tersebut terlihat bahwa nilai similarity paling tinggi adalah antar Arif dengan Don yaitu 0.707. Nilai cosine similarity semakin besar nilai nya (mendekati 1) maka semakin mirip kedua vektor tersebut. Selanjutnya adalah prediksi rating untuk pengguna Arif pada item_5. Untuk menentukan prediksi ini kita bisa tentukan threshold/batas nilai kemiripan dari similarity pengguna, misalkan kita asumsikan similarity di dataset ini jika nilainya lebih dari 0.3, maka yang akan kita lakukan perhitungan data dari Arif, Bob dan Don. Clark tidak masuk perhitungan karena nilai similarity dibawah 0.3 (threshold yang kita tentukan). Untuk penentuan nilai threshold ini tidak ada aturan baku, jadi jika anda melakukan eksperimen silahkan di uji coba beberapa nilai threshold yang akan digunakan.

Dari rumus diatas kita bisa melakukan perhitungan untuk prediksi rating Arif ke item_5 dengan menggunakan neighbor Bob dan Don, yaitu nilai rerata Arif dijumlahkan dengan sigma dari nilai similarity antar pengguna dikalikan selisih rating dan rerata dibagi nilai absolute dari similarity beberapa pengguna tersebut.


Hasil dari prediksi rating tersebut (Arif - item_5) adalah 4.425. Bagaimana selanjutnya untuk mengenerate item rekomendasinya? Simulasi diatas hanya prediksi satu rating saja, untuk menghasilkan item rekomendasi kita bisa gunakan data real dengan jumlah data yang besar. Misalkan pada dataset real, rating Arif masih kosong di sejumlah item, misalkan item_5, item_13, item_104, item_451, item_533, dst. Dari hasil perhitungan prediksi pada rating-rating kosong tersebut, kita bisa urutkan dari rating besar ke kecil, kemudian iem-item berdasar rating tersebut bisa kita jadikan list sebagai item rekomendasi, kita juga bisa batasi sejumlah item saja(misal 5 item atau 10 item), atau biasa disebut Top-N recommendations.

2. Item-based collaborative filtering

Item-based collaborative filtering pertama kali digunakan oleh Amazon pada tahun 1998. Teknik ini tidak mencocokan kemiripan antar pengguna, tetapi melakukan pencocokan setiap item yang dinilai/rating pengguna dengan item serupa, lalu menggabungkan item serupa tersebut ke dalam daftar rekomendasi. Secara detail proses nya sebagai berikut:



Pada contoh dataset diatas, kita akan melakukan prediksi dari 3 rating kosong, yaitu: Arif - item_2, Bob - item_3 dan Don - item_1. Rumus yang kita gunakan masih sama pada user-based collaborative filtering, yaitu cosine similarity. Tahap awal adalah kita lakukan proses similarity dari ketga item tersebut, yaitu:

similarity item_1 dan item_2
i1 = 5(B1) + 3(C1)
i2 = 2(B2) + 3(C2)
sim(i1, i2) = (5*2)+(3*3)/sqrt(5^2 + 3^2) . sqrt(2^2 + 3^2) = 0.90

Perhatikan pada perhitungan diatas, hanya rating yang tidak kosong pada kedua item diatas yang dilakukan untuk perhitungannya, yaitu rating pada item_1 dan item_2 yang dinilai oleh Bob dan Clark.


Tabel diatas adalah hasil perhitungan di excel dari similarity ketiga item tersebut. Selanjutnya adalah kita lakukan prediksi untuk rating-rating kosong diatas. Berikut ini contoh perhitungan prediksi untuk rating(Arif, item_2) 

Dari hasil perhitungan di excel dari ketiga rating kosong tersebut didapatkan hasil seperti ini


Proses berikutnya dalam menghasilkan item rekomendasi sama seperti pada proses user-based diatas, yaitu dengan menghitung similarity antar item, melakukan prediksi rating kosong, kemudian melakukan ordering untuk dijadikan item rekomendasi.

Kesimpulan

Collaborative filtering merupakan teknik/paradigma yang populer digunakan dalam sistem rekomendasi. Terdapat 2 metode yang digunakan dalam collaborative filtering yaitu: memory-based dan model-based. Memory-based memiliki keunggulan dalam kemudahan proses perhitunganya tetapi memiliki kendala dalam scalabilty, karena metode ini berjalan secara real-time dan terkendala jika matrix user-item berukuran besar. Dua cara dalam perhitungan di memory-based, yaitu: user-based dan item-based, kedua teknik tersebut sama-sama memanfaatkan rating pengguna terhadap item dalam proses perhitungannya. Pada user-based dilakukan proses perhitungan similarity/kesamaan atara pengguna, sedangkan item-based melakukan proses perhitungan similarity antar item.

Bagaimana kita melakukan siimulasi perhitungan data berukuran besar, pastinya menggunakan excel akan sangat merepotkan. InshaAllah pada artikel berikutnya saya akan bahas cara perhitungan nya menggunakan python di jupyter notebook atau google colab.

Jika anda membutuhkan file excel dari perhitungan diatas, silahkan tuliskan alamat email pada kolom komentar, segera akan saya kirimkan file excel tersebut. Semoga bermanfaat!

Referensi

  1. Recommender System, A Computer Science Comprehensive Exercise, Carleton College, https://www.cs.carleton.edu/cs_comps/0607/recommend/recommender/collaborativefiltering.html
  2. Pengantar Recommender System, Yotube: Mas Baizal, https://www.youtube.com/watch?v=gu-tf3tzMgA&t=20s
  3. F.O.Isinkaye, et al, Recommendation systems: Principles, methods and evaluation, Egyptian Informatics Journal Volume 16, Issue 3, November 2015, Pages 261-273
  4. User-based collaborative filtering, https://www.geeksforgeeks.org/user-based-collaborative-filtering/
  5. Item-to-item based collaborative filtering, https://www.geeksforgeeks.org/item-to-item-based-collaborative-filtering/
  6. Item-based collaborative filtering in Python, https://predictivehacks.com/item-based-collaborative-filtering-in-python/


Saturday, April 17, 2021

Sistem rekomendasi Non-personalized vs Personalized

Di akhir pekan bulan Ramadhan ini kembali lagi saya akan share tentang salah satu topik menarik di sistem rekomendasi yaitu tentang personalisasi. Secara umum sistem rekomendasi terbagi menjadi tipe personalized dan non-personalized.

Sedangkan menurut Kim Falk dalam bukunya "Practical Recommender System" (silahkan bisa tulis alamat email di comment jika ingin versi PDF nya 😉), menjelaskan terdapat 3 tipe level dalam personalisasi ini, yaitu sebagai berikut:

Kim Falk - Practical Recommender System

Mari kita bahas lebih mendalam satu-persatu

1. Non-personalized

Merupakan tipe personalisasi yang sederhana, dimana hasil generate dari teknik rekomendasi ini tidak membedakan antar pengguna. Semua pengguna akan mendapatkan item rekomendasi yang sama. Biasanya digunakan untuk menampilkan item favorit pada film, produk terlaris di e-commerce atau top hits music chart di sistem rekomendasi musik. 

Pada tipe ini kita tidak perlu mengetahui informasi khusus tentang preferensi pengguna. Jadi, kita tidak mengumpulkan data historis dari penilaian atau pembelian pengguna untuk menghasilkan rekomendasi. Pada e-commerce biasanya terdapat juga mode rekomendasi seperti ini "People who buy X also buy Y", misalkan, Orang yang membeli Smartphone juga membeli Phone Cover.

Rekomendasi Non-personalized pada Amazon


Umumnya teknik rekomendasi yang digunakan pada Non-pesonalized yaitu IMDb weight rating atau Content-based filtering

2. Semi/Segment-personalized

Berikutnya adalah personalisasi dengan segmentasi khusus, sebagai contoh pengguna dengan kesamaan usia, lokasi, distinct pattern seperti pengusaha atau pelajar, akan mendapatkan rekomendasi yang sama berdasarkan segment tersebut.

Contoh lainnya adalah seperti pada sistem rekomendasi music yang dijalankan pada smartphone, dimana aplikasi tersebut dapat mendeteksi apakah pengguna sedang bergerak(jogging, running, cycling atau sedang mengemudi) atau pengguna tidak beraktifitas, seperti menikmati kopi di cafe sambil mendengarkan musik, maka item rekomendasi yang dihasilkan akan berbeda dari kedua segment tersebut.

Sistem ini tidak menggunakan history dari data anda, tetapi karena anda berada pada group atau segment tertentu maka akan mendapatkan item rekomendasi yang sama pada setiap segment. Metode yang digunakan pada tipe ini masih sama seperti pada tipe sebelumnya yaitu Non-personalized, dimana dengan tambahan filter berdasarkan segment yang bisa diambil dari informasi pengguna.

3. Personalized

Personalized recommendation ini didasarkan pada data tentang pengguna yang menunjukkan bagaimana pengguna telah berinteraksi dengan sistem sebelumnya. Dengan kata lain, pada rekomendasi ini akan dihasilkan item yang khusus pada masing-masing pengguna.

Tipe rekomendasi ini paling banyak digunakan pada beberapa layanan populer seperti Amazon, Netflix, Youtube, dsb. Hal ini dirasa paling sesuai dengan filter yang dibutuhkan setiap pengguna sehingga sangat perlu di implementasikan pada layanan tersebut. Terdapat 2 cara untuk mendapatkan interaksi dari pengguna ke sistem yaitu dengan cara implisit(browsing history) dan explisit(rating).

Collaborative filtering paling banyak digunakan pada tipe ini, dimana preferensi pengguna akan di komparasi kemiripannya dengan pengguna lain kemudian prediksi rating akan diterapkan untuk mendapatkan item rekomendasi tersebut.

Personalized recommendation di Netflix

Kesimpulan

Jika kita ingin membuat personalized recommendation, maka perhatikan data-data history rating dari pengguna. Jika terdapat pengguna baru dan belum ada history ratingnya, akan menyebabkan hasil rekomendasi kurang sesuai (biasa disebut cold start problem). Sedangkan pada tipe non-personalized dan segment-personalized tidak membutuhkan data rating tersebut, karena menggunakan atribut dari setiap item product.

Sistem rekomendasi dengan tipe Non-personalized merupakan cara yang sederhana, lebih jauh lagi dalam bukunya, Francesco Ricci - Recommender System Handbook, mengatakan bahwa tipe ini efektif dalam beberapa situasi tetapi penelitian tentang Recommender system tidak ditujukan untuk tipe ini.

Tidak perlu dishare artikel ini jika dirasa tidak bermanfaat yaa.. 

Referensi

    1. Anna Makharadze, 1) Introduction to Recommendation Systems, https://medium.com/machine-learning-and-artificial-intelligence/1-introduction-to-recommendation-systems-for-beginners-b50c86f5fccf
    2. Kim Falk, Practical Recommender System
    3. Francesco Ricci, Recommender System Handbook

    Saturday, March 27, 2021

    Simple rekomendasi dengan Formula IMDb Weighted Rating

    Alhamdulillah setelah diskusi seputar penelitian bidang sistem rekomendasi dengan rekan-rekan di kampus, akhirnya ter inisialisasi group telegram untuk kolaborasi penelitian dan belajar bersama di bidang information retrieval dan sistem rekomendasi di url berikut: https://t.me/joinchat/CH_ihoMW7XdjZTA1

    Oiyaa, siapapun yang ingin belajar bersama boleh koq join di group tersebut, semoga saja bisa bermanfaat. Semoga kita bisa konsisten sharing-sharing setiap akhir pekan.. mohon doanya ya.

    Langsung aja degh, kita bahas kembali tentang metode yang sangat simple pada sistem rekomendasi yaitu dengan menggunakan rumus yang ada di IMDb (Internet Movie Database). Metode ini termasuk ke dalam konsep non-personalized, jadi setiap users/costumers akan mendapatkan suatu list item rekomendasi yang sama, tidak ada interferensi dari history atau kemiripan item atau pengguna.

    Ide untuk menggunakan metode rekomendasi ini adalah:

    1. Film-film yang lebih populer akan memiliki kemungkinan yang lebih besar untuk disukai juga oleh rata-rata penonton.
    2. Model ini tidak memberikan rekomendasi yang personal untuk setiap tipe user. 
    3. Implementasi model ini pun juga bisa dibilang cukup mudah, yang perlu kita lakukan hanyalah mengurutkan film-film tersebut berdasarkan rating dan popularitas dan menunjukkan film teratas dari list film tersebut.
    Berikut ini formula/rumus yang digunakan untuk mengenerate score pada IMDb Weighted rating:


    Dimana:
    v: jumlah votes untuk film tersebut
    m: jumlah minimum votes yang dibutuhkan supaya dapat masuk dalam chart
    R: rata-rata rating dari film tersebut
    C: rata-rata jumlah votes dari seluruh semesta film
    
    Formula ini digunakan IMDb untuk perhitungan Top Rated 250 titles, dengan perhitungan Bayesian estimate yang menghitung jumlah vote dari setiap judul, vote minimum untuk masuk ke dalam daftar, dan rata – rata vote dari keseluruhan judul.

    Berikut ini contoh kode di python (Jupyter notebook) untuk perhitungannya, disini saya masih menggunakan dataset seperti pada artikel sebelumnya untuk rekomendasi dengan metode content-based filtering yaitu di domain hotel.

    Code 


    Untuk kode lengkap dan dataset yang saya gunakan bisa langsung meluncuuur di github berikut ini: https://github.com/ariflaksito/imdb-wr-recsys.

    Untuk skripsi ataupun TA, metode ini terlalu sederhana untuk dijadikan topik/tema penelitian. Saran saya anda bisa menggabungkan dengan metode yang lainnya, misalnya di kombinasikan dengan content-based filtering atau dengan collaborative filtering.

    Referensi

    1. DQLab Academy, Building Recommedner system, https://academy.dqlab.id/main/package/practice/212
    2. IMDb, Help, https://help.imdb.com/article/imdb/track-movies-tv/ratings-faq/G67Y87TFYYP6TWAV?ref_=helpms_helpart_inline#calculatetop
     




    Monday, January 4, 2021

    Menggunakan SQLite di Android

    Alhamdulillah.. awal tahun ini dimulai dengan posting artikel tentang SQLite di Android, semoga bermanfaat untuk rekan-rekan mahasiswa yang sebentar lagi akan menghadapi ujian akhir semester.

    Android telah menyediakan salah satu mekanisme penyimpanan database terstruktur dan berelasi dengan menggunakan SQLite. SQLite merupakan database yang bersifat open source yang mendukung operasi relasi standar yang umum terdapat pada engine database seperti sintaks SQL dan operasi transaksi. Meskipun berjalan seperti database, pada umumnya sqlite berukuran kecil dan mampu berjalan pada peranti dengan memori terbatas seperti smartphone.

    Pada artikel kali ini kita akan membuat aplikasi Android untuk melakukan CRUD pada tabel student di SQLite dimana terdapat 3 field yaitu, id, nim dan nama.


    Kita bisa mulai dengan membuat project baru bernama MyStudents dengan tipe Empty Activity bernama MainActivity dan target minimum API Level bisa kita pilih 21.

    Langkah pertama adalah buat package baru dengan nama model, kemudian buat class di Java dengan nama Students.java seperti code berikut:

    Pada class Student diatas kita perlu implement ke Serializable supaya nantinya saat proses edit data, object student tersebut dapat dikirimkan melalui intent ke activity UpdateActivity

    Selanjutnya buat package baru kembali dengan nama db dan buat class baru dengan nama DbHelper.java, berikut codenya:

    Code diatas merupakan Class bantuan untuk pengolahan database DDL(Data Definition Language) dan DML(Data Manipulation Language), dimana untuk proses DDL terdapat pada method onCreate dan onUpgrade, sedangkan proses DML pada method lainnya.

    Tahapan selanjutnya adalah kita akan buat proses insert data ke database, disini akan digunakan MainActivity untuk implementasinya. Pertama kita siapkan terlebih dahulu layout di activity_main.xml dengan code dibawah ini:

    Kemudian pada MainActivity kita lengkapi code nya seperti dibawah:

    Pada code diatas sebelum proses insert ke database kita lakukan terlebih dahulu validasi untuk pengisian EditText nim dan nama, dimana tidak boleh kosong. Selanjutnya, jika validasi terpenuhi maka proses insert akan dilakukan dengan menggunakan object dari class DBHelper pada method addUserDetail( ).

    Jika AndroidStudio dan versi Java anda sudah mendukung lambda, maka seperti pada code diatas, penulisan onClickListerner bisa kita sederhanakan dengan lambda. Pada blok code yang berwarna grey/abu-abu bisa anda select kemudian tekan tombol Alt+Enter, maka akan muncul pilahan "Replace with lambda". Sampai proses ini kita sudah bisa melakukan proses input data ke database, silahkan bisa anda ujicoba run aplikasi tersebut

    Proses insert data


    Proses selanjutnya adalah menampilkan data menggunakan RecyclerView, disini kita perlu membuat class adapter dengan nama StudentAdapter yang bisa kita letakan di package adapter dan juga activity baru dengan nama ListStudentActivity. 

    Untuk melengkapi adapter tersebut, kita buat terlebih dahulu layout untuk menampilkan data Student di file item_student.xml dan activity_list_student.xml dengan code berikut:

    Berikutnya file StudentAdapter kita lengkapi seperti code dibawah ini:

    Pada code diatas masih menampilkan notice error pada baris ke-36 dikarenakan kita belum membuat file UpdateActivity untuk proses edit data. Kita bisa comment terlebih dahulu baris ke-36, 37 dan 38 supaya tidak menyebabkan error, selanjutnya nanti bisa kita uncomment kembali untuk melanjutkan proses edit data.

    Berikutnya pada file ListStudentActivity, kita tambahkan code dibawah ini untuk menampilkan data-data yang sudah ada di database ke dalam RecyclerView

    Kita bisa melakukan ujicoba dengan menjalankan/run project tersebut, jika sesuai maka aplikasi tersebut akan menampilkan list data student dan bisa kita lakukan penghapusan dengan klik tombol delete pada list di masing-masing student. Sebelum data tersebut dihapus, aplikasi akan memunculkan alertDialog dimana untuk memastikan user benar-benar akan menghapus data tersebut. Proses ini dilakukan pada file AdapterStudent baris ke-41 sampai dengan baris ke-60.

    Menampilkan data students


    Sedangkan proses edit data belum bisa dilakukan, saat kita tekan tombol edit maka tidak akan terjadi action apapun. Untuk melengkai fitur edit, kita buat activity baru dengan  nama UpdateActivity. Berikut ini code untuk UpdateActivity dan layout nya yaitu activity_update.xml

    Setelah code dari kedua file diatas lengkap, kita lakukan uncomment pada file StudentAdapter pada baris ke-36, 37 dan 38. Kemudian bisa kita jalankan aplikasi tersebut dan bisa kita ujicoba untuk melakukan edit pada data student.

    Setelah proses edit berhasil maka akan ditampilkan list daftar student, supaya RecyclerView dapat update data terakhir maka perlu ditambahkan override method onResume di activity, seperti pada code di file ListStudentActivity pada baris ke-25 s/d baris ke-31

    Silahkan anda coba untuk mempraktikan code diatas secara berurutan ya, dipahami masing-masing keterangan pada code tersebut. Jika ada pertanyaan lebih lanjut lagi bisa tulis di komentar, atau jika membutuhkan code lengkapnya bisa tulis di komentar juga alamat email anda, nanti saya kirim code project secara lengkap.

    Video tutorial lengkap bisa disimak disini:



    Referensi:

    1. Dicoding Acedemy - Belajar Fundamental Aplikasi Android, Codelab Aplikasi Catatan, https://www.dicoding.com/academies/14/tutorials/527
    2. Android SQLite Tutorial | CRUD Operation Example, https://demonuts.com/android-sqlite/#simple