Rabu, 06 Februari 2019

C# - Fuzzy C Means Clustering



UPDATE: 01 FEBRUARI 2019
BAHASA: C#
SYSTEM:
a.    Windows 10
b.    IDE : SharpDevelop Version : 5.1.0.5216-0e58df71
c.    .NET Version         : 4.7.03056

PENGANTAR:

Clustering adalah bahasan cukup sering kita dengar pada teknik data minning. Ada banyak teknik yang bisa kita gunakan, mulai dari algoritma kmeans clustering, k-nearest neighbor, ataupun fuzzy c-means clustering, kohonen (versi  LVQ unsupervisi).  Penulis menggunakan fuzzy c-means clustering untuk menentukan center tiap kelompok data. Kamu bisa membaca tutorial di https://edrianhadinata.wordpress.com/2013/12/19/metode-clustering-algoritma-fuzzy-cmeans/.



DATASET:

Berikut contoh dataset yang kita gunakan, terdiri 2 parameter saja X dan Y
Bila kita plotkan menjadi berikut


Mari kita lihat satu-satu, dari data diatas, tugas C Means Clustering yaitu mencari Centroid untuk masing-masing kelas

Atau dalam bentuk grafik


Penulis mengimplementasikan nya menggunakan bahasa C#, kamu bisa melihat potongan kode berikut

Console.WriteLine("Demo Learning Vector Quantization");
double[,] data = new double[,] { 
 {10,8},
 {4,5},
 {2,3},
 {9,7},
 {0,1}
};
int data_n = data.GetLength(0); //jumlah data
int in_n = data.GetLength(1); //jumlah paramater
int cluster_n = 2; //jumlah cluster
int max_iterasi = 10;
double min_impro = 0.0001;            
int expo = 2; //sering disebut bobot 
//sebagai nilai keanggotaan awal
double [,] U = new double[,] {
 {0.3000,    0.6000, 0.7000,   0.4000,0.8000},
 {0.7000,   0.4000,   0.3000, 0.6000,    0.2000}
     };
FCM fcm = new FCM();
fcm.Hitung(data, U, cluster_n,expo, min_impro,max_iterasi);            
double[,] UNew = fcm.UNew;
double[,] center = fcm.Center;
int[] kelas = fcm.Kelas;
Program.Cetak("Center ",center);
Program.Cetak("U Baru ",UNew);
Program.Cetak("Kelas ",kelas);            
Console.ReadKey();

output

Demo Learning Vector Quantization
Center
1.751 2.75
9.349 7.428
U Baru
0.008 0.773 0.998 0.004 0.955
0.992 0.227 0.002 0.996 0.045
Kelas
1 0 0 1 0

Terlihat bahwa C Means Clustering sudah memberikan nilai Centroid sekaligus labeling kelas tiap data, akan tetapi untuk kasus diatas, inisialisasi nilai U (bobot dilakukan secara manual), bagaimana jika menggunakan data yang cukup besar?

Console.WriteLine("Demo Learning Vector Quantization");
double[,] data = new double[,] { 
     {7,8,1},
     {4,13,1},
     {8,7,1},
     {8,9,1},
     {3,12,1},
     {3,1,1},
     {5,3,1},
     {3,13,1},
     {9,8,1},
     {3,5,1},
     {8,8,1},
     {2,13,1},
     {1,3,1},
     {3,14,1}
 
    };
int data_n = data.GetLength(0); //jumlah data
int in_n = data.GetLength(1); //jumlah paramater
int cluster_n = 4; //jumlah cluster
int max_iterasi = 10;
double min_impro = 0.0001;            
int expo = 2; //sering disebut bobot            

FCM fcm = new FCM();
double [,] U = fcm.InisiasiU(cluster_n, data_n);  //jika bilangan random
fcm.Hitung(data, U, cluster_n,expo, min_impro,max_iterasi);
double[,] UNew = fcm.UNew;
double[,] center = fcm.Center;
int[] kelas = fcm.Kelas;

Program.Cetak("Data ",data);
Program.Cetak("Center ",center);
Program.Cetak("U Baru ",UNew);
Program.Cetak("Kelas ",kelas);

Console.ReadKey();

Output

Demo Learning Vector Quantization
Data
7 8 1
4 13 1
8 7 1
8 9 1
3 12 1
3 1 1
5 3 1
3 13 1
9 8 1
3 5 1
8 8 1
2 13 1
1 3 1
3 14 1
Center
2.806 2.783 1
8.049 8.282 1
2.995 12.996 1
7.756 7.178 1
U Baru
0.013 0.009 0.002 0.007 0.011 0.896 0.729 0 0.01 0.717 0.001 0.009 0.887 0.008
0.5 0.025 0.052 0.852 0.024 0.037 0.095 0 0.679 0.098 0.897 0.016 0.038 0.017
0.014 0.946 0.001 0.011 0.945 0.02 0.034 1 0.011 0.056 0.001 0.961 0.028 0.962
0.473 0.02 0.944 0.131 0.02 0.047 0.141 0 0.3 0.13 0.1 0.014 0.047 0.014
Kelas
1 2 3 1 2 0 0 2 1 0 1 2 0 2


PUSTAKA FUZZY C MEANS CLUSTERING:

Kode Fuzzy C Means Clustering tidak memerlukan library tambahan karena ditulis sendiri.






Tidak ada komentar: