Jump to content

Fuzzy C Means Clustering in PHP(FCM)? help


edrianhadinata

Recommended Posts

please help me sir.. !

 

<?php
class Point
{
  public $x;
  public $y;

}
// Random values 0 - 1
function random_float ($min,$max) {
   return ($min+lcg_value()*(abs($max-$min)));
}


//  Fuzzy C Means Algorithm
function distributeOverMatrixU($num_of_clusters, $arr,$m) 
{
global $MatrixCentroids;
$num_of_data = sizeof($arr);


$MatrixPointX = $arr;

// Fill the  $MatrixU table with random values from 0 to 1
for($j = 0; $j < $num_of_data; $j++)
{
$sum = 0;
for($i = 0; $i < $num_of_clusters; $i++)
{
	$MatrixU[$j][$i] = random_float(0,1);
	$sum += $MatrixU[$j][$i];
}

// Normalize Data 
for($i = 0; $i < $num_of_clusters; $i++)
{

	$MatrixU[$j][$i] = $MatrixU[$j][$i]/$sum;

}

}


// repeat 200 
for($a = 0; $a<200; $a++)
{


for($i = 0; $i < $num_of_clusters; $i++)
{
$tempAx = 0;
$tempBx = 0;
$tempAy = 0;
$tempBy = 0;

for($j = 0 ; $j < $num_of_data; $j++)
{

	$tempAx = $tempAx + pow($MatrixU[$j][$i],$m);

	$tempBx += pow($MatrixU[$j][$i],$m) * $MatrixPointX[$j]->x;

	$tempAy = $tempAy + pow($MatrixU[$j][$i],$m);

	$tempBy += pow($MatrixU[$j][$i],$m) * $MatrixPointX[$j]->y;

}

$MatrixCentroids[$i] = new Point();
$MatrixCentroids[$i]->x = $tempBx / $tempAx;
$MatrixCentroids[$i]->y = $tempBy / $tempAy;


}
// Cluster Centers
for($j = 0 ; $j < $num_of_data; $j++)
{
$tempSum = 0;

for($i = 0; $i < $num_of_clusters; $i++)
{
	// Distance between 2 points
	$distance1 = pow(($MatrixPointX[$j]->x - $MatrixCentroids[$i]->x),2); 
	$distance2 = pow(($MatrixPointX[$j]->y - $MatrixCentroids[$i]->y),2);
	$distance = $distance1 + $distance2;	
	$distance = sqrt($distance);


	$MatrixU[$j][$i] = pow(1/$distance , 2/($m-1));
	$tempSum += pow(1/$distance, 2/($m-1));

}

for($i = 0; $i < $num_of_clusters; $i++)
{

	$MatrixU[$j][$i] = ($MatrixU[$j][$i]/$tempSum);
}


$sum = 0;
for($i = 0; $i < $num_of_clusters; $i++)
{

	$sum += $MatrixU[$j][$i];
}

// Norm Data
for($i = 0; $i < $num_of_clusters; $i++)
{

	$MatrixU[$j][$i] = $MatrixU[$j][$i]/$sum;

}
}
}

//print_r($MatrixCentroids);
return $MatrixU ;

}
// Connect to DB
$my_num = $_GET["cluster_number"];
$fuzz = $_GET["fuzz"];
require('db_connection.php');

$resultx=mysql_query("SELECT * FROM xdata");
$result=mysql_query("SELECT * FROM ydata");
// Διαβάζουμε όλα τα δεδομένα
while ($a_row = mysql_fetch_array($result))
{
for($j = 1 ; $j < 17; $j++)
{
	$tmp_data[$j] = $a_row[ay.$j];

}
}
while ($x_row = mysql_fetch_array($resultx))
{

 	for($j = 1; $j <17; $j++)
	{
		$p = new Point();
		$p->x = $x_row[ax.$j];	
		$p->y = $tmp_data[$j];		
		$arr[] = $p;

	}

}


// Execute algorithm

$data_in_clusters = distributeOverMatrixU($my_num, $arr,$fuzz);
$size = sizeof($arr);


$result=@mysql_query('select * from cluster0 limit 1', $link);


if ($result) {

echo "O πίνακας υπάρχει και πρέπει να διαγραφούν οι προηγούμενες εγγραφές...<BR>";
echo "Διαγραφή...<BR>";
for($i = 0; $i <100; $i++)
{

$query="DROP TABLE cluster$i";
mysql_query($query,$link);
}	
echo "H διαγραφή έγινε με επιτυχία...";

} 

for($j = 0; $j < $my_num; $j++)
{		
$query_c = "CREATE TABLE cluster$j(data_points_x FLOAT NOT NULL,data_points_y FLOAT NOT NULL)";
mysql_query($query_c,$link);
}	
for($i = 0; $i < $size ; $i++)
{
$max = 0;
$pos = 0;
for($j = 0; $j < $my_num; $j++)
{		
	$tmp_point = $data_in_clusters[$i][$j];

	if($tmp_point > $max)
	{
		$max = $tmp_point;
		$pos = $j;
	}		


}
$xxxx = $arr[$i]->x;
$yyyy = $arr[$i]->y;

$query="INSERT INTO cluster$pos(data_points_x,data_points_y)
				values('$xxxx','$yyyy')";;
mysql_query($query,$link);		

}
echo "<br>";
echo "<img src='db_scatter.php'  border=0 align=center width =600 height=400>";
// Εμφάνιση Πίνακα με τα αποτελέσματα
echo "<table width='500' border='2'>";


echo "<TR><TD><B>Points</B><BR></TD>";
for($i = 0; $i < $my_num; $i++){
$xxx = $MatrixCentroids[$i]->x;
$yyy = $MatrixCentroids[$i]->y;
echo "<TD>Cluster $i Centoid:<br><b>X:$xxx Y:$yyy</b></TD>";
}
echo "</tr>";
for($i = 0; $i < $size ; $i++)
{
$x = $arr[$i]->x;
$y = $arr[$i]->y;
echo "<TR>";
echo "<TD><b>x:$x</b><br><b>y:$y</b></TD>";
for($j = 0; $j < $my_num; $j++)
{

	$tmp_point = $data_in_clusters[$i][$j];
	echo "<TD> $tmp_point</TD>";

}
echo "</TR>";
}
echo "</TABLE>";


?>

 

// zero divition --->  :'( :'(

 

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.