Menyisipkan Machine Learning Pada Aplikasi Web

Aplikasi web biasanya merupakan aplikasi bertipe front-end dimana antara user dengan machine saling berinteraksi. Sementara itu machine learning, bagian khusus dari data mining, kebanyakan bekerja sebagai back-end. Nah, agar machine learning terhubung dengan user, dibutuhkan user interface, salah satunya adalah aplikasi berbasis web. Python, sebagai bahasa yang memang dikhususkan untuk back-end menyediakan pula aplikasi front-end dalam bentuk web lewat beberapa framework-nya, salah satunya adalah Flask.

Menyisipkan Machine Learning

Bagaimana cara kerja Flask, silahkan lihat pos saya terdahulu. Beberapa library perlu dipersiapkan dari yang diperuntukan menjalankan machine learning (Pandas, NumPy, Keras, SKlearn, dan lain sebagainya) hingga yang memang khusus untuk Flask. Untuk studi kasus dipilih Support Vector Machine (SVM) untuk mengklasifikasi data penentuan beasiswa. Diperlukan tiga file program dengan satu file data. Tiga file tersebut antara lain satu file utama python dan dua file html untuk interface (main program untuk inputan dan result.html untuk keluaran). Berikut tampilan program utamanya.

Perhatikan letak training SVM setelah proses impor pustaka-pustaka yang dibutuhkan. Dua fungsi (template_test dan predict) dibutuhkan berturut-turut ketika program dieksekusi dan ketika tombol ditekan (via browser).

Testing

Untuk mengujinya, perlu memahami bagaimana konsep environment di python. Cara termudah adalah lewat Anaconda Navigator. Pastikan di environmen terpasang pustaka-pustaka yang dibutuhkan (bisa lewat PIP terminal ataupun lewat Anaconda). Buka environment yang tepat dengan menekan mouse di nama environmen tersebut dilanjutkan dengan mengklik kanan dan pilih “terminal” untuk membuka terminal yang mengarah ke environment tersebut. Environment ditunjukan dengan dalam kurung di terminal, misalnya kasus saya nama environmennya “tensorflow” (hanya nama saja).

Setelah masuk terminal arahkan folder ke lokasi program utama python-nya (berekstensi *.py). Untuk jelaskan silahkan buka video berikut ini. Sekian, semoga bermanfaat.

Untuk rekan-rekan mahasiswa yang sudah setia mengikuti perkuliahan (Univ. Islam 45, Univ. Nusa Putra, dan Univ. Bhayangkara Jakarta Raya) walaupun secara online di masa pandemic COVID-19, kami mengucapkan terima kasih sebesar-besarnya karena secara tidak langsung turut membantu terciptanya buku revisi “Data Mining” yang kini disertai bahasa Python yang Insya Allah sudah melewati revisi terakhir dan siap cetak.

Flask dan Jinja2 Untuk Aplikasi Machine Learning Berbasis Web

Mungkin ada pembaca yang sudah mahir metode-metode yang digunakan untuk machine learning, tapi kesulitan ketika membuat aplikasi yang digunakan oleh pengguna. Banyak pilihan yang mungkin, apakah berbasis desktop ataukah web. Pilihan berupa mejalankan lewat konsol tentu saja menyulitkan pengguna yang biasanya eksekutif pengambil keputusan. Untuk yang berbasis desktop (lihat pos yang lalu tentang tkinter) menyulitkan jika ingin digunakan bersama. Nah, penggunaan aplikasi berbasis web untuk machine learning menjadi satu-satunya pilihan yang baik. Dengan aplikasi web, aplikasi dapat digunakan oleh divisi lain. Pos ini merupakan penjelasan lebih lanjut dari post yang lalu dengan penambahan pada operasi aritmatika sederhana (penjumlahan).

Bahasa Pemrograman Front-End dan Back-End

Dua pilihan framework web berbasis python yang terkenal adalah “django” dan “flask”. Jika django diperuntukan untuk aplikasi besar (enterprise), flask cocok jika digunakan internal di perusahaan karena karakteristiknya yang microframework. Toh biasanya memang aplikasi machine learning tidak “diumbar” ke luar, melainkan hanya kepentingan internal saja. Biasanya memang machine learning bekerja secara back-end, sementara bahasa pemrograman lain seperti java, php, dan bahasa front-end lainnya diperbantukan. Tetapi ternyata dengan framework-framework web, python secara mengejutkan dapat digunakan sebagai front-end juga.

Mempersiapkan Pustaka (Library) Flask

Langkah penting pertama adalah menyiapkan pustaka untuk menjalankan Flask. Kita dapat menggunakan dua metode yaitu lewat konsole (dengan PIP) dan lewat Anaconda Navigator. Silahkan atur environment yang tepat agar tidak salah menggunakan environment.

Di sini saya menginstal Flask di environment “tensorflow” (hanya nama saja). Untuk yang konsol, gunakan “path” yang sesuai, atau bisa menggunakan aplikasi “virtualenv”. Atau untuk pemula seperti saya, gunakan saja Anaconda yang terintegrasi.

Format Folder Flask

Flask membutuhkan satu file python untuk menghidupkan server dan beberapa templet HTML untuk input dan outputnya. Misalnya untuk contoh kita menggunakan satu file python “web.py” untuk menghidupkan server dan mengatur komunikasi templet lainnya: “mainpage.html” dan “result.html”.

Gunakan beragam text editor untuk mengetik dan membaca program-program tersebut, misalnya notepad, sublimetext, IDLE, dan text editor lainnya. Pastikan letak file mengikuti standar di atas dimana HTML terletak dalam satu folder “templates”. Berikut contoh kode untuk menghidupkan server Flask.

Memang perlu usaha keras untuk rekan-rekan yang kurang memahami format HTML dan CSS. Silahkan pelajari sumber-sumber belajar HTML dan CSS tersebut. Atau bisa gunakan Bootstrap yang tersedia dengan cuma-cuma di internet.

Menghidupkan Server

Dengan environment yang sesuai, masuk ke mode konsol dan ketik: python <namafile.py> di folder yang tepat. Pastikan server hidup dengan indikasi adanya instruksi untuk mengakses http://127.0.0.1:<port>.

Untuk keluar bisa menggunakan “Ctrl+C”. Ada kejadian unik ketika saya mengutak-atik kode tetapi tidak bisa dijalankan karena server masih menyimpan yang lama (cache). Setelah mengganti port baru bisa.

