global imax , dmax , kl$ , num.clusters WindowWidth = DisplayWidth WindowHeight = DisplayHeight global winx , winy winx = WindowWidth winy = WindowHeight imax = 63 dmax = 1 kl$ = "red green blue yellow pink cyan" dim raw( imax , dmax ) , i( imax ) for i = 0 to imax raw( i , 0 ) = ( i mod 4 ) + ( i / 4 mod 2 ) * 300 + 50 raw( i , 1 ) = ( i / 8 mod 4 ) + ( i / 32 mod 2 ) * 300 + 50 next i num.clusters = 4 dim c( num.clusters , dmax ) , tot( num.clusters ) _ , tel( num.clusters ) for i = 0 to imax i( i ) = dice( num.clusters ) next i nomainwin open "k means demo" for graphics as #m #m "trapclose [quit]" call showdata call sleep 1000 fl = 1 while fl fl = 0 for i = 0 to imax scan olddist = dist() old = i( i ) d = dice( num.clusters ) while d = old d = dice( num.clusters ) i( i ) = d wend if olddist < dist() then i( i ) = old else fl = 1 end if next i call showdata call sleep 250 wend notice "READY !!" wait [quit] close #m end function range( l , h ) range = rnd(0) * ( h - l ) + l end function function dice( x ) dice = int( rnd(0) * ( int( x ) - 1e-10 ) ) end function function dist() ''first calc certrums for i = 0 to dmax for j = 0 to num.clusters tot( j ) = 0 tel( j ) = 0 next j for j = 0 to imax tot( i( j ) ) = tot( i( j ) ) + raw(j,i) tel( i( j ) ) = tel( i( j ) ) + 1 next j for j = 0 to imax c( i( j ) , i ) = tot( i( j ) ) / ( tel( i( j ) ) + 1 ) next j next i ''then calc tot sum uit = 0 for i = 0 to imax sum = 0 for j = 0 to dmax sum = sum + ( raw( i , j ) _ - c( i( i ) , j ) ) ^ 2 next j uit = uit + sqr( sum ) next i dist = uit end function sub sleep ms CallDLL #kernel32, "Sleep" _ , ms As long _ , ret As void end sub sub showdata #m "fill black" #m "size 7" for i = 0 to imax #m "goto " ; 50 + raw( i , 0 ) _ ; " " ; 50 + raw( i , 1 ) #m "color " ; word$( kl$ , i( i ) + 1 ) #m "backcolor " ; word$( kl$ , i( i ) + 1 ) #m "down" #m "circlefilled 5" #m "up" next i for i = 0 to num.clusters - 1 #m "goto " ; 50 + c( i , 0 ) _ ; " " ; 50 + c( i , 1 ) #m "color " ; word$( kl$ , i + 1 ) #m "backcolor white" #m "down" #m "circle 50" #m "up" next i end sub