Algoritma EM (Expectation–Maximization)


Algoritma EM (Expectation–Maximization) adalah salah satu algoritma yang digunakan untuk klasifikasi atau pengelompokan data. Contoh yang dibahas kali ini adalah mengenai penentuan jurusan siswa berdasarkan nilai skor siswa.
Sesuai namanya, ada 2 proses utama dalam algoritma ini, yaitu proses expectation (E), yaitu fungsi untuk memperkirakan evaluasi likelihood berdasarkan beberapa parameter yang ada, dan proses maximization (M), yaitu untuk memaksimalkan nilai likelihood yang ditemukan pada proses E. Kedua proses ini digunakan untuk menentukan distribusi data untuk proses E pada perulangan selanjutnya.



Diasumsikan ada 20 orang siswa, yaitu siswa A sampai dengan T
Masing-masing siswa memiliki rata-rata nilai IPA, IPS, dan Bahasa yang berbeda-beda
Maka tentukan semua siswa tersebut akan masuk ke dalam jurusan apa berdasarkan nilai skor yang dimiliki
Diasumsikan data awal nilai siswa adalah sebagai berikut

Nama SiswaNilai IPANilai IPSNilai Bahasa
Siswa A506070
Siswa B658073
Siswa C727065
Siswa D836580
Siswa E408273
Siswa F957185
Siswa G607496
Siswa H757592
Siswa I835570
Siswa J916065
Siswa K929155
Siswa L768059
Siswa M756574
Siswa N747689
Siswa O637969
Siswa P589376
Siswa Q825080
Siswa R816588
Siswa S767470
Siswa T777155

Langkah pertama adalah memasukkan data-data yang digunakan.
Contoh data awal adalah sebagai berikut:

data=[50, 60, 70; ...
    65, 80, 73; ...
    72, 70, 65; ...
    83, 65, 80; ...
    40, 82, 73; ...
    95, 71, 85; ...
    60, 74, 96; ...
    75, 75, 92; ...
    83, 55, 70; ...
    91, 60, 65; ...
    92, 91, 55; ...
    76, 80, 59; ...
    75, 65, 74; ...
    74, 76, 89; ...
    63, 79, 69; ...
    58, 93, 76; ...
    82, 50, 80; ...
    81, 65, 88; ...
    76, 74, 70; ...
    77, 71, 55]';



Sebelum masuk kedalam langkah-langkah pembahasan algoritma, ada beberapa konstanta atau parameter yang harus diketahui, yaitu:
* Tentukan Jumlah Cluster
Jumlah Cluster adalah jumlah dari pengelompokan data yang ingin dilakukan
Jumlah Cluster nilainya harus diantara 2 dan jumlah data
Diasumsikan dalam kasus ini, jumlah pengelompokan data ada 3 kelompok, yaitu jurusan IPA, jurusan IPS, jurusan Bahasa

jumlahCluster = 3;

* Tentukan jumlah maksimal iterasi yang digunakan
Diasumsikan dalam kasus ini, jumlah maksimal iterasi adalah 100 kali

jumlahIterasi = 100;

* Tentukan epsilon, yaitu batas selisih minimal antara mean sekarang dengan mean pada perhitungan sebelumnya
Jika selisih antara kedua mean tersebut kurang dari nilai ini, maka perhitungan akan dihentikan
Diasumsikan dalam kasus ini, nilai epsilon adalah 0.0000000001

epsilon = 1e-10;

Langkah-langkah penggunaan algoritma ini adalah

* Lakukan proses pengelompokan dengan metode EM (Expectation-Maximization)
Penjelasan tentang fungsi ini akan dijelaskan pada perhitungan dibawah ini (poin 1 – 2)

daftarCluster = EM(data,jumlahCluster, jumlahIterasi, eps);

Memasuki perhitungan utama pada fungsi EM

1. Lakukan proses inisialisasi,
yaitu memasukkan masing-masing data ke dalam cluster acak (poin 1a – 1d)

1a. Tentukan jumlah data

[~,jumlahData] = size(data);

1b. Tentukan indeks data acak sebanyak jumlah cluster
Kemudian gunakan masing-masing data ini sebagai mean dari masing-masing cluster

idx = randsample(jumlahData,jumlahCluster);
mean = data(:,idx);

1c. Lakukan perhitungan selisih data dengan masing-masing mean
Kemudian catat cluster tujuan sementara dimana mengembalikan selisih paling maksimal

[~,daftarCluster] = max(bsxfun(@minus,mean'*data,dot(mean,mean,1)'/2),[],1);
[~,~,daftarCluster] = unique(daftarCluster);

1d. Lakukan pencatatan data cluster tujuan sementara untuk masing-masing data

