首页 > 学院 > 逻辑算法 > 正文

k-means clustering K平均算法

2020-03-22 19:48:03
字体:
来源:转载
供稿:网友
  • 此算法的主要作用:屏幕上很多的点,把相邻的点聚到离他最近的点。

    k-means algorithm算法是一个聚类算法,把n个对象根据他们的属性分为k个分割,k < n。它与处理混合正态分布的最大期望算法很相似,因为他们都试图找到数据中自然聚类的中心。

    php实现算法代码如下:


    html' target='_blank'>class Cluster {   public $points;   public $avgPoint;   function calculateAverage($maxX, $maxY)   {     if (count($this->points)==0)     {         $this->avgPoint->x = rand(0, $maxX);         $this->avgPoint->y =  rand(0,$maxY);         //we didn't get any clues at all :( lets just randomize and hope for better...         return;     }      foreach($this->points as $p)         {          $xsum += $p->x;          $ysum += $p->y;         }         $count = count($this->points);       $this->avgPoint->x =  $xsum / $count;       $this->avgPoint->y =  $ysum / $count;   } }   class Point {   public $x;   public $y;   function getDistance($p)         {          $x1 = $this->x - $p->x;          $y1 = $this->y - $p->y;          return sqrt($x1*$x1 + $y1*$y1);         } }   function distributeOverClusters($k, $arr) {  foreach($arr as $p)         { if ($p->x > $maxX)                 $maxX = $p->x;           if ($p->y > $maxY)                 $maxY = $p->y;         }   $clusters = array();   for($i = 0; $i < $k; $i++)         {          $clusters[] = new Cluster();          $tmpP = new Point();          $tmpP->x=rand(0,$maxX);          $tmpP->y=rand(0,$maxY);          $clusters[$i]->avgPoint = $tmpP;         }   #deploy points to closest center.   #recalculate centers   for ($a = 0; $a < 200; $a++) # run it 200 times   {         foreach($clusters as $cluster)                 $cluster->points = array(); //reinitialize         foreach($arr as $pnt)         {            $bestcluster=$clusters[0];            $bestdist = $clusters[0]->avgPoint->getDistance($pnt);              foreach($clusters as $cluster)                 {                         if ($cluster->avgPoint->getDistance($pnt) < $bestdist)                         {                                 $bestcluster = $cluster;                                 $bestdist = $cluster->avgPoint->getDistance($pnt);                         }                 }                 $bestcluster->points[] = $pnt;//add the point to the best cluster.         }         //recalculate the centers.         foreach($clusters as $cluster)                 $cluster->calculateAverage($maxX, $maxY);     }   return $clusters; }   $p = new Point(); $p->x = 2; $p->y = 2; $p2 = new Point(); $p2->x = 3; $p2->y = 2; $p3 = new  Point(); $p3->x = 8; $p3->y = 2; $arr[] = $p; $arr[] = $p2; $arr[] = $p3; var_dump(distributeOverClusters(2, $arr));

    PHP编程

    郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

  • 发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表