Testing

Buka browser dan jalankan aplikasi. Pastikan dapat berjalan dengan sempurna. Silahkan untuk jelasnya buka video tutorial saya di Youtube berikut ini.

Adaptive Neuro-Fuzzy Inference System (ANFIS) dengan Python

Adaptive Neuro-Fuzzy Inference System (ANFIS) merupakan metode yang menggabungkan Jaringan Syaraf Tiruan (JST) dengan Fuzzy. Konsepnya adalah menjadikan “rule” sebagai “neuron”. Jumlah layer tersembunyi (hidden) hanya satu layer. Salah satu situs yang OK untuk mempraktikan ANFIS dengan bahasa pemrograman Python adalah salah satu TIM dari MIT di link berikut ini. Source code bisa diunduh dan penjelasannya lewat situs Github.

Instal Library ANFIS

Anaconda tidak memiliki pustaka ANFIS, oleh karena itu perlu mengunduh menggunakan PIP. Selain itu pustaka yang dibuat sendiri juga disertakan, misalnya anfis.py dan folder membership yang berisi dua file penting lainnya. Untuk mengetahui bagaimana fungsi eksternal bekerja silahkan lihat postingan saya yang lalu.

Menggunakan Google Colab

Memang lebih mudah menggunakan Google Colab karena sebagian besar pustaka sudah tersedia. Hanya saja untuk ANFIS terpaksa harus menginstal terlebih dahulu. Caranya adalah seperti instalasi PIP lewat terminal, hanya saja disini menggunakan tanda seru di awalnya.

Ketik !pip install anfis. Tunggu beberapa saat hingga Google Colab berhasil mengunduh dan menginstal pustaka ANFIS tersebut. Jangan lupa, file-file pendukung unggah di bagian File di sisi kiri Google Colab. Pastikan ketika impor pustaka di sel berikutnya berhasil. Buat folder baru dengan nama membership lalu isi dengan file pendukungnya. Jangan diletakan di luar semua.

Berikutnya adalah mengambil data latih dari file “beasiswa.txt”. Pastikan X dan Y sesuai dengan yang diinginkan sebagai data latih dan targetnya. Silahkan cari sumber referensi mengenai membership function. Di sini mf berfungsi mem-fuzzy-kan inputan. Jalankan dan pastikan grafik performa pelatihan muncul.

Perhatikan hasil latih yang berwarna merah sudah mendekati target yang berwarna biru. Satu untuk memperoleh beasiswa dan nol untuk yang tidak memperoleh beasiswa. Gunakan satu data sampel untuk menguji apakah menerima beasiswa atau tidak.

Perhatikan untuk input1 3.2 dan input2 3.4 hasilnya adalah 1. Silahkan menggunakan fungsi “round” untuk membulatkan apakah nol atau satu. Untuk jelasnya lihat video berikut ini. Sekian semoga bermanfaat.

Simulated Annealing in Jupyter Notebook

Similar with particle swarm optimization, simulated annealing (SA) is a fast optimization method. It mimics the process of the cooling system in die casting. The cooling system in die casting should be slow to avoid the internal energy trapped in the cast that reduce the quality. The SA code can be found in the internet, e.g. the panda site.

SA use some exponential calculation, so we need to import “math” library in the beginning. Open your Jupyter Notebook with the proper environment. Use Anaconda Navigator to get the environment and open the terminal. After finding your working direktory, type “Jupyter Notebook” to open the IDE in your browser automatically. Copy and paste the SA code at the end of this post to show how the SA work. You can change the objective function according your case study.

Matplotlib library was used to create the performance chart. Best performance was at 8.1 after 258 iteration. Try the code below in your Jupyter Notebook or previous method, e.g. by console, IDLE, etc.

import time
import random
import math
import numpy as np
import matplotlib.pyplot as plt
#------------------------------------------------------------------------------
# Customization section:
initial_temperature = 100
cooling = 0.8  # cooling coefficient
number_variables = 2 
upper_bounds = [3, 3]   
lower_bounds = [-3, -3]  
computing_time = 1 # second(s)

def objective_function(X):
    x=X[0]
    y=X[1]
    value = 3*(1-x)**2*math.exp(-x**2 - (y+1)**2) - 10*(x/5 - x**3 - y**5)*math.exp(-x**2 - y**2) -1/3*math.exp(-(x+1)**2 - y**2)
    return value

#------------------------------------------------------------------------------
# Simulated Annealing Algorithm:
initial_solution=np.zeros((number_variables))
for v in range(number_variables):
    initial_solution[v] = random.uniform(lower_bounds[v],upper_bounds[v])

current_solution = initial_solution
best_solution = initial_solution
n = 1  # no of solutions accepted
best_fitness = objective_function(best_solution)
current_temperature = initial_temperature # current temperature
start = time.time()
no_attempts = 100 # number of attempts in each level of temperature
record_best_fitness =[]

for i in range(9999999):
    for j in range(no_attempts):

        for k in range(number_variables):
            current_solution[k] = best_solution[k] + 0.1*(random.uniform(lower_bounds[k],upper_bounds[k]))
            current_solution[k] = max(min(current_solution[k],upper_bounds[k]),lower_bounds[k])  # repair the solution respecting the bounds

        current_fitness = objective_function(current_solution)
        E = abs(current_fitness - best_fitness)
        if i == 0 and j == 0:
            EA = E

        if current_fitness < best_fitness:
            p = math.exp(-E/(EA*current_temperature))
            # make a decision to accept the worse solution or not
            if random.random()<p:
                accept = True # this worse solution is accepted
            else:
                accept = False # this worse solution is not accepted
        else:
            accept = True # accept better solution
        if accept==True:
            best_solution = current_solution # update the best solution
            best_fitness = objective_function(best_solution)
            n = n + 1 # count the solutions accepted
            EA = (EA *(n-1) + E)/n # update EA

    print('interation: {}, best_solution: {}, best_fitness: {}'.format(i, best_solution, best_fitness))
    record_best_fitness.append(best_fitness)
    # Cooling the temperature
    current_temperature = current_temperature*cooling
    # Stop by computing time
    end = time.time()
    if end-start >= computing_time:
        break
plt.plot(record_best_fitness)

Particle Swarm Optimization in Jupyter Notebook