R = full(sparse(1:jumlahData,daftarCluster,1,jumlahData,jumlahCluster,jumlahData));

2. Lakukan perhitungan sebanyak jumlah iterasi dan selama statusnya belum selesai (poin 2a – 2d)

while ~isSelesai && iterasi < jumlahIterasi
    iterasi = iterasi+1;
	. . .

2a. Lakukan proses maximization pada data
Penjelasan tentang fungsi ini akan dijelaskan pada perhitungan dibawah ini (poin 2a1 – 2a7)

model = maximization(data,R);

Memasuki perhitungan utama pada fungsi maximization

2a1. Tentukan jumlah dimensi dan jumlah data

[jumlahDimensi,jumlahData] = size(data);

2a2. Tentukan jumlah cluster

jumlahCluster = size(R,2);

2a3. Hitung jumlah data pada masing-masing cluster

jumlahDataPerCluster = sum(R,1);

2a4. Hitung bobot pada masing-masing cluster
yaitu jumlah data per cluster dibagi jumlah semua data

bobotPerCluster = jumlahDataPerCluster/jumlahData;

2a5. Hitung nilai mu, yaitu perkalian antara data dengan probabilitas data tersebut dibagi dengan jumlah data per cluster

mu = bsxfun(@times, data*R, 1./jumlahDataPerCluster);

2a6. Lakukan perhitungan pada masing-masing cluster (point 2a6a – 2a6b)

for i = 1:jumlahCluster
. . .

2a6a. Hitung nilai Xo:
Lakukan pengurangan data dengan nilai mu pada perhitungan diatas
Kemudian lakukan perkalian nilai tersebut dengan akar kuadrat dari R

