BAB IV ANALISIS DAN HASIL
4.1.2 Implementasi Program
4.1.2.2 Implementasi Function Fuzzy C-Means Clustering
Program 4.1 Tampilkan Data
Program diatas ini pengguna di arahkan untuk menginputkan file yang ingin dipakai. Dimana pertama-tama function pushbuttonTampilkanData ini mendeklarasikan data sebagai variable global agar semua fungsi yang ada di dalamnya bisa mengakses nilai dari variable tersebut. Kemudian menggunakan filename,pathname untuk membaca file dari direktori yang dipilih. Kemudian ada uigetfile dimana untuk mengambil file dalam direktori yang mana file tersebut berformat xls dan xlsx. Lalu menggunakan xlsread untuk membaca file excel tersebut. Kemudian menampilkan data excel tersebut pada table dengan menggunakan fungsi set (handles.tabledata,’data’,data).
4.1.2.2 Implementasi Function Fuzzy C-Means Clustering
Implementasi fuzzy c-means clustering ini ada beberapa langka yang harus dibuat, langka pertama dimana membuat sebuah baris dan kolom matriks seperti dibawah ini:
function pushbuttonTampilkanData_Callback(hObject, eventdata,handles)
global data;
[filename,pathname]=uigetfile([{'*.xlsx','XLSX
Only'};{'* .xls','XLS Only'}],'Select Excel Input File');
data = xlsread(strcat(pathname,filename));
set(handles.tableData,'data', data);
Program 4.2 Menyiapkan Baris dan Kolom Matriks
Bagian program ini membuat atribut data kemudian membuat array yang terdapat baris dan kolom yang berisikan size atau ukuran dari data yang nanti akan diclusterkan.
Program 4.3 Menyiapkan Nilai-nilai Awal Perhitungan
Langka yang berikut atau kedua ini yang dilihat pada program diatas dimana untuk membaca input parameter dari gui yang diawali dengan membaca banyak cluster yang diambil dari gui bagian editcluser yang bertipe string kemudian diubah menggunakan str2num menjadi numerik, lalu membaca indeks untuk popmenuPangkat yang bertipe value selanjutnya bagian pangkats yang bertipe string, kemudian bagian pangkat yang dimana berisikan membaca bagian indeks terus membaca bagian pangkats kemudian diubah dari string ke numerik dengan menggunakan str2num, selanjutnya pada bagian fungsiobjektif awal dimana dimulai dari angka 0 sedangkan perhitungan iterasinya dimulai dari 1.
banyakcluster = str2num(get(handles.editCluster,'String')) indeks = get(handles.popupmenuPangkat,'Value');
pangkats = get(handles.popupmenuPangkat,'String');
pangkat = str2num(pangkats{indeks}) iterasimaksimal =
str2num(get(handles.editIterasi,'String'))
errorterkecil = str2num(get(handles.editError,'String')) fungsiobjektifawal = 0
penghitungiterasi = 1 data
[baris kolom] = size(data)
Program 4.4 Membangkitkan Bilangan Random
Langka ketiga ini untuk membangkitkan sebuah nilai random dalam matriks partisi awal. Pertama membuat atau menginisialisikan matrikspartisiawal ke dalam array, selanjutnya membuat perulangan yang berisikan perhitungan baris yang dibuat 1 dibanding baris kemudian membuat variable matriksacak yang dimana berikan nilai random dari banyak cluster yang tersedia, selanjutnaya membagikan matriksacak yang tadi dengan jumlah yang didapat dari matriksacak kemudian menambahkan matriksacak kedalam matrikspartisiawal menggunakan matrikspartisiawal = [matrikspartisiawal;
matriksacak]; lalu di akhiri dengan end dan menampilkan dicommand windows dengan membuat matrikspartisiawal dibagian
matrikspartisiawal = [];
for penghitungbaris = 1 : baris
matriksacak = rand(1, banyakcluster);
matriksacak = matriksacak / sum(matriksacak);
matrikspartisiawal = [matrikspartisiawal;
matriksacak];
end
matrikspartisiawal
matrikspartisiberpangkat = matrikspartisiawal.^pangkat jumlahkolomberpangkat = sum(matrikspartisiberpangkat, 1) reratakolomberpangkat = mean(matrikspartisiberpangkat, 1) errorperhitungan = 1000000000
bawah end. Kemudian membuat matriks partisi berpangkat yang berisikan matrikspartisiawal .^pangkat disini terjadi proses hasil dari partisi awal tadi dipangkatkan dimana pangkatnya nanti tergantung dari pengguna entah itu 1, 2 ataupun 3. Kemudian di tahap 3 ini juga menjumlahkan nilai tiap baris hasil matrikspartisiberpangkat tadi dengan menggunakan perintah jumlahkolomberpangkat = sum(matrikspartisiberpangkat,1), selanjutnya mencari rata rata setiap kolom dari matrikspartisiberpangkat menggunakan perintah reratakolomberpangkat = mean(matrikspartisiberpangkat,1 dan membuat error perhitungan dengan nilai 1000000000 agar bisa menangani error dengan nilai yang besar.
Program 4.5 Menghitung Pusat Cluster
while 1
penghitungiterasi
daftarpusatklusterbaru = [];
for penghitungcluster = 1 : banyakcluster penghitungcluster
hasilsemuabaris = [];
pengaliklaster =
matrikspartisiberpangkat(:,penghitungcluster) for penghitungbaris = 1 : baris
penghitungbaris
pengalibaris = pengaliklaster(penghitungbaris) dataperbaris = data(penghitungbaris,:) hasilperbaris = dataperbaris * pengalibaris hasilsemuabaris = [hasilsemuabaris; hasilperbaris];
end
hasilsemuabaris
Langka keempat ini terjadi proses perulangan dimana proses perulangan tersebut akan berhenti jika sudah mencapai kondisi dimana error perhitungan atau iterasi terbanyak tercapai.
Didalam proses perulangan terdapat perhitunganiterasi yang nanti ditampilkan di command windows, kemudian membuat atau menyediakan tempat untuk daftarpusatcluster dalam bentuk array, lalu menggunakan for untuk perulangan perhitunganclusternya, kemudian membuat lagi tempat untuk hasil semuabaris dalam bentuk array lalu membuat pengaliklaster yang berisikan hasil dari matriks partisi berpangkat. Selanjutnya menggunakan for yang keduan untuk perulangan perhitungan baris didalamnya terdapat pengalibaris yang dimana ambil dari pengaliklaster yang berisikan perhitungan baris jadi akan mengikuti perhitungan baris ketika perhitungan baris bernilai 1 maka dia akan melihat pengali kluster yang bagian baris pertama yang akan dimunculkan dibagian pengalibaris, kemudian memunculkan data perbaris dengan menggunakan perintah data(perhitunganbaris,:). Setelah itu membuat hasilperbaris dengan mengalikan dataperbaris dengan pengali baris dan menambahkan hasil perbaris tadi kedalam hasilsemua baris dengan menggunakan perintah hasilsemuabaris
= [hasilsemuabaris; hasilperbaris]; lalu akhiri dengan end hasil perulangan dan memunculkan hasilsemuabaris pada commandwindows.
Program 4.6 Hitung Jumlah Setiap Kolom
jumlahkolom = sum(hasilsemuabaris) pusatklusterbaru = jumlahkolom /
jumlahkolomberpangkat(penghitungcluster)
daftarpusatklusterbaru = [daftarpusatklusterbaru;
pusatklusterbaru];
end
daftarpusatklusterbaru
Bagian ini untuk menghitung jumlah dari setiap kolom diambil dari hasil semua baris. Kemudian membuat pusat cluster terbaru menggunakan jumlahkolom dibagi jumlahkolomberpangkat yang diambil dari perhitungan cluster. Selanjutnya membuat daftarpusatcluster dimana menggunakan daftarpusatklusterbaru = [daftarpusatklusterbaru;pusatklusterbaru]; untuk menambahkan hasilpusatclusterterbaru kedalam daftarpusatclusterterbaru.
Program 4.7 Perhitungan Nilai Fungsi Objektif
Langka kelima ini dimana untuk mengitung fungsi objektif . pertama-tama menyediakan tempat daftarjumlahcluster dlam bentuk arrat kemudian masuk kedalm proses perulangan menggunakan for yang yang berisikan pusatclusterbaru yang yang mengambil dari daftarpusatclusterbaru yang berisikan perhitungancluster kemudian membuat atau menghitung selisih setiap elemen dari data dengan pusat cluster yang baru
daftarjumlahkuadrat = [];
for penghitungcluster = 1 : banyakcluster penghitungcluster
pusatklusterbaru = daftarpusatklusterbaru (penghitungcluster, :)
selisih = data - repmat(pusatklusterbaru, baris, 1) selisihkuadrat = selisih.^2
jumlahkuadrat = sum(selisihkuadrat, 2)
daftarjumlahkuadrat = [daftarjumlahkuadrat jumlahkuadrat];
end
daftarjumlahkuadrat fungsiobjektifcluster =
sum(daftarjumlahkuadrat.*matrikspartisiberpangkat,2) fungsiobjektif = sum(fungsiobjektifcluster)
dengan menggunakan selisih = data - repmat(pusatklusterbaru, baris, 1) lalu untuk melihat selisih kuadratnya menggunakan selisih.^2.
Kemudian menjumlahkan selisihkuadrat secara horinzontal untuk mendapatkan jumlah kuadratnya kemudian hasil dari jumlahkudrat tadi dimasukkan kedalam daftar jumlah kuadrat dengan perintah daftar jumlah kuadrat = [daftarjumlahkuadrat jumlahkuadrat]; lalu akhiri proses perulangan dengan end kemudian memunculkan hasil dari daftarjumlah kuadrat pada command windows. Kemudian untuk fungsiobjektifclusternya itu di dapat dari jumlah daftar jumlahkuadrat dikalikan dengan matrikspartisiberpangkat dan pada tahap ini dimana diakhiri dengan menemukan fungsiobjektif dari jumlah fungsiobjektif cluster.
Program 4.8 Menghitung Perubahan Matriks Partisi matrikspartisisementara = [];
for penghitungcluster = 1 : banyakcluster nilaibaru =
(daftarjumlahkuadrat(:,penghitungcluster).^(-1/(pangkat-1)))
matrikspartisisementara = [matrikspartisisementara nilaibaru]; end
matrikspartisisementara jumlahbarismatrikspartisisementara = sum(matrikspartisisementara, 2) matrikspartisiawal =
matrikspartisisementara./repmat(jumlahbarismatrikspartisisem
entara, 1, banyakcluster)
fungsiobjektif
fungsiobjektifawal
errorperhitungan = abs(fungsiobjektif - fungsiobjektifawal) fungsiobjektifawal = fungsiobjektif
disp('Siapkan matriks untuk iterasi berikutnya ---');
matrikspartisiawal
matrikspartisiberpangkat = matrikspartisiawal.^pangkat jumlahkolomberpangkat = sum(matrikspartisiberpangkat, 1) reratakolomberpangkat = mean(matrikspartisiberpangkat, 1)
Langka keenam ini dimana untuk menghitung peerubahan matriks partisi. Dimana pada bagian awal menyedikan tempat dalam berbentuk array untuk matrikspartisisementara, kemudian masuk ke proses perulangan yang berisikan nilaibaru dimana nialibaru didapatkan dari daftarjumlahkuadrat (:,penghitungcluster).^(-1/(pangkat-1))) kemudian mengakhirinya dengan end lalu memunculkan hasil matrikspartisisementara di command windows.
Kemudian membuat jumlahbarismatrikspartisisementra yang didapatkan dari hasil penjumlahan matrikspartisisementara secara horizontal, selanjutnya membuat atau menampilkan hasil matrikspartisiawal lalu memunculkan fungsi objektif dan fungsiobjektifawal pada command windows dan pada error pehitungan didapat dari hasil absolut ( fungsiobjektif – fungsiobjektifawal ) dan dibawahnya dimana fungsiobjektifawal berisikan fungsi objektif. Pada program diatas menggunakan disp untuk menampilkan tulisan ‘ siapkan matriks untuk iterasi berikutnya ‘. Kemudian memunculkan matrikspartisiawal, lalu membuat matrikspartisiberpangkat untuk memangkatkan matriks partisi, kemudian membuat jumlahkolomberpangkat yang didapatkan dari penjumlahan matriks partisi berpangkat secara vertical berguna untuk hitung jumlah setiap kolom, selanjutnya hitung rata-rata setiap kolom dengan menggunakan reratakolomberpangkat = mean(matrikspartisiberpangkat, 1).
Program 4.9 Mengecek Kondisi Berhenti
Langka ketujuh ini dimana untuk mengecek kondisi berhenti. dilihat dari program diatas ketika kondisinya perhitunganiterasi sudah lebih atau sama dengan iterasimaksimal maka dia akan berhenti dan menampilkan iterasi maksimal tercapai dan menampilkan perhitungan akutasinya jika tidak maka dia akan mengecek lagi apakah error perhitungan kurang dari error terkecil jika benar maka akan menampilkan error terkecil tercapai, perhitungan akurasi serta errorperhitungannya jika belum menemukan maka dia akan mencari terus mencari kemudian mengulangi langka ke empat sampai ketemu iterasi dan error yang diinginkan.
Program 4.10 Menentukan Cluster
if penghitungiterasi >= iterasimaksimal
disp('Iterasi maksimal tercapai');
penghitungiterasi break;
end
if errorperhitungan < errorterkecil disp('Error terkecil tercapai');
penghitungiterasi errorperhitungan break;
end
penghitungiterasi = penghitungiterasi+1 end
[nilai,indeks] = max(matrikspartisiawal,[],2) [~,nomorcluster] =
ind2sub(size(matrikspartisiawal(1,:)),indeks) ; nomor = [1:size(matrikspartisiawal,1)]' ; hasilclustering = [nomor nomorcluster]
Langka kedelapan ini dimana untuk program diatas berguna untuk menentukan cluster. Dimana dimulai dengan mencari tertinggi, kemudian pada baris keduan untuk menentukan nomor cluster, selanjutnya untuk mendapatkan nomor dari data dan pada baris terakhir menentukan bahwa nomor data tertentu merupakan cluster tersebut.
Program 4.11 Menambahkan Hasil Cluster ke Tabel
Bagian ini dimana untuk menambahkan hasil cluster kedalam table.dimana mengembalikan nilai dari table data kemudian melakukan proses perulangan yang berisikan table yang didapatkan dari hasil clustering dan menghentikan proses perulangan jika sudah mendapatkan clusternya lalu memunculkan hasilnya dengan menggunakan set (handles.tableData, 'Data', tabel);
Program 4.12 Tampilkan Hasil Clustering
tabel = get(handles.tableData, 'Data');
for penghitungbaris = 1 : baris
tabel(penghitungbaris, 9) = hasilclustering(penghitungbaris, 2);
end
set(handles.tableData, 'Data', tabel);
appendText('Hasil Clustering', handles);
appendText('', handles);
appendText(strcat('Banyak data:',num2str(baris)), handles);
appendText(strcat('Banyakcluster:',num2str(banyakcluster)), handles);
appendText(strcat('Pangkat:',num2str(pangkat)), handles);
appendText(strcat('Iterasimaksimal:',num2str(iterasimaksima l)), handles);
appendText(strcat('Errorterkecil:',num2str(errorterkecil)), handles);
appendText('', handles);
appendText(strcat('Berhenti pada iterasi ke:',num2str(penghitungiterasi)), handles);
appendText(strcat('Errorperhitungan:',num2str(errorperhitun gan)), handles);
appendText('', handles);
Setelah melakukan beberapa langka tadi sekarang masuk pada program untuk menampilkan hasil clustering pada edithasil. Pada program diatas memuculkan hasil banyak data, banyak cluster, pangkat, iteasi maksimul, error terkecil, berhenti pada iterasi ke berapa dan error dari perhitungan tersebut yang dimasukkan pada bagian hasil dalam gui.
Program 4. 13 Mengelompokan Data Kedalam Cluster
Bagian program diatas ini dimana untuk mengelompokan data ke dalam cluster.
clusters = {};
for penghitungcluster = 1 : banyakcluster cluster = {};
for penghitungbaris = 1 : baris
if hasilclustering(penghitungbaris, 2) ==
penghitungcluster
cluster = [cluster; penghitungbaris];
end end
clusters{penghitungcluster} = cluster;
end clusters
Program 4.14 Tampilkan Anggota Kluster ke Bagian Hasil
Program diatas ini untuk menampilkan hasil cluster serta anggota yang ada di dalamnya ke hasil pada bagian gui.