Particle Swarm Optimization (PSO) has been widely used for solving optimization problems. This method has many advantages, in particular for the computational complexity. PSO mimics the flock of bird or the school of fish when searching for foods. It faster than genetic algorithms (GAs), so become the first choice when optimizing the complex problems, such as multi-objective optimization, optimization with many constraints, etc. Following is the particle velocity calculation and its new location.

pso

Many source codes can be found in the internet, for example this panda site. This beautiful code use object-oriented style with some classes. Some functions inside a class are easy to understand. This code can be copied and pasted in your jupyter notebook. As usual, use the Anaconda Navigator to choose the right environment. This code only uses a simple library: math, and matplotlib.

Choose your working directory to open the Jupyter Notebook by typing “juypyter notebook”. The Jupyter notebook then suddenly appear in your browser. Copy and paste the code to run the sample of PSO. This sample use two variables (X0 and X1). Use mm=-1 for minimizing problem and mm=1 for maximizing problem. A main class run two previous classes (Particle and PSO) to show the optimum result with a performance chart.

Here is the code:

import random
import math
import matplotlib.pyplot as plt
#------------------------------------------------------------------------------
# TO CUSTOMIZE THIS PSO CODE TO SOLVE UNCONSTRAINED OPTIMIZATION PROBLEMS, CHANGE THE PARAMETERS IN THIS SECTION ONLY:
# THE FOLLOWING PARAMETERS MUST BE CHANGED.
def objective_function(x):
    y = 3*(1-x[0])**2*math.exp(-x[0]**2 - (x[1]+1)**2) - 10*(x[0]/5 - x[0]**3 - x[1]**5)*math.exp(-x[0]**2 - x[1]**2) -1/3*math.exp(-(x[0]+1)**2 - x[1]**2);
    return y

bounds=[(-3,3),(-3,3)]   # upper and lower bounds of variables
nv = 2                   # number of variables
mm = -1                   # if minimization problem, mm = -1; if maximization problem, mm = 1

# THE FOLLOWING PARAMETERS ARE OPTIMAL.
particle_size=100         # number of particles
iterations=200           # max number of iterations
w=0.85                    # inertia constant
c1=1                    # cognative constant
c2=2                     # social constant
# END OF THE CUSTOMIZATION SECTION
#------------------------------------------------------------------------------    
class Particle:
    def __init__(self,bounds):
        self.particle_position=[]                     # particle position
        self.particle_velocity=[]                     # particle velocity
        self.local_best_particle_position=[]          # best position of the particle
        self.fitness_local_best_particle_position= initial_fitness  # initial objective function value of the best particle position
        self.fitness_particle_position=initial_fitness             # objective function value of the particle position

        for i in range(nv):
            self.particle_position.append(random.uniform(bounds[i][0],bounds[i][1])) # generate random initial position
            self.particle_velocity.append(random.uniform(-1,1)) # generate random initial velocity

    def evaluate(self,objective_function):
        self.fitness_particle_position=objective_function(self.particle_position)
        if mm == -1:
            if self.fitness_particle_position < self.fitness_local_best_particle_position:
                self.local_best_particle_position=self.particle_position                  # update the local best
                self.fitness_local_best_particle_position=self.fitness_particle_position  # update the fitness of the local best
        if mm == 1:
            if self.fitness_particle_position > self.fitness_local_best_particle_position:
                self.local_best_particle_position=self.particle_position                  # update the local best
                self.fitness_local_best_particle_position=self.fitness_particle_position  # update the fitness of the local best

    def update_velocity(self,global_best_particle_position):
        for i in range(nv):
            r1=random.random()
            r2=random.random()

            cognitive_velocity = c1*r1*(self.local_best_particle_position[i] - self.particle_position[i])
            social_velocity = c2*r2*(global_best_particle_position[i] - self.particle_position[i])
            self.particle_velocity[i] = w*self.particle_velocity[i]+ cognitive_velocity + social_velocity

    def update_position(self,bounds):
        for i in range(nv):
            self.particle_position[i]=self.particle_position[i]+self.particle_velocity[i]

            # check and repair to satisfy the upper bounds
            if self.particle_position[i]>bounds[i][1]:
                self.particle_position[i]=bounds[i][1]
            # check and repair to satisfy the lower bounds
            if self.particle_position[i] < bounds[i][0]:
                self.particle_position[i]=bounds[i][0]

class PSO():
    def __init__(self,objective_function,bounds,particle_size,iterations):

        fitness_global_best_particle_position=initial_fitness
        global_best_particle_position=[]

        swarm_particle=[]
        for i in range(particle_size):
            swarm_particle.append(Particle(bounds))
        A=[]

        for i in range(iterations):
            for j in range(particle_size):
                swarm_particle[j].evaluate(objective_function)

                if mm ==-1:
                    if swarm_particle[j].fitness_particle_position < fitness_global_best_particle_position:
                        global_best_particle_position = list(swarm_particle[j].particle_position)
                        fitness_global_best_particle_position = float(swarm_particle[j].fitness_particle_position)
                if mm ==1:
                    if swarm_particle[j].fitness_particle_position > fitness_global_best_particle_position:
                        global_best_particle_position = list(swarm_particle[j].particle_position)
                        fitness_global_best_particle_position = float(swarm_particle[j].fitness_particle_position)
            for j in range(particle_size):
                swarm_particle[j].update_velocity(global_best_particle_position)
                swarm_particle[j].update_position(bounds)

            A.append(fitness_global_best_particle_position) # record the best fitness

        print('Optimal solution:', global_best_particle_position)
        print('Objective function value:', fitness_global_best_particle_position)
        print('Evolutionary process of the objective function value:')
        plt.plot(A)
#------------------------------------------------------------------------------
if mm == -1:
    initial_fitness = float("inf") # for minimization problem
if mm == 1:
    initial_fitness = -float("inf") # for maximization problem
#------------------------------------------------------------------------------   
# Main PSO         
PSO(objective_function,bounds,particle_size,iterations)

Membuat Activity Diagram dengan Microsoft Visio

Aktivity diagram merupakan salah satu diagram Unified Modeling Language (UML). Diagram ini menjelaskan lebih rinci diagram use-case dalam bentuk alur aktivitas. Selain itu, diagram ini menyediakan pula sebuah swimlane yaitu alur yang menggambarkan bagian/divisi yang bekerja. Di sini kita coba menggambar diagram activity dengan Microsoft Visio. Berbeda dengan Excel dan Access yang satu paket dengan microsoft office, microsoft visio berbeda paket dan harus membeli lisensi tambahan untuk aplikasi ini. Buka Visio dan kita buat diagram baru.

