聚类算法k-Means的实现

 <?php
/*
*Kmeans法(聚类算法的实现)
*/ /* *求误差平方和J */ //--------------------------------------------------------------------
function JI($center,$array_center)
{
$total_sum = 0;
for($i=0;$i<count($center);$i++)
{
for($j=0;$j<count($center[$i]);$j++)
{
$sum = 0;
for($k=1;$k<=3;$k++)
{
//print_r("$center[$i][$k]".$center[$i][$j][$k]."<br>");
$sum +=pow($center[$i][$j][$k]-$array_center[$i][$k-1],2);
}
//print_r($sum."<br>");
$total_sum +=$sum;
}
}
return $total_sum;
}
//-------------------------------------------------------------------- /* *K-means(聚类算法的实现) */ //--------------------------------------------------------------------
function Kmeans($train,$k,$array_center)
{ $flags = true;
do{
if($flags)
{
$total_sum = 10;
}else $total_sum = $total_sum2;
$array_distance = array(array());
array_splice($array_distance,0,1);
for($i=1;$i<count($train);$i++)
{
$array =array(NULL);
$array[0]=$train[$i][0];
for($j=1;$j<count($train[$i]);$j++)
{
/*
print_r($train[$i][1]." ");
print_r($array_center[$j-1][2]." ");
print_r(pow($train[$i][1]-$array_center[$j-1][0],2)." ");
*/
$sum = 0;
for($m=0;$m<count($array_center);$m++)
{
$sum +=pow($train[$i][$m+1]-$array_center[$j-1][$m],2);
}
$distance = sqrt($sum);
/*
print_r($sum." ");
print_r($distance." "); echo "<br>";
*/ array_push($array,$distance);
}
array_push($array_distance,$array);
}
$array_min = array(array());
array_splice($array_min,0,1);
for($i=0;$i<count($array_distance);$i++)
{
$array = array(NULL);
$array[0] = $array_distance[$i][0];
$num = 1;
$min = $array_distance[$i][1];
for($j=2;$j<count($array_distance[$i]);$j++)
{
if($min>$array_distance[$i][$j]){
$num++;
$min = $array_distance[$i][$j];
}
}
array_push($array,$num);
// array_push($array,$min);
array_push($array_min,$array);
}
for($i=0;$i<$k;$i++)
{
$center[$i]= array(NULL);
array_splice($center[$i],0,1);
}
for($i=1;$i<count($train);$i++)
{
for($j=0;$j<$k;$j++)
{
if($array_min[$i-1][1]==($j+1))
{
array_push($center[$j],$train[$i]);
break;
}
}
}
$array_center = array(array(NULL,NULL,NULL));
array_splice($array_center,0,1);
for($i=0;$i<$k;$i++)
{
$sum = array(NULL);
for($j=0;$j<3;$j++)
{
$sum[$j] = 0;
//print_r($sum[$j]);
}
for($j=0;$j<count($center[$i]);$j++)
{
$sum[0]+=$center[$i][$j][1];
$sum[1]+=$center[$i][$j][2];
$sum[2]+=$center[$i][$j][3];
}
for($j=0;$j<3;$j++)
{
$sum[$j] /= count($center[$i]);
//print_r($sum[$j]."<BR>");
}
array_push($array_center,$sum);
}
$total_sum2 = JI($center,$array_center);
$flags = false;
/*
print_r($total_sum."<br>");
print_r($total_sum2."<br>");
print_r(abs($total_sum2-$total_sum)."<br>");
*/
}while(abs($total_sum2-$total_sum)>0.000002); $result = array(array());
array_splice($result,0,1);
for($i=0;$i<count($center);$i++)
{
$temp = array(NULL);
for($j=0;$j<count($center[$i]);$j++)
{
$temp[$j] = $center[$i][$j][0];
print_r($center[$i][$j][0]." ");
}
array_push($result,$temp);
echo "<br>";
}
return $result;
/*
echo "<pre>";
print_r($array_distance);
echo "<pre>";
print_r($array_min);
echo "<pre>";
print_r($center);
echo "<pre>";
print_r($array_center);
*/
}
//-------------------------------------------------------------------- /*
*数据[0,1]规格化
*/
//--------------------------------------------------------------------
function normalization($train)
{
for($i=1;$i<count($train[0]);$i++)
{
$min = $train[1][$i];
$max = $train[1][$i];
for($j=1;$j<count($train);$j++)
{
if($train[$j][$i]<$min)
{
$min = $train[$j][$i];
} if($train[$j][$i]>$max)
{
$max = $train[$j][$i];
}
}
for($j=1;$j<count($train);$j++)
{
$train[$j][$i] = round(($train[$j][$i]-$min)/($max-$min),2);
}
}
return $train;
}
//-------------------------------------------------------------------- /* *把.txt中的内容读到数组中保存
*$filename:文件名称 */ //--------------------------------------------------------------------
function getFileContent($filename)
{
$array = array(null);
$content = file_get_contents($filename);
$result = explode("\r\n",$content);
//print_r(count($result));
for($j=0;$j<count($result);$j++)
{
//print_r($result[$j]."<br>");
$con = explode(" ",$result[$j]);
array_push($array,$con);
}
array_splice($array,0,1);
return $array;
}
//-------------------------------------------------------------------- /* *把数组中内容写到.txt中保存
*$result:要存储的数组内容
*$filename:文件名称 */ //--------------------------------------------------------------------
function Array_Totxt($result,$filename)
{
$fp= fopen($filename,'wb');
for($i=0;$i<count($result);$i++)
{
$temp = NULL;
for($j=0;$j<count($result[$i]);$j++)
{
$temp = $result[$i][$j]."\t";
fwrite($fp,$temp);
}
fwrite($fp,"\r\n");
}
fclose($fp);
}
//--------------------------------------------------------------------
$train = getFileContent("train.txt");
$train_normalization = normalization($train); /* *设k=3,即将这15支球队分成三个集团。现抽取日本、巴林和泰国的值作为三个簇的种子 */
$array_center = array(array(NULL,NULL,NULL));
array_splice($array_center,0,1);
$array1= $train_normalization[2];
array_splice($array1,0,1);
array_push($array_center,$array1);
$array1= $train_normalization[13];
array_splice($array1,0,1);
array_push($array_center,$array1);
$array1= $train_normalization[10];
array_splice($array1,0,1);
array_push($array_center,$array1); $result = Kmeans($train_normalization,3,$array_center);
Array_Totxt($result,'result.txt');
Array_Totxt($train_normalization,'normalization_train.txt'); ?>