Xo = bsxfun(@minus,data,mu(:,i));
Xo = bsxfun(@times,Xo,akarKuadratR(:,i)');

2a6b. Hitung nilai Sigma
Lakukan perkalian antara Xo dan transpos Xo dibagi dengan jumlah data per cluster
Kemudian tambahkan nilai diagonal sigma dengan nilai yang sangat kecil

Sigma(:,:,i) = Xo*Xo'/jumlahDataPerCluster(i);
Sigma(:,:,i) = Sigma(:,:,i)+eye(jumlahDimensi)*(1e-6);

2a7. Ambil nilai mu, Sigma, dan bobot per cluster sebagai jawaban nilai model

model.mu = mu;
model.Sigma = Sigma;
model.bobot = bobotPerCluster;

2b. Lakukan proses expectation pada data untuk digunakan pada perulangan selanjutnya
Penjelasan tentang fungsi ini akan dijelaskan pada perhitungan dibawah ini (poin 2b1 – 2b7)

[R, likelihood(iterasi)] = expectation(data,model);

Memasuki perhitungan utama pada fungsi expectation

2b1. Tentukan nilai mu, Sigma, dan bobot dari parameter model yang sudah dijelaskan sebelumnya

mu = model.mu;
Sigma = model.Sigma;
bobot = model.bobot;

2b2. Tentukan jumlah data dan jumlah cluster

jumlahData = size(data,2);
jumlahCluster = size(mu,2);

2b3. Lakukan perhitungan pada masing-masing cluster
Hitung nilai logaritma rho menggunakan fungsi logaritma gauss
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

for i = 1:jumlahCluster
    logRho(:,i) = LogGaussPDF(data,mu(:,i),Sigma(:,:,i));
end

* Gunakan fungsi ini untuk menghitung nilai logaritma gauss

function y = LogGaussPDF(data, mu, Sigma)
jumlahDimensi = size(data,1);
data = bsxfun(@minus,data,mu);
[U,p]= chol(Sigma);
if p ~= 0
    error('Pada fungsi LogGaussPDF, Sigma tidak dalam PD.');
end
Q = U'\data;
q = dot(Q,Q,1);
c = jumlahDimensi*log(2*pi)+2*sum(log(diag(U)));
y = -(c+q)/2;

2b4. Tambahkan nilai logaritma rho dengan nilai logaritma dari bobot

logRho = bsxfun(@plus,logRho,log(bobot));

2b5. Hitung nilai T, yang dihitung dengan rumus log(sum(exp(data),jumlahDimensi))
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

T = LogJumlahExp(logRho,2);

* Gunakan fungsi ini untuk menghitung rumus log(sum(exp(data),jumlahDimensi))

function s = LogJumlahExp(data, jumlahDimensi)
y = max(data,[],jumlahDimensi);
data = bsxfun(@minus,data,y);
s = y + log(sum(exp(data),jumlahDimensi));
i = find(~isfinite(y));
if ~isempty(i)
    s(i) = y(i);
end

2b6. Hitung nilai likelihood, yaitu jumlah dari nilai T dibagi dengan jumlah semua data

likelihood = sum(T)/jumlahData;

2b7. Lakukan pengurangan nilai logaritma rho dengan nilai T
Kemudian hitung nilai eksponen dari nilai tersebut sebagai jawaban nilai R yang baru

logR = bsxfun(@minus,logRho,T);
R = exp(logR);

* Tampilkan semua data yang sudah dimasukan ke dalam cluster
Hitung nilai skornya untuk masing-masing kriteria dalam cluster tersebut
Ambil nilai skor tertinggi sebagai jawaban jurusan yang seharusnya diambil

data = data';
jumlahCluster = size(daftarCentroid,2);
st = zeros(1,size(data,2),'uint8');

for k = 1:jumlahCluster
    if cellfun('length',daftarDataPerCluster(k)) > 1,
        skor = zeros(1,size(data,2),'double');
        for i = 1:size(data,1)
            s = '';
            if daftarCluster(i) == k,
                s = strcat([s, 'Siswa ', char(i + 64), '   ']);
                for j = 1:size(data,2)
                    s = strcat([s, ' ', num2str(data(i,j)), ' ']);

                    if st(j) == 0, skor(j) = skor(j) + data(i,j); end;
                end
                disp(s);
            end;
        end;

        maks = -inf;
        idxmaks = -1;
        for i = 1:size(data,2)
            if maks < skor(i),
                maks = skor(i);
                idxmaks = i;
            end
        end

        disp(['Kelompok ini memiliki skor terbanyak pada kolom ke ' , num2str(idxmaks + 1) , ...
            ' , -> kelompok data ' , char(atribut(idxmaks))]);
        disp('------------------------------');

        st(idxmaks) = 1;
    end;    
end;

Hasil akhir adalah:

Algoritma EM (Expectation-Maximization)
Contoh: Penentuan jurusan siswa berdasarkan nilai skor siswa
Diasumsikan ada 20 orang siswa, yaitu siswa A sampai dengan T
Masing-masing siswa memiliki rata-rata nilai IPA, IPS, dan Bahasa yang berbeda-beda
Maka tentukan semua siswa tersebut akan masuk ke dalam jurusan apa berdasarkan nilai skor yang dimiliki
Diasumsikan data awal nilai siswa adalah sebagai berikut
Nama Siswa, Nilai IPA, Nilai IPS, Nilai Bahasa
Siswa A   ,        50,        60,           70
Siswa B   ,        65,        80,           73
Siswa C   ,        72,        70,           65
Siswa D   ,        83,        65,           80
Siswa E   ,        40,        82,           73
Siswa F   ,        95,        71,           85
Siswa G   ,        60,        74,           96
Siswa H   ,        75,        75,           92
Siswa I   ,        83,        55,           70
Siswa J   ,        91,        60,           65
Siswa K   ,        92,        91,           55
Siswa L   ,        76,        80,           59
Siswa M   ,        75,        65,           74
Siswa N   ,        74,        76,           89
Siswa O   ,        63,        79,           69
Siswa P   ,        58,        93,           76
Siswa Q   ,        82,        50,           80
Siswa R   ,        81,        65,           88
Siswa S   ,        76,        74,           70
Siswa T   ,        77,        71,           55


Jumlah Cluster = 3
Jumlah Iterasi = 100
Epsilon        = 1e-10


Selesai dalam 24 iterasi.
Data yang sudah dikelompokkan:
------------------------------
Siswa A 50 60 70
Siswa F 95 71 85
Siswa G 60 74 96
Siswa H 75 75 92
Siswa J 91 60 65
Siswa M 75 65 74
Siswa N 74 76 89
Kelompok ini memiliki skor terbanyak pada kolom ke 3 , -> kelompok data Bahasa
------------------------------
Siswa D 83 65 80
Siswa I 83 55 70
Siswa K 92 91 55
Siswa L 76 80 59
Siswa Q 82 50 80
Siswa R 81 65 88
Siswa T 77 71 55
Kelompok ini memiliki skor terbanyak pada kolom ke 1 , -> kelompok data IPA
------------------------------
Siswa B 65 80 73
Siswa C 72 70 65
Siswa E 40 82 73
Siswa O 63 79 69
Siswa P 58 93 76
Siswa S 76 74 70
Kelompok ini memiliki skor terbanyak pada kolom ke 2 , -> kelompok data IPS
------------------------------

Contoh modul / source code menggunakan Matlab dapat didownload disini:



Jika membutuhkan jasa kami dalam pembuatan program, keterangan selanjutnya dapat dilihat di Fasilitas dan Harga
Jika ada yang kurang paham dengan langkah-langkah algoritma diatas, silahkan berikan komentar Anda.
Selamat mencoba.

Tinggalkan sebuah komentar

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *