Algoritma Fuzzy C Means

Algoritma Fuzzy C-Means (FCM)Fuzzy C-Means
(FCM )
Fuzzy C-Means (FCM) adl salah satu algoritma fuzzy clustering. Fuzzy CMeans (FCM) adl suatu teknik pengclusteran data yg keberadaan setiap titik data
dlm suatu cluster ditentukan oleh

derajat keanggotaan. Teknik

ini pertama kali

diperk enalkan oleh Jim Bezdek pd tahun 1981.
Konsep
lokasi

dasar FCM yaitu menentukan pusat cluster, yg akan

rata-rata unt setiap cluster. dg cara memperbaiki pusat cluster & derajat

keanggotaan setiap titik data secara berulang, maka
pusat cluster akan
pada


menandai

bergerak menuju lokasi

akan

dapat dilihat bahwa

yg tepat. Perulangan ini didasarkan pd

minimisasi fungsi obyektif yg menggambarkan jarak dr titik data yg diberikan

ke pusat cluster yg terbobot oleh derajat keang gota an titik data tsb.

Algoritma Fuzzy C-Means (FCM) C/C++

Logika fuzzy pertama kali dikembangkan oleh Lotfi A. Zadeh, seorang ilmuan Amerika Serikat
berkebangsaan Iran

dr universitas California di Barkeley, melalui tulisannya pd tahun 1965.( Munir, R.


2005). Fuzzy secara bahasa diartikan sbg kabur

/ samar-samar. Suatu nilai dapat bernilai benar / salah

secara bersamaan. dlm fuzzy dikenal derajat keanggotaan yg memiliki rentang nilai

0 (nol) hingga

1(satu). Berbeda dg himpunan tegas yg memiliki nilai 1 / 0 (ya / tidak).
Logika fuzzy adl suatu cara yg tepat unt memetakan suatu ruang input kedalam suatu ruang
output, mempunyai nilai

kontinyu. Fuzzy dinyatakan dlm derajat dr suatu keanggotaan & derajat dr

kebenaran. Oleh sebab itu sesuatu dapat dikatakan sebagian benar & sebagian salah pd waktu yg sama
(Kusumadewi. 2003).

Clustering
Clustering


adl

suatu

metode

pengelompokan berdasarkan ukuran kedekatan (kemiripan).

Clustering beda dg group, kalau group berarti kelompok yg sama,kondisinya kalau tdk ya pasti bukan
kelompoknya.Tetapi kalau

cluster tdk harus sama

akan

tetapi pengelompokannya berdasarkan pd

kedekatan dr suatu karakteristik sample yg ada Macam-macam metode clustering : Berbasis Metode
Statistikk

Hirarchical clustering method : pd kasus unt jumlah kelompok bom ditentukan terlebih dulu,
contoh data-data hasil survey kuisioner. Macam-metode jenis ini: Single Lingkage,Complete Linkage,Average
Linkage dll.
Non Hirarchical clustering method: Jumlah kelompok telah ditentukan terlebih dulu.Metode yg
dipakai : K-Means.

Fuzzy C-Means
Fuzzy clustering adl proses menentukan derajat keanggotaan, & kemudian memakainya dg
memasu kkan nya kedalam elemen data kedalam satu kelompo k cluster / lebih.
Hal ini akan

memberikan informasi kesamaan dr setiap objek.

Satu dr sekian banyaknya

algoritma fuzzy clustering yg dipakai adl algoritma fuzzy clustering c means. Vektor dr fuzzy clustering,
V={v1, v2, v3,…, vc}, adl sebuah fungsi objektif yg di defenisikan dg derajat keanggotaan dr data Xj &
pusat cluster Vj.
Algoritma fuzzy clustering c means membagi data yg tersedia dr setiap elemen data berhingga
lalu


memasukkannya kedalam bagian dr koleksi cluster yg dipengaruhi oleh

beberapa kriteria yg

diberikan. Berikan satu kumpulan data berhingga. X= {x1,…, xn } & pusat data.