Pada bagian more shapes pilih software & database – Software – UML Activity. Tampak diagram-diagram yang digunakan oleh diagram activity muncul di bagian kiri visio. Klik, tahan dan pindahan diagram ke lembar kerja visio. Yang pertama-tama adalah Swimlane, yang berupa persegi panjang vertikal.

Untuk menambah aktor tekan dua kali di sisi kanan Swimlane untuk menambah. Di sini untuk aktivitas tertentu terkadang berisi divisi atau bagian dimana sebuah aktivitas berlangsung. Ganti nama Function menjadi nama yang sesuai.

Sedikit tip n trik, ketika membuat satu activity baru, lebih enak dengan copas dari yang ada agar ukurannya tidak perlu diseting lagi. Untuk penentuan posisi, ikut arah garis pemandu agar ketika membuat garis panah akar lurus tepat di “pin” pada activity. Berikutnya sediakan beberapa konektor berupa garis berarah panah.

Secara default, garis konektor tidak memiliki panah. Jadi kita harus menambahkan panah dengan cara mengklik kanan garis konektor dan klik format shape.

Sekarang konektor sudah memiliki panah/arah. Berikutnya tidak perlu melakukan langkah itu lagi karena kita tinggal meng-copy-paste saja konektor yang sudah memiliki panah. Berikutnya buat diagram activity Anda hingga selesai.

Pada diagram activity terdapat juga decision berupa belah ketupat. Di sini pertanyaan tidak berada di dalam belah ketupat, melainkan di luar. Ada baiknya juga tulisan di luar belah ketupat, bentuk belah ketupat jadi tidak terlalu besar. Jika masuk satu keluar dua, disebut decision, sebaliknya disebut merge. Cukup mudah bukan? Selamat mencoba.

Sudahkah Mendaftar Github?

Kebanyakan pengembang menggunakan Github untuk sarana sharing kode program. Saya mengenal pertama kali ketika kuliah web technology di Thailand. Waktu itu bahasa pemrograman yang digunakan adalah Ruby and Rails (lihat post-post saya tentang ruby and rails), yang memang pertama kali ditujukan untuk bahasa tersebut. Github terkenal dengan version controlnya. Lumayan ribet. Nah, untuk Anda yang belum memiliki akun di Github, postingan kali sedikit memandu Anda mendaftar Github.

Pertama-tama kunjungi situs Github untuk Join/bergabung. Berikutnya isilah data diri yang diminta oleh Github. Seperti biasa, Anda akan diminta mengisi username, email address, dan password untuk login nanti.

Selanjutnya Anda diminta untuk “mengutak-atik” puzzle, memastikan kalau Anda bukan robot/mesin. Tekan “Select a Plan”.

Pilih “Plan” yang diinginkan, kalau bisa sih yang berbayar. Tapi yang gratis juga ok.

Pilih “Individual – Pick the plan” dilanjutkan dengan mengisi data lain terkait tujuan mendaftar Github.

Lanjutkan dengan menekan “Complete Setup” dan buka email yang didaftarkan barusan untuk konfirmasi. Tekan verifikasi di email, untuk melanjutkan login. Setelah login, Anda diminta membuka email lagi untuk memasukan angka yang harus diisikan. Jika sudah maka Anda siap menggunakan Github. Banyak pro dan kontra ketika situs repository ini dibeli Microsoft. Selamat mencoba, “keep calm and code on”.

Relasi Antar Tabel dengan Fasilitas Designer Pada Phpmyadmin

Biasanya kita membuat tabel di MySql dengan kode SQL lewat fungsi CREATE TABLE dan seterusnya. Sementara untuk relasi antar tabel menggunakan fungsi ALTER TABLE dilanjutkan dengan FOREIGN KEY dan REFERENCES. Nah untuk versi-versi terbaru Phpmyadmin menyediakan fasilitas designer jika ingin melihat diagram tabel-tabel dalam satu basis data. Postingan ini mungkin bermanfaat bagi kita yang malas mengetik kode sql seperti saya.

Pertama-tama klik basis data yang ingin dibuat relasi antar tabelnya. Perhatikan di bagian paling kanan ada tombol “designer” yang disediakan oleh Phpmyadmin untuk mengelola tabel-tabel yang terlibat. Tekan tombol tersebut untuk membuat relasi antar tabelnya.

Misalnya tabel pinjam memiliki field NPM yang merupakan foreign key dari tabel siswa. Oleh karena itu perlu membuat relasi antara tabel pinjam dengan tabel siswa. Tekan simbol relasi pada icon di jendela designer.

Pilih NPM pada tabel siswa sebagai referenced key. Field ini merupakan primary key tabel siswa.

Berikutnya pilih foreign key pada tabel pinjam.

Pilih “on update” pilih “Cascade” agar ketika NPM berubah di tabel siswa, di tabel pinjam ikut berubah juga.

Jika sudah, tekan OK. Maka selesai sudah pembuatan relasi. Untuk melihat kode SQL lengkapnya bisa dengan mengekspor database tersebut. Caranya dengan menakan tombol “eksport”.

Setelah itu kita diminta menentukan lokasi penyimpanan. Jika dibuka kode SQL tampak ada kode untuk menambah relasi, lengkap dengan “on update cascade”. Selamat mencoba.

 

 

Optimalisasi Multiobjektif

Biasanya dalam optimalisasi, fungsi yang akan dicari nilai optimalnya hanya berjumlah satu. Fungsi tersebut dikenal dengan nama fungsi objektif (objective function) atau beberapa peneliti lebih senang dengan istilah fungsi kriteria (criteria function). Tetapi di lapangan kebanyakan fungsi objektif lebih dari satu, sehingga perlu penanganan untuk mengoptimalkan fungsi-fungsi tersebut, yang dikenal dengan istilah optimalisasi multiobjective (multiobjective optimization).

Salah satu teknik yang sering dan mudah digunakan adalah dengan pembobotan, atau dikenal dengan istilah aggregating function. Besar bobot di tiap-tiap fungsi objektif perlu diriset terlebih dahulu, atau dengan menanyakan kepada para pakar di bidangnya. MIsalnya kita memiliki dua fungsi:

Coba gunakan Matlab untuk melihat grafik dua fungsi objektif tersebut. Tampak adanya kontradiksi. Di sinilah peran penanganan multiobjektif.


