K-means算法[聚类算法]
聚类算法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算法[聚类算法]的更多相关文章
- 机器学习 - 算法 - 聚类算法 K-MEANS / DBSCAN算法
聚类算法 概述 无监督问题 手中无标签 聚类 将相似的东西分到一组 难点 如何 评估, 如何 调参 基本概念 要得到的簇的个数 - 需要指定 K 值 质心 - 均值, 即向量各维度取平均 距离的度量 ...
- K-Modes算法[聚类算法]
聚类算法k-Modes的实现 <?php /* *Kmodes算法(聚类算法的实现) */ /* *获取簇的数目 */ //----------------------------------- ...
- KNN 与 K - Means 算法比较
KNN K-Means 1.分类算法 聚类算法 2.监督学习 非监督学习 3.数据类型:喂给它的数据集是带label的数据,已经是完全正确的数据 喂给它的数据集是无label的数据,是杂乱无章的,经过 ...
- 一步步教你轻松学K-means聚类算法
一步步教你轻松学K-means聚类算法(白宁超 2018年9月13日09:10:33) 导读:k-均值算法(英文:k-means clustering),属于比较常用的算法之一,文本首先介绍聚类的理 ...
- Spark MLlib架构解析(含分类算法、回归算法、聚类算法和协同过滤)
Spark MLlib架构解析 MLlib的底层基础解析 MLlib的算法库分析 分类算法 回归算法 聚类算法 协同过滤 MLlib的实用程序分析 从架构图可以看出MLlib主要包含三个部分: 底层基 ...
- ML: 聚类算法-K均值聚类
基于划分方法聚类算法R包: K-均值聚类(K-means) stats::kmeans().fpc::kmeansruns() K-中心点聚类(K-Medoids) ...
- 基于改进人工蜂群算法的K均值聚类算法(附MATLAB版源代码)
其实一直以来也没有准备在园子里发这样的文章,相对来说,算法改进放在园子里还是会稍稍显得格格不入.但是最近邮箱收到的几封邮件让我觉得有必要通过我的博客把过去做过的东西分享出去更给更多需要的人.从论文刊登 ...
- K均值聚类算法的MATLAB实现
1.K-均值聚类法的概述 之前在参加数学建模的过程中用到过这种聚类方法,但是当时只是简单知道了在matlab中如何调用工具箱进行聚类,并不是特别清楚它的原理.最近因为在学模式识别,又重新接触了这 ...
- Kmeans算法的K值和聚类中心的确定
0 K-means算法简介 K-means是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一. K-means算法的基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类.通过迭代的 ...
随机推荐
- javascript事件:获取事件对象getEvent函数
在javascript开发中我们会经常获取页面中的事件对象,然后来处理这些事件,例如下面的getEvent函数就是获取javascript下的页面事件对象. function getEvent(eve ...
- 发布前,Bat Script备份服务器的Website
由于远程访问服务器,操作滞后验证,备份不方便.我试了两种方式,VBScript和利用7zip的脚本自动备份网站.下面有简单的说明供参考. 1. VBScript, 使用VB脚本打包,不稳定,在服务器上 ...
- Caused by: java.lang.UnsupportedClassVersionError: com/zy/example/domain/Student : Unsupported major.minor version 51.0
JVM的版本比jdk的版本老,即JVM的版本低于jdk的版本.换个新版本的就可以解决问题.
- Mantis 1.1.0 报告问题中设置必填项或取消必填项[Z]
打开/mantis/core/bug_api.php,其中有类似下面的语句 if ( is_blank( $c_summary ) ) { error_parameters( lang_get( ...
- TSQL 根据经纬度计算两点间的距离;返回米(m)
-- ============================================= -- Author:Forrest -- Create date: 2013-07-16 -- Des ...
- Java Eclipse常规设置
改变字体大小 eclipse英文版中如何去修改字体及方法?首先打开eclipse中,按下面的方法即可菜单项:window ->preferences -> general -> ap ...
- 1.js编程风格。 --- 编写可维护的javascript
1. 使用4个空格字符作为一个缩进层级. 2. 不省略分号. ---> 自动插入分号机制非常复杂,且难于记忆. 3. 行的长度限定于80个字符. 4. 通常在运算符换行之后,下一行会增加两个层级 ...
- java/php/c#版rsa签名以及验签实现
本文为转载,请转载请注明地址: 原文地址为 http://xw-z1985.iteye.com/blog/1837376 在开放平台领域,需要给isv提供sdk,签名是Sdk中需要提供的 ...
- nodejs 下载网页及相关资源文件
功能其实很见简单,通过 phantomjs.exe 采集 url 加载的资源,通过子进程的方式,启动nodejs 加载所有的资源,对于css的资源,匹配css内容,下载里面的url资源 当然功能还是很 ...
- SQL文件导入到mysql乱码
在输入中文之前先SET NAMES GBK 彻底解决MYSQL中文乱码的办法((5.5以后版本:) 修改MYSQL配置文件my.ini [client] default-character-set=u ...