Dimana μ ij adl derajat keanggotaan dr Xj & pusat cluster adl sebuah bagian dr keanggotaan
matriks [μ ij]. d2 adalahakar dr Euclidean distance & m adl parameter fuzzy yg rata-rata derajat
kekaburan dr setiap data derajat keanggotaan tdk lebih besar dr 1,0 Ravichandran (2009).[9]
Output dr Fuzzy C-Means adl deretan pusat cluster & beberapa derajat keanggotaan unt tiaptiap titik data. Informas i ini dapat dipakai unt memban gun suatu fuzzy inference system.
Output dr FCM bukan adl fuzzy inference system, namun adl deretan pusat cluster & beberapa
derajat keanggotaan unt tiap-tiap titik data. Informasi ini dapat dipakai unt membangun suatu fuzzy
inference system.
Algoritma Fuzzy C-means clustering adl sbg berikut :
1. Menentukan:
Matriks X yg adl data yg akan dicluster, berukuran k x j, dg k = jumlah data yg akan di-cluster
& j = jumlah variabel/at ribut (kriteria).

2. Menentukan :

a. Jumlah cluster yg akan dibentuk (n >c ≥ 2). b. pembobot (w > 1).
c. Maksimu m iterasi (max n).
d. Kriteria penghentian /t resh o ld (ɛ = nilai positif yg sangat kecil).
e. Menentukan fungsi obyektif awal (P0).
3. Membentuk matriks partisi awal U (derajat keanggotaan dlm cluster) dg ukuran k x i;
matriks partisi biasanya dibuat acak, , dg k = jumlah data yg akan di-cluster & i = jumlah
cluster

4. Hitung pusat cluster (V) unt setiap cluster, memakai rumus :

Keterang an :
Vij = pusat cluster pd cluster ke-i & atribut ke-j.
μik = data partisi (pada matriks U) pd cluster ke-i & data ke-k. Xkj = data (pada matriks U) pd
atribut ke-j & data ke-k.
w = pembobot.
5. Hitung nilai obyektif (Pn) dg rumus :

Keterang an :
μik = data partisi (pada matriks U) pd cluster ke-i & data ke-k.
dik = fungsi ukuran jarak unt jarak Euclidean pd pusat cluster ke-i & data ke-k.

w = pembobot.
Pn = nilai obyektif pd iterasi ke-n.
6. Perbaiki derajat keanggotaan setiap data pd setiap cluster (perbaiki matriks partisi)

dengan :

Keterang an :

μik = data partisi (pada matriks U) pd pusat cluster ke-i & data ke-k. dik = fungsi ukuran jarak
unt jarak Euclidean pd pusat cluster ke-i & data ke-k.
djk = fungsi ukuran jarak unt jarak Euclidean pd pusat cluster ke-j & data ke-k.
w = pembobot.
Xkj = data (pada matriks U) pd atribut ke-j & data ke-k.
7. Menghentikan iterasi jika
adalah jika perubahan nilai

pusat cluster V tdk berubah. Alternatif kriteria penghentian

error kurang dr treshold |Pn - Pn-1| < ɛ. Alternatif adl ketika perulangan


melebih i maksimu m iterasi ( n > max n). Jika iterasi blm berhenti, kembali ke langkah 4.

8. Jika iterasi berhenti, ditentukan cluster dr tiap-tiap data. Cluster dipilih berdasarkan nilai
matriks partisi terbesar.

Contoh Program Algoritma Fuzzy C-Means
(FCM) C/C++
FCM.C

#define MA X_DATA_P OINTS 1 0000
#define MA X_CLUSTE R 100
#define MA X_DATA_D IMENSIO N 5
#include < math.h>
#include < stdio.h>
#include < stdlib.h >
#include < string.h >
int num_dat a_point s;
int num_clu sters;
int num_dim ensions ;
double low _high[MA X_DATA_ DIMENSIO N][2];