原始数据:

原始数据进行[0,1]规格化后的数据:

结果:每行是一个类别

K-means算法[聚类算法]的更多相关文章

  1. 机器学习 - 算法 - 聚类算法 K-MEANS / DBSCAN算法

    聚类算法 概述 无监督问题 手中无标签 聚类 将相似的东西分到一组 难点 如何 评估, 如何 调参 基本概念 要得到的簇的个数  - 需要指定 K 值 质心 - 均值, 即向量各维度取平均 距离的度量 ...

  2. K-Modes算法[聚类算法]

    聚类算法k-Modes的实现 <?php /* *Kmodes算法(聚类算法的实现) */ /* *获取簇的数目 */ //----------------------------------- ...

  3. KNN 与 K - Means 算法比较

    KNN K-Means 1.分类算法 聚类算法 2.监督学习 非监督学习 3.数据类型:喂给它的数据集是带label的数据,已经是完全正确的数据 喂给它的数据集是无label的数据,是杂乱无章的,经过 ...

  4. 一步步教你轻松学K-means聚类算法

    一步步教你轻松学K-means聚类算法(白宁超  2018年9月13日09:10:33) 导读:k-均值算法(英文:k-means clustering),属于比较常用的算法之一,文本首先介绍聚类的理 ...

  5. Spark MLlib架构解析(含分类算法、回归算法、聚类算法和协同过滤)

    Spark MLlib架构解析 MLlib的底层基础解析 MLlib的算法库分析 分类算法 回归算法 聚类算法 协同过滤 MLlib的实用程序分析 从架构图可以看出MLlib主要包含三个部分: 底层基 ...

  6. ML: 聚类算法-K均值聚类

    基于划分方法聚类算法R包: K-均值聚类(K-means)                   stats::kmeans().fpc::kmeansruns() K-中心点聚类(K-Medoids) ...

  7. 基于改进人工蜂群算法的K均值聚类算法(附MATLAB版源代码)

    其实一直以来也没有准备在园子里发这样的文章,相对来说,算法改进放在园子里还是会稍稍显得格格不入.但是最近邮箱收到的几封邮件让我觉得有必要通过我的博客把过去做过的东西分享出去更给更多需要的人.从论文刊登 ...

  8. K均值聚类算法的MATLAB实现

    1.K-均值聚类法的概述    之前在参加数学建模的过程中用到过这种聚类方法,但是当时只是简单知道了在matlab中如何调用工具箱进行聚类,并不是特别清楚它的原理.最近因为在学模式识别,又重新接触了这 ...

  9. Kmeans算法的K值和聚类中心的确定

    0 K-means算法简介 K-means是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一. K-means算法的基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类.通过迭代的 ...

随机推荐

  1. javaScript 工作必知(八) 属性的特性 值、写、枚举、可配置

    属性的特性 每个对象都拥有属性,属性具有哪些特性呢? 1.属性具有值.  2.属性是否是可写的.            3.是否是可枚举的.            4.是否是可配置的.   " ...

  2. javascript事件:获取事件对象getEvent函数

    在javascript开发中我们会经常获取页面中的事件对象,然后来处理这些事件,例如下面的getEvent函数就是获取javascript下的页面事件对象. function getEvent(eve ...

  3. javascript 全选与反选

    <html xmlns="http://www.w3.org/1999/xhtml"><head runat="server">    ...

  4. .NET面试题解答

    抽象类和接口有什么区别?使用时候有什么需要注意的吗?答:相同点:都不能被直接实例化,都通过继承实现其抽象方法: 不同点: 1) 接口支持多继承:抽象类不能实现多继承: 2) 接口只能定义行为:抽象类既 ...

  5. Android基础之CountDownTimer 倒计时类

    app常用的60s倒计时计时功能: private static final int TIME_LIMIT = 60; private void initView() { // 相关控件 mResen ...

  6. Intellij Idea的一些配置

    1.字体 修改IDEA面板字体:Settings->Appearance-> Override default fonts by(not recommended)选中,选择自己喜欢的字体 ...

  7. 标准建立二叉树NEW

    #include<iostream> #include<sstream> #include<stdio.h> #include<string> #inc ...

  8. onload ready

    确保在 <body> 元素的onload事件中没有注册函数,否则不会触发$(document).ready()事件. 可以在同一个页面中无限次地使用$(document).ready()事 ...

  9. NodeJS爬虫系统初探

    NodeJS爬虫系统 NodeJS爬虫系统 0. 概论 爬虫是一种自动获取网页内容的程序.是搜索引擎的重要组成部分,因此搜索引擎优化很大程度上是针对爬虫而做出的优化. robots.txt是一个文本文 ...

  10. hadoop笔记之Hive的数据存储(内部表)

    Hive的数据存储(内部表) Hive的数据存储(内部表) 基于HDFS 可使用hadoop给我们提供的web管理工具查看数据.打开管理工具localhost:9000–>Utilities下的 ...