Read 269 times | Created 2013-07-27 09:44:50 | Updated 2013-07-27 09:44:50 | | |

 

<?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");
// Read all data
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 table exists and should be deleted previous entries ...<BR>";
echo "Delete ...<BR>";
for($i = 0; $i <100; $i++)
  {
    $query="DROP TABLE cluster$i";
    mysql_query($query,$link);
  }
  echo "H deletion was successful ...";
}
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>";
// Display tabular results
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>";
?>