double deg ree_of_m emb[MAX _DATA_PO INTS][M AX_CLUST ER];
double eps ilon;
double fuz ziness;
double dat a_point[ MAX_DAT A_POINTS ][MAX_D ATA_DIME NSION];
double clu ster_cen tre[MAX _CLUSTER ][MAX_D ATA_DIME NSION];
int
init(char * fname) {
int i, j, r, rval ;
FILE *f;
double s;
if ((f = f open(fn ame, "r") ) == N ULL) {
printf("Gag al memb uka fil e input .");
return ‐1;
}
fscanf(f, " %d %d %d ", &num _data_p oints, &num_clu sters, &num_di mension s);
if (num_clu sters > MAX_CL USTER) {
printf("Jum lah clu ster ha rus < %d \n", MA X_CLUSTE R);
goto failur e;
}
if (num_dat a_point s > MAX _DATA_P OINTS) {

printf("Jum lah tit ik data harus < %d\n", MAX_DA TA_POIN TS);
goto failur e;
}
if (num_dim ensions > MAX_ DATA_DI MENSION) {
printf("Jum lah dim ensi ha rus >= 1.0 and < %d\n" ,
MAX_DATA_DI MENSION );
goto failur e;
}
fscanf(f, " %lf", & fuzzines s);
if (fuzzine ss lo w_high[ j][1])
da ta_poin t[i][j];

}
}
for (i = 0 ; i < num_data _points ; i) {
s = 0.0;
r = 100;
for (j = 1 ; j < num_clus ters; j ) {
rval = rand () % ( r 1);
r ‐= rval;

degree_of_m emb[i][ j] = rv al / 100. 0;
s = degree _of_memb [i][j];
}
degree_of_m emb[i][0] = 1.0 ‐ s;
}
fclose(f);
return 0;
failure:
fclose(f);
exit(1);
}
int calcula te_cent re_vecto rs()
{
int i, j, k;
double num erator, denomin ator;
double t[M AX_DATA_ POINTS] [MAX_CLU STER];
for (i = 0 ; i < num_data _points ; i) {
for (j = 0 ; j < num_clus ters; j ) {
t[i][j] = pow(deg ree_of_m emb[i][ j], fuz ziness);
}
}
for (j = 0 ; j < num_clus ters; j ) {
for (k = 0 ; k < num_dime nsions; k) {
numerator = 0.0;
denominator = 0.0;
for (i = 0 ; i < num_data _points ; i) {
numerator = t[i][ j] * da ta_poin t[i][k];
denominator = t[i ][j];
}
cluster_cen tre[j][ k] = nu merator / deno minator ;
}
}
return 0;
}
double
get_norm(in t i, int j) {
int k;
double sum = 0.0;
for (k = 0 ; k < num_dime nsions; k) {
sum = pow( data_po int[i][k ] ‐ cl uster_ce ntre[j] [k], 2);
}
return sqrt (sum);
}
double
get_new_val ue(int i , int j ) {
int k;
double t, p, sum;
sum = 0.0;
p = 2 / (f uzzines s ‐ 1);
for (k = 0 ; k < num_clus ters; k ) {
t = get_no rm(i, j ) / ge t_norm(i , k);
t = pow(t, p);
sum = t;
}
return 1.0 / sum;
}
double
update_degr ee_of_m embershi p() {
int i, j;
double new _uij;
double max _diff = 0.0, di ff;
for (j = 0 ; j < num_clus ters; j ) {
for (i = 0 ; i < num_data _points ; i) {
new_uij = get_new _value(i , j);
diff = new _uij ‐ degree_ of_memb [i][j];
if (diff > max_di ff)
max_diff = diff;
degree_of_m emb[i][ j] = ne w_uij;
}

}
return max_ diff;
}
int
fcm(char *f name) {
double max _diff;
init(fname) ;
do {
calculate_c entre_v ectors() ;
max_diff = update _degree_ of_memb ership() ;
} while (ma x_diff > epsil on);
return 0;
}
int gnuplot _member ship_mat rix()
{
int i, j, cluster ;
char fname[ 100];
double hig hest;
FILE * f[M AX_CLUS TER];
if (num_dim ensions != 2) {
printf("Mer encanaka n clust er hany a beker ja keti ka\n");
printf("jum lah dim ensi ad l dua. Ini aka n membu at\n");
printf("plo t dua d imensi poin kl aster.\ n");
exit(1);
}
for (j = 0 ; j < num_clus ters; j ) {
sprintf(fna me, "clu ster.%d" , j);
if ((f[j] = fopen (fname, " w")) == NULL) {
printf("Tid ak dapa t membu at %s\n", fname) ;
for (i = 0 ; i < j; i) {
fclose(f[i] );
sprintf(fna me, "clu ster.%d" , i);
remove(fnam e);
}
return ‐1;
}
fprintf(f[j ], "#Tit ik data unt kl aster: % d\n", j );
}
for (i = 0 ; i < num_data _points ; i) {
cluster = 0 ;
highest = 0 .0;
for (j = 0 ; j < num_clus ters; j ) {
if (degree_ of_memb [i][j] > highe st) {
highest = degree_ of_memb[ i][j];
cluster = j;
}
}
fprintf(f[c luster] , "%lf %l f\n", d ata_poi nt[i][0] , data_ point[i][ 1]);
}
for (j = 0 ; j < num_clus ters; j ) {
fclose(f[j] );
}
if ((f[0] = fopen( "gnuplo t.script" , "w")) == NUL L) {
printf("Tid ak dapa t membu at gnup lot.scri pt.\n");
for (i = 0 ; i < j; i) {
fclose(f[i] );
sprintf(fna me, "clu ster.%d" , i);
remove(fnam e);
}
return ‐1;
}
fprintf(f[0 ], "set termina l png medium\n" );
fprintf(f[0 ], "set output \"clust er_plot .png\"\n" );
fprintf(f[0 ], "set title \"FCM c lusterin g\"\n");
fprintf(f[0 ], "set xlabel \"x‐coo rdinate \"\n");
fprintf(f[0 ], "set ylabel \"y‐coo rdinate \"\n");
fprintf(f[0 ], "set xrange [%lf : %lf]\n", low_hi gh[0][0 ], low_ high[0][ 1]);
fprintf(f[0 ], "set yrange [%lf : %lf]\n", low_hi gh[1][0 ], low_ high[1][ 1]);
fprintf(f[0 ],
"plot 'clu ster.0' using 1:2 wit h point s pt 7 ps 1 lc 1 no title");
for (j = 1 ; j < num_clus ters; j ) {
sprintf(fna me, "clu ster.%d" , j);
fprintf(f[0] ,
",\\\n'%s' using 1 :2 with points pt 7 ps 1 lc %d not itle",
fname, j 1 );
}
fprintf(f[0 ], "\n") ;
fclose(f[0] );
return 0;
}
void
print_data_ points( char *fna me) {

int i, j;
FILE *f;
if (fname == NULL )
f = stdout ;
else if ((f = fop en(fname , "w")) == NULL ) {
printf("Can not cre ate out put fil e.\n");
exit(1);
}
fprintf(f, "Data p oints:\n" );
for (i = 0 ; i < num_data _points ; i) {
printf("Dat a[%d]: " , i);
for (j = 0 ; j < num_dime nsions; j) {
printf("%.5 lf ", d ata_poi nt[i][j] );
}
printf("\n" );
}
if (fname == NULL )
fclose(f);
}
void
print_membe rship_m atrix(ch ar *fname ) {
int i, j;
FILE *f;
if (fname == NULL )
f = stdout ;
else if ((f = fop en(fname , "w")) == NULL ) {
printf("Can not cre ate out put fil e.\n");
exit(1);
}
fprintf(f, "Members hip mat rix:\n") ;
for (i = 0 ; i < num_data _points ; i) {
fprintf(f, "Data[%d ]: ", i );
for (j = 0 ; j < num_clus ters; j ) {
fprintf(f, " %lf ", degree_ of_memb[ i][j]);
}
fprintf(f, "\n");
}
if (fname == NULL )
fclose(f);
}
int
main(int ar gc, cha r **arg v) {
printf
("‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐ ‐‐‐‐
if (argc ! = 2) {
printf("USA GE: fcm \ n");
exit(1);
}
fcm(argv[1] );
printf("Jum lah tit ik data : %d\n", num_dat a_point s);
printf("Jum lah clu ster: %d \n", nu m_cluste rs);
printf("Jum lah dim ensi da ta titi k: %d\n", num_di mension s);
printf("Mar gin aku rasi: %l f\n", e psilon);
print_membe rship_m atrix("me mbership .matrix" );
gnuplot_mem bership _matrix( );
printf
("‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐ ‐‐‐‐
printf("Pro gram be rhasil dijalank an...\n") ;
printf("Men yimpan matriks keanggo taan dl m file 'membe rship.ma trix'\n \n");
printf("Jik a poin di bida ng (2 dimensi) \n");
printf("scr ipt gnu plot di hasilkan dlm f ile 'gn uplot.s cript', and\n");
printf("dat a gnupl ot dlm file kl aster.[ 0]... \ n\n");
printf ("Pr oses 'g nuplot.s cript' to gene rate gr aph: ' cluster_ plot.pn g'\n\n
printf ("CA TATAN: Sementar a mengh asilkan data g nuplot, unt m asing‐ma sing t
printf("clu ster yg sesuai adl sa lah sat u yg m emiliki tertin ggi\n");
printf("der ajat ke anggotaa n ditem ukan di 'membe rship.m atrix'. \n");
printf
("‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐ ‐‐‐‐
return 0;
}

gen.c
/**
* Ini meng hasilka n data unt men guji al goritma FCM.
*/
#include < math.h>

#include < stdio.h>
#include < stdlib.h >
#include < string.h >
/* Jumlah maksimu m clust er dipe rbolehka n oleh implem entasi ini. */
#define MA X_CLUSTE R 100
/* Jumlah maksimu m titik data y g harus dihasi lkan. */
#define MA X_DATA 10000
/* Jumlah maksimu m dimen si dr d ata tit ik. */
#define MA X_DATA_D IMENSIO N 5
int main(in t argc, char ** argv) {
int n, c, d, i, j;
int l[MAX_D ATA_DIM ENSION], h[MAX_ DATA_DI MENSION] ;
double eps ilon, m;
FILE *f;
if (argc ! = 2) {
printf("mem akai: g en \n" );
exit(1);
}
printf("\nP rogram ini men ghasilka n titik data acak\n");
printf("unt uk meng uji alg oritma FCM.\n\n") ;
do {
printf("Mas ukkan j umlah t itik da ta.\n");
printf("Nil ai haru s >= 1 & < %d: ", MAX _DATA);
if (scanf(" %d", &n ) == EO F)
continue;
} while (n < 1 || n > MA X_DATA) ;
do {
printf("Mas ukkan j umlah c luster.\ n");
printf("Nil ai haru s >= 2 and < % d: ", M AX_CLUS TER);
if (scanf(" %d", &c ) == EO F)
continue;
} while (c < 2 || c > MA X_CLUST ER);
do {
printf("asu kkan kr iteria terminas i (epsi lon).\n") ;
printf("Nil ai haru s >= 0. 0 & 1.0 : ");
if (scanf(" %lf", & m) == E OF)
continue;
} while (m MA X_DATA_ DIMENSIO N);
printf("\nP rogram ini aka n mengh asilkan acak t itik da ta dg memakai\ n");
printf("ter endah & tertin ggi nil ai dipe rbolehka n unt dimensi terten tu.\n ");
printf("Nil ai tert inggi h arus le bih bes ar dr n ilai t erendah\ n");
printf("unt uk dime nsi ter tentu.\n" );
for (i = 0 ; i < d; i) {
do {
printf("Mas ukkan n ilai te rendah unt dim ensi [%d] : ", i );
if (scanf(" %d", &l [i]) == EOF)
continue;
printf("Mas ukkan n ilai te rtinggi unt di mensi[%d] : ", i) ;
if (scanf(" %d", &h [i]) == EOF)
continue;
} while (l[ i] >= h[i]);
}
if ((f = f open(ar gv[1], "w ")) == NULL) {
printf("Gag al memb uat fil e data baru be rnama %s\ n", arg v[1]);
exit(1);
}
fprintf(f, "%d %d %d\n", n, c, d );
fprintf(f, "%lf %l f\n", m, epsilo n);
for (i = 0 ; i < n; i) {
for (j = 0 ; j < d; j) {
fprintf(f, "%d ", (rand() % (h[j ] ‐ l[j ] + 1)) + l[j] );
}
fprintf(f, "\n");
}
fclose(f);
return 0;
}