x=-10:0.1:10;
y1=x.^2+6;
plot(x,y1,'r')
grid on
hold
%Current plot held
y2=-(x.^2)+12;
plot(x,y2,'b')

Tampak kedua fungsi bertolak belakang. Di sini misalnya kita sudah memiliki bobot masing-masing untuk fungsi 1 dan 2 berturut-turut 0.7 dan 0.3. Maka untuk optimalisasi kita butuh satu fungsi baru, yang nantinya digunakan sebagai fungsi objektif pada algoritma optimasi yang dipilih. Tambahkan 2 kode baru lanjutan dari yang di atas.


yobj=0.7*y1+0.3*y2;
plot(x,yobj,'k')

Nah kita tinggal mengoptimalkan fobj yang berwarna hitam tersebut dengan metode yang Anda sukai, misalnya algoritma genetika. Ketik optimtool(‘ga’). Nah, di sini perlu membuat m-file yang berisi fungsi objektif. Ketik sembarang nama, misalnya “fungsi” di command window isi coding berikut:

Masukan nama fungsi tersebut diawali dengan @ di bagian “fitness function”. Di bagian “Plot Function” ceklis pada best fitness dan best individualnya agar lebih interaktif ketika Matlab memprosesnya. Tekan “Start” jika dirasa sudah siap. Oiya, jangan lupa “Number of Variables” diisi, tentu saja satu variabel yang terlibat “x”.

Perhatikan di bagian hasil, diperoleh titik 0.001 sebagai titik optimal dengan fitness 7.8. Sekian, semoga bisa menginspirasi.

Mempersiapkan Data dan Training Model ANFIS, JST dan SVM

Dalam machine learning dikenal beberapa jenis data antara lain: data training dan data testing. Terkadang data training dipisah menjadi data training dan target. Dalam prakteknya, data training menggunakan sebagaian prosentase dengan sisanya dijadikan data tasting untuk pengujian model.

Excel dapat digunakan untuk mempersiapkan data training walaupun memiliki beberapa keterbatasan dalam mengelola “big data”. Untuk data yang tidak terlalu besar, aplikasi bawaan ms office ini cukup dapat diandalkan.

Walaupun cross validation banyak diterapkan saat ini, tetapi dengan 80% data training dan sisanya untuk testing (20%) sudah cukup untuk mengukur akurasi model yang dirancang. Sebagai contoh data training berikut dapat digunakan, dengan data latihnya. Berikut langkah proses mempersiapkan data training dan data testing.

1. ANFIS

Untuk ANFIS data training dan target digabung menjadi satu. Formatnya karena sudah sesuai dengan format pentabelan di Excel maka cukup menyiapkan data training saja. Gunakan dua kode ini untuk mengimport data dengan Matlab.

  • load(‘data.dat’);
  • load(‘testing.dat’);

Untuk ANFIS, fungsi “anfisedit” disediakan Matlab untuk melatih ANFIS lewat data yang ada. Karena isian sudah dalam bentuk DAT maka sebenarnya dua kode di atas hanya digunakan nanti untuk testing dan training lewat model lainnya seperti JST, SVM, dll.

Pastikan training data muncul dengan tiga kelas sesuai dengan data (kelas 1, 2 dan 3). Berikutnya “Generate FIS” diklik untuk meramu FIS yang masih kosong.

Angka 3 di atas berarti ada 3 komponen MF di tiap input. Jumlah angka yang muncul menandakan jumlah masukan, di sini ada empat input yang merupakan variabel penentu output. Tipe MF ada banyak, di sini akan digunakan “trimf” yang paling sederhana (linear). Gunakan saja defaultnya (3 komponen di tiap inputan), yang merepresentasikan kondisi “low”, “medium”, dan “high”. Output gunakan saja konstan. ANFIS hanya tersedia di jenis fuzzy “Sugeno”. Tekan “Struktur” di sisi kanan untuk melihat sekilas Network yang siap dilatih.

Berikutnya masuk ke panel “Train FIS” untuk melatih Network. Ada dua pilihan pembelajaran: hybrid dan backpropagation. Gunakan saja “hybrid”. Berikut merupakan hasil training dengan 3 epoch (mirip iterasi).

Error tampak di layar utama (sekitar 0.1445). Simpan hasil pelatihan lewat “File” – “Export” – Pilih file.

