Desain 2D, 3D, Office, Artikel.

PENGGUNAAN ALGORITMA K-MEANS PADA VISUAL C++

1 comment
Algoritma K-Means adalah Metode clustering berbasis jarak yang membagi data ke dalam sejumlah cluster dan algoritma ini hanya bekerja pada atribut numerik. Pada dasarnya penggunaan algoritma dalam melakukan proses clustering tergantung dari data yang ada dan konklusi yang ingin dicapai. Untuk itu digunakan Algoritma K-Means yang di dalamnya memuat aturan sebagai berikut :
  • Jumlah cluster perlu diinputkan.
  • Hanya memiliki atribut bertipe numerik.
  • Jumlah atribut sedikit (<100)
Algoritma K-Means merupakan Metode nonheirarchial yang pada awalnya mengambil sebagian dari banyaknya komponen dari populasi untuk dijadikan pusat cluster awal. Algoritma K-Means pada dasarnya melakukan 2 proses yakni: proses pendeteksian lokasi pusat tiap cluster dan proses pencarian anggota dari tiap-tiap cluster. Berikut adalah kode yang berisi algoritma K-means menggunakan bahasa pemrograman Visual C++ 2008 dan librari opencv 2.2:

#include "opencv/cxcore.h"
#include "opencv/highgui.h"

int main( int argc, char** argv )
{
    #define MAX_CLUSTERS 5
    CvScalar color_tab[MAX_CLUSTERS];
    IplImage* img = cvCreateImage( cvSize( 500, 500 ), 8, 3 );
    CvRNG rng = cvRNG(0xffffffff);
   
    color_tab[0] = CV_RGB(255,0,0);
    color_tab[1] = CV_RGB(0,0,180);
    color_tab[2] = CV_RGB(100,100,255);
    color_tab[3] = CV_RGB(255,0,255);
    color_tab[4] = CV_RGB(255,255,0);

    cvNamedWindow( "clusters", 1 );

    for(;;)
    {
        int k, cluster_count = cvRandInt(&rng)%MAX_CLUSTERS + 1;
        int i, sample_count = cvRandInt(&rng)%1000 + 1;
        CvMat* points = cvCreateMat( sample_count, 1, CV_32FC2 );
        CvMat* clusters = cvCreateMat( sample_count, 1, CV_32SC1 );

        /* generate random sample from multivariate
           Gaussian distribution */
        for( k = 0; k < cluster_count; k++ )
        {
            CvPoint center;
            CvMat point_chunk;
            center.x = cvRandInt(&rng)%img->width;
            center.y = cvRandInt(&rng)%img->height;
            cvGetRows( points, &point_chunk,
                       k*sample_count/cluster_count,
                       k == cluster_count - 1 ? sample_count : 
                       (k+1)*sample_count/cluster_count );
            cvRandArr( &rng, &point_chunk, CV_RAND_NORMAL,
                       cvScalar(center.x,center.y,0,0),
                       cvScalar(img->width/6, img->height/6,0,0) );
        }

        /* shuffle samples */
        for( i = 0; i < sample_count/2; i++ )
        {
            CvPoint2D32f* pt1 = (CvPoint2D32f*)points->data.fl +
                                 cvRandInt(&rng)%sample_count;
            CvPoint2D32f* pt2 = (CvPoint2D32f*)points->data.fl +
                                 cvRandInt(&rng)%sample_count;
            CvPoint2D32f temp;
            CV_SWAP( *pt1, *pt2, temp );
        }

        cvKMeans2( points, cluster_count, clusters,
                   cvTermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER,
                                   10, 1.0 ));
        cvZero( img );
        for( i = 0; i < sample_count; i++ )
        {
            CvPoint2D32f pt = ((CvPoint2D32f*)points->data.fl)[i];
            int cluster_idx = clusters->data.i[i];
            cvCircle( img, cvPointFrom32f(pt), 2,
                      color_tab[cluster_idx], CV_FILLED );
        }

        cvReleaseMat( &points );
        cvReleaseMat( &clusters );

        cvShowImage( "clusters", img );

        int key = cvWaitKey(0);
        if( key == 27 ) // 'ESC'
            break;
    }
}
 

Setelah di kompile: hasilnya titik-titik dikelompokkan berdasarkan warna. Lihat gambar dibawah ini
Selamat mencoba (^_^). (bhm)

1 comment :

  1. permisi admin.
    Bagi mahasiswa yang perlu source code php, natif maupun framework bermetode AHP, SAW, Smart, Topsis, Fuzzy Logic, K-Means, Bayes dan lain-lain bisa kunjungi situ saya di :
    https://code-skripsi.blogspot.com/

    Terima kasih

    ReplyDelete