Setelah nama fuzzy diisi (berekstensi *.fis) maka model siap diuji dengan data testing yang sudah ada. Misalnya diberi nama “anfisiris.fis”. Untuk testing gunakan kode berikut ini:

  • anfisiris=readfis(‘anfisiris.fis’);
  • prediksi=evalfis(testing(:,1:4);
  • tes=testing(:,1:4)
  • hasil=evalfis(tes,anfisiris)

Terakhir adalah menghitung akurasi dengan cara prosentase MAPE (Mean Average Percentage Error)-nya:

Jika dibandingkan maka akan tampak beberapa yang error, misalnya di sini ada satu yang error, jadi nilai MAPE-nya= 1/39 *100 = 2,56 %. Atau akurasinya = 100-2,56 = 97,44%. Sedangkan jika ingin mengetahui prediksi mana saja yang tidak akurat dapat menggunakan matriks confusion.

  • target=testing(:,5);
  • target=transpose(target);
  • prediksi=transpose(round(hasil));
  • c=confusionmat(target,prediksi)
  • c =
  • 13 0 0
  • 0 13 0
  • 0 1 12

Cara membaca matriks confusion adalah sebagai berikut. Kolom merupakan prediksi sementara baris adalah aktualnya (dalam hal ini sama dengan target (testing di kolom kelima). Fungsi “round” ditambahkan pada hasil untuk mencari kelas prediksi terdekat, misalnya 2.7 dikategorikan kelas “3”. Diagonal pada matriks confusion menyatakan akurasi. Perhatikan di baris kedua kolom ketiga, di sini harusnya 13 tetapi berisi 12 karena ada satu prediksi 3 (baris ketiga) tetapi kenyataannya 2 (kolom kedua).

2. Neural Networks (Jaringan Syaraf Tiruan)

JST perlu memisahkan data training dengan target (labelnya). Selain itu, formatnya juga berbeda dengan data pada ANFIS, dimana variabel berdasarkan baris. Untuk itu perlu modifikasi data yang ada berdasarkan “data.dat” dan “testing.dat”. Berikut ini kode untuk data training dan targetnya.

  • load(‘data.dat’);
  • load(‘testing.dat’);
  • datalatih=data(:,1:4);
  • datalatih=transpose(datalatih);
  • target=data(:,5);
  • target=transpose(target);

Coba cek dengan fungsi “size”, pastikan jumlah baris merepresentasikan jumlah variabel, sementara jumlah kolom merepresentasikan jumlah data. Berikutnya buat JST kosong dan latih.

  • network=newff(datalatih,target,[81 81]);
  • network=train(network,datalatih,target);

Perlu disiapkan data untuk testing.

  • tesdata=testing(:,1:4);
  • tesdata=transpose(tesdata);
  • targettes=testing(:,5);
  • targettes=transpose(targettes);

Selanjutnya menggunakan fungsi “sim” untuk memprediksi.

  • hasil=sim(network,tesdata);
  • aktual=targettes;
  • prediksi=round(hasil);
  • c=confusionmat(aktual,prediksi);
  • c =
  • 13 0 0 0
  • 0 11 2 0
  • 0 4 6 3
  • 0 0 0 0

Dari matriks confusion di atas dapat diketahui precision-nya (atau dikenal juga dengan nama MAPE). Caranya adalah membandingkan total yang benar (angka di sisi diagonal) dengan total data testing.

  • 13+11+6
  • ans =
  • 30
  • ans/39
  • ans =
  • 0.7692

Akurasi yang dihasilkan (MAPE) adalah 76.92%.

3. Support Vector Machine (SVM)

SVM hanya memisahkan dua kelas yang berbeda. Jika ada lebih dari dua kelas, maka perlu modifikasi dengan menggunakan lebih dari satu garis pemisah. Salah satu tekniknya adalah membuat pohon keputusan. Misalnya ada tiga kelas (kelas 1, kelas 2 dan kelas 3) maka perlu dibuat tiga garis pemisah, misalnya kita beri nama svm1, svm2 dan svm3.

  • svm1, pemisah antara kelas 1 dan kelas 2
  • svm 2, pemisah antara kelas 1 dan kelas 3, dan
  • svm 3, pemisah antara kelas 2 dan kelas 3

 

(source: link)

Selanjutnya, dibuat logika if-else untuk mengarahkan garis pemisah yang sesuai (atau dengan teknik lain yang sesuai). Berikut ini salah satu contohnya:

  • test1=svmclassify(svm1,datatesting)
  • if test1==1
  • test2=svmclassify(svm2,datatesting)
  • if test2==1
  • class=’1′
  • else
  • class=’3′
  • end
  • else
  • test3=svmclassify(svm3,datatesting)
  • if test3==2
  • class=’2′
  • else
  • class=’3′
  • end
  • end

Untuk membuat garis pemisah, Matlab menyediakan fungsi “svmtrain”. Jika ingin membuat garis pemisah antara kelas 1 dan kelas 2 (svm1) diperlukan data latih yang memiliki kelas 1 dan kelas 2 (tanpa menyertakan kelas 3) disertai dengan group-nya (dalam JST dikenal dengan istilah target).

  • svm1=svmtrain(train,group)

Di sini “train” merupakan data gabungan kelas 1 dan kelas 2, begitu pula “group” merupakan kelas yang sesuai dengan “train”. Gunakan excel untuk memilah-milah antara kelas 1 dengan kelas lainnya untuk membuat svm2, dan svm3.

 

Mengirim Variabel ke Kelas Lain di Java

Bahasa Java memiliki istilah-istilah rumit terutama ditujukan untuk pemrograman berorientasi objek. Konsep objek dengan prinsip enkapsulasi (information hiding) memerlukan perlakuan khusus dalam membuat programnya. Contoh-contoh kode yang beredar di internet, terutama yang menggunakan basis data relational terkadang tidak menerapkan prinsip enkapsulasi ini. Untuk mempraktekannya ada baiknya dimulai dari yang dasar dulu yaitu konstruktor.

Konstruktor

Sebuah kelas merupakan cetakan (template) suatu objek tertentu. Misal seorang siswa memiliki atribut tertentu seperti kode dan nama serta metode/operasi seperti membaca data, memasukan data siswa baru, menghapus data siswa, dan sejenisnya. Jika sebuah objek baru terbentuk maka data baru harus mengikuti pola kelas Siswa tersebut yang terdiri dari atribut dan metode/operasi.

Pada Netbeans, kelas Siswa dapat dilihat di jendela navigator. Tampak atribut di bawah dan lingkaran yang menyatakan metode. Belah ketupat menyatakan metode yang masuk kategori konstruktor, yang berfungsi membuat satu objek baru.

Konstruktor Siswa(String k, String n) berfungsi membuat satu objek dengan atribut k dan n yang kemudian dikonversi menjadi variabel lokal (this.kodesiswa dan this.nama).

  • public Siswa(String k, String n){
  • this.kodesiswa=k;
  • this.nama=n;
  • }

Ketika kelas lain meminta menjalankan satu metode/operasi maka diperlukan objek baru yang dibentuk dari konstruktor. Misalkan menggunakan kelas Main yang biasanya secara default muncul di tiap project.

Getter & Setter

Objek “mhs” baru dibentuk lewat konstruktor Siswa yang menangkap kode “009” dan nama”Dr. Rahmadya Trias H.”. Ditangkap lewat mekanisme setter & getter. Ketika diketik “mhs.” Pastikan muncul operasi-operasi yang tersedia, jika tidak maka konstruktor bermasalah. Misal kita pilih metode “greetings()” yang sebelumnya di kelas Siswa telah diisi, misalnya sbb:

  • public void greetings(){
  • System.out.println(“Hai, salam kenal, saya ” +this.nama);
  • }

Jika dijalankan akan menjalankan metode “greetings()” dengan parameter yang dikirim “009” dan “Dr. Rahmadya Trias H.” untuk digunakan mengoperasikan tulisan (di sini yang digunakan hanya this.nama saja).

Membuat CRUDE Matrix

CRUDE singkatan dari Create, Read, Update, dan Execute. CRUD tanpa E biasa digunakan oleh pemrograman terstruktur, sementara Execute ditambahkan untuk Objek oriented yang artinya proses selain CRUD, misalnya membuat tampilan tertentu, perhitungan-perhitungan, validasi, dan lain-lain. CRUDE matrix biasanya dibuat dari Use Case diagram di tahapan analisa.

Berikut ini contoh pembuatan CRUDE matrix. Perhatikan aktor yang terlibat bisa juga berupa kelas, biasanya diberi simbol <<class>>, kadang tidak muncul pada Use Case diagram.

Kandidat aktor: Doctor, Management, New Patient, Old Patient. Aktor “Patient” menwakili New dan Old Patient.

Kandidat kelas:

Baik management dan Doctor mengelola jadwal (Manage Schedule). Ada kelas Jadwal (Schedule). Kelas New Patient butuh kelas Patient. Baik kelas New dan Old Patient mengajukan jadwal (appointment). Kelas Doctor perlu dibuat untuk penjadwalan.

CRUDE Matrix

Berikut CRUD Matrix sementara yang bisa berubah pada fase/tahap berikutnya.

Kelas-kalas: Management, Doctor, Patient, Appointment, Schedule

 

Management

Doctor

Patient

Appointment

Schedule

Management

 

C,R,U,D

C,R,U,D

R,E

C,R,U,D

Doctor

       

C,R,U,D

Patient

     

C,U

 

Appointment

         

Schedule

         

 

Training, Validating, Testing dan Corpus

Empat kata di atas, terutama tiga pertama merupakan istilah yang banyak disebut dalam literatur machine learning. Sementara yang keempat, Corpus, muncul belakangan ketika banyaknya pihak-pihak yang berkontribusi dengan membagikan file big data yang dimilikinya. Postingan kali ini sedikit menambah penjelasan mengenai penggunaan istilah-istilah di atas.

Training

Istilah ini merupakan pengkhususan dari arti sebenarnya: pelatihan/pembelajaran. Teringat ketika presentasi hasil penelitian di kampus yang dihadiri oleh beragam bidang ilmu. Salah satu peserta dari fakultas agama Islam memprotes manfaat dari training yang katanya tidak perlu karena menghambur-hamburkan dana. Peserta dari fakultas teknik, terutama jurusan informatika, hanya bisa tersenyum karena maklum istilah training di penelitian itu adalah proses melatih model agar diperoleh parameter yang tepat, bukan pelatihan berupa kursus, workshop, dan sejenisnya. Diperlukan data yang disertai dengan label dalam proses training ini. Banyak metode yang digunakan, biasanya backpropagation dengan turunannya gradient descent atau levenberg marquardt (LM). Data training ini dikenal dengan istilah training set.

Validating

Jika training membutuhkan data beserta label agar diperoleh parameter yang tepat, misalnya untuk jaringan syaraf tiruan (JST) berupa bobot dan bias, validating berisi data beserta label pula yang dimaksudkan untuk menguji hasil training apakah sudah akurat atau belum. Jika beruntung, hasil validasi akurat, biasanya di atas 75%. Jika belum harus di-training ulang. Data untuk validasi biasanya sebagian data training. Istilah data untuk validasi adalah development set, held-out set, atau validation set. Terkadang sebagian data training dipakai untuk validasi, kemudian secara bergantian yang tadinya buat training menjadi testing, yang dikenal dengan istilah cross validation.

Testing

Data testing atau dikenal dengan istilah testing set wajib dijalankan setelah validasi. Fungsinya membuktikan apakah model sudah sesuai dalam artian akurat di validasi dan akurat juga di kenyataannya. Data yang digunakan untuk testing merupakan data real yang tidak digunakan untuk training. Tentu saja tidak “fair” menggunakan data training untuk testing, ibarat ujian, soal yang diujikan diberitahu terlebih dahulu.

Corpus

Corpus merupakan kumpulan data spesifik. Jamaknya dikenal dengan nama Corpora. Data ini biasanya digunakan untuk testing yang berasal dari lembaga yang bersedia men-share untuk pembelajaran bersama, misalnya data aeronatika, video, suara, gambar, dan lain-lain. Jika Anda menginstal Python, disertakan juga Corpora secara opsional, karena memang ukurannya yang besar. Tentu saja Corpus ini dipergunakan biasanya untuk pengujian metode/algoritma apakah akurat atau tidak. Sementara untuk data spesifik tertentu, misal pengambilan keputusan kredit bank, pemberian beasiswa, penyetujuan proposal, perlu mencari data real yang ada jika tidak ada yang men-share karena memang data tersebut khusus/spesifik dimana tiap institusi/lokasi/objek penelitian berbeda-beda karakteristiknya. Yuk, yang punya data, bagi-bagi, untuk membantu riset teknologi informasi, terutama yang punya data bidang kesehatan.

Analisa dan Disain Sistem Berorientasi Objek

Pemrograman Berorientasi Objek (PBO) dalam proses perancangan sistemnya tidak berbeda dengan pemrograman terstruktur dan dapat menggunakan metode yang sama. Hanya saja karena ciri khas PBO yang tidak membedakan proses dan data maka ada sedikit sudut pandang yang berbeda dalam perancangannya. Tiga tokoh penggagas Unified Modeling Language (UML) yaitu Grady Booch, Ivar Jacobson, dan James Rumbaugh sepakat dalam perancangan sistem modern harus berbasis: Use Case Driven, fokus ke arsitektur sistem (Architecture-centric), dan iteratif & inkremental.

Use Case Driven

Use Case Driven artinya adalah Use Case sebagai pemodelan utama dalam perancangan sistem. Model Use Case menggambarkan hubungan antara pengguna dengan sistem dalam melakukan aktifitas tertentu seperti pemesanan barang, penyewaan, mencari informasi tertentu, dan lain-lain. Use Case Driven berbeda dengan pemodelan tradisional maupun Rapid Application Development (RAD) yang kompleks. Kompleksitas metode tradisional tersebut karena harus melibatkan baik analis maupun pengguna dimana sistem dipecah menjadi subsistem hingga tidak bisa dipecah lagi dalam analisanya. Diagram menjadi rumit karena saling terkait antara satu diagram dengan diagram lainnya yang jumlahnya banyak. Sementara itu Use Case hanya berfokus pada satu proses bisnis dalam satu waktu dan membuat proses menjadi lebih sederhana.

Fokus ke Arsitektur Sistem

Arsitektur bisa bermacam-macam artinya, tergantung dari sudut pandang tertentu. Dari sudut pandang PBO dengan standar UML-nya arsitektur merupakan aspek keseluruhan dari organisasi sistem. Aspek tersebut melandasi komponen-komponen arsitektur sistem yang terdiri dari fungsionalitas, struktur, dan proses (function, static, & behaviiour). Selain itu arsitektur juga mengatasi permasalahan performa, skalabilitas, reuse, dan batasan-batasan ekonomi dan teknis.

Secara garis besar arsitektur dapat dilihat dari sisi eksternal (pengguna) yaitu berupa fungsi-fungsi. Selain itu dilihat juga dari sisi internal berupa atribut, metode, dan kelas-kelas . Arsitektur juga melibatkan relasi antar objek yang melibatkan pesan-pesan untuk menjalankan fungsi tertentu.

Iteratif dan Inkremental

PBO menerapkan metode pengembangan sistem berupa iterasi dan inkremental. Metode ini mengembangkan tiga sudut pandang arsitektur (fungsi, statis, dan proses) secara berulang. Setelah testing, perancang kembali lagi ke awal untuk penyempurnaan. Dalam merancang, perancang mengembangkan sedikit demi sedikit, dari sistem sederhana menuju sistem yang lebih besar dan kompleks. Tiap iterasi pengembang selalu berhubungan dengan pengguna dalam merancang fungsi-fungsi yang diperlukan. Jadi struktur dan fungsi harus dikuasai oleh pengembang agar diperoleh sistem yang baik. Pengembang juga dapat menambahkan kebutuhan-kebutuhan fungsi yang tidak disadari oleh pengguna.

Relasi One-To-Many Pada Objek Database

Untuk mengimplementasikan relasi one-to-many pada pemrograman terstruktur dengan sistem basis data relasional diperlukan sebuah tabel detil karena dalam satu field tidak boleh berisi lebih dari satu item. Namun pada pemrograman berorientasi objek dapat dihandel oleh sebuah kelas dengan format atribut array. Misalnya kelas kursus yang berisi lebih dari satu peserta kursus berikut ini.

Salah satu atribut kursus adalah peserta yang merupakan sebuah objek dari kelas siswa. Simbol kurung “[]” menandakan bahwa kelas Kursus bisa memiliki lebih dari satu objek peserta kursus, yang dalam ERD sistem relasional dikenal dengan relasi one-to-many. Bagaimana dalam implementasinya di Netbeans?

Memakai Atribut dari Kelas Lain

Pada kelas kursus terdapat atribut “peserta” yang berasal dari kelas Siswa. Karena menggunakan atribut maka terdapat relasi memiliki dari kelas Kursus terhadap kelas Siswa, diistilahkan dengan relasi “has-a”. Bandingkan dengan relasi antara kelas Main dengan Kursus yang berupa penggunaan saja (mengatur/maintain kursus), diistilahkan dengan relasi “is-a”. Berikut potongan kode dalam bahasa Java untuk kelas yang menggunakan objek dari kelas Siswa (peserta).

public class Kelas {
private String kode,jadwal;
private Siswa[] peserta;
private int i;
//konstruktor
public Kelas(){
this.peserta=new Siswa[5];
}
public Kelas(String kode, String jadwal, Siswa[] peserta){
this.kode=kode;
this.jadwal=jadwal;
this.peserta=peserta;
}

Perhatikan variabel peserta diambil dari kelas Siswa (private Siswa[] peserta). Selanjutnya ditambah dengan setter & getter serta operasi-operasi lainnya. Pada konstruktor kelas misalnya dibatasi lima peserta kurus saja (this.peserta=new Siswa[5];). Operasi penting untuk menangkap data objek Kelas adalah sebagai berikut.

public void add(Siswa s){
if(i<peserta.length){
peserta[i]=s;
System.out.println(“Siswa add at index “+i);
i++;
}
System.out.println(“Peserta: “+peserta);
}
public void add3(String jadwal){
this.jadwal=jadwal;
}
public void add2(String kode){
this.kode=kode;
}

Peserta kursus memanfaatkan variabel I untuk menambah beberapa kali (dalam hal ini max 5). Operasi lainnya juga disertakan untuk menambahkan kode kelas dan jadwalnya. Jika dilihat di navigation pada Netbeans tampak seperti berikut ini.

Dua operasi CRUD (insertData dan readData) misalnya dimasukan. Sebaiknya seluruh CRUD dimasukan juga (update dan delete). Variabel I: int digunakan untuk memasukan peserta kursus yang lebih dari satu.

Kelas Siswa seperti biasa dibuat dengan atribut dan operasi tertentu. Buat CRUD yang lengkap seperti contoh berikut. Untuk akses ke basis data objek dengan operasi CRUD silahkan lihat pos yang lalu.

Kelas Main

Kelas ini hanya contoh interface untuk mendaftarkan kelas beserta pesertanya. Dalam implementasi biasanya menggunakan form/frame.

ObjectContainer db = Db4oEmbedded.openFile(“C:/Users/Herlawati/Documents/NetBeansProjects/com.kursus/kursus.yap”);
Kelas kel = new Kelas();
//siswa pertama
Siswa sis = new Siswa();
sis.setKodesiswa(“03”);
ObjectSet<Object> result = db.queryByExample(sis);
Siswa m1 = (Siswa) result.next();
System.out.println(“ketemu siswa nama: “+m1.getNama()+” kode “+m1.getKodesiswa());
System.out.println(m1);
kel.add(m1);
//siswa kedua
Siswa sis2 = new Siswa();
sis2.setKodesiswa(“04”);
ObjectSet<Object> result2 = db.queryByExample(sis2);
Siswa m2 = (Siswa) result2.next();
System.out.println(“ketemu siswa nama: “+m2.getNama()+” kode “+m2.getKodesiswa());
System.out.println(m2);
kel.add(m2);
//input atribut Kelas
kel.add3(“senin dan selasa”);
kel.add2(“kode3”);
db.close();
kel.insertData();
kel.readData();

Ada satu Kelas dengan dua peserta ditambahkan dengan kode di atas, pastikan ketika dieksekusi akan menghasilkan jawaban yang mengindikasikan data tersimpan.

Siswa dengan kode 03 dan 04 dicari terlebih dahulu dari kelas Siswa. Tentu saja sudah dimasukan terlebih dahulu beberapa objek Siswa. Fungsi Add akan memasukan siswa secara multivalue ke objek Kelas. Setelah atribut kelas (jadwal dan kode kelas) ditambahkan (operasi add2 dan add3) maka operasi insertData akan memasukan objek Kelas yang baru saja didaftarkan secara permanen ke sistem basis data objek. Butuh penjelasan yang detil, tetapi secara garis besar langkah-langkah di atas bermaksud menjelaskan prinsip kerja objek, baik instan (temporer) maupun persistence (permanen). Semoga bermanfaat.