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高级知识点——内置对象原型
代码信息来自于http://ejohn.org/apps/learn/. 可以修改内置对象的方法. if (!Array.prototype.forEach) { Array.prototype.fo ...
- java代码如何快速添加作者描述的注释最好能有详细的图解
MyEclipse 中自动插入作者.注释日期等de快捷键方法依次打开然后找到 Window -->Preferences->Java->Editor->Templates,在这 ...
- TCP/IP详解之:ICMP协议
ICMP协议: ICMP是IP层的一个组成部分,ICMP报文是在IP数据报内部被传输的,用于在IP主机.路由器之间传递控制消息.控制消息是指网络不通.主机是否可达.路由是否可用等网络本身的消息.这些控 ...
- EC读书笔记系列之10:条款16、17
条款18 让接口容易被正确使用,不易被误用 记住: ★“促进正确使用”的办法包括接口的一致性,以及与内置类型的行为兼容 ★“阻止误用”的办法包括建立新类型.限制类型上的操作,束缚对象值,以及消除客户的 ...
- 如何使代码审查更高效【摘自InfoQ】
代码审查者在审查代码时有非常多的东西需要关注.一个团队需要明确对于自己的项目哪些点是重要的,并不断在审查中就这些点进行检查. 人工审查代码是十分昂贵的,因此尽可能地使用自动化方式进行审查,如:代码 ...
- mysql函数操作(4)
<?php ... $query = "INSERT INTO contactInfo (name, address, phone) VALUES (?, ?, ?)"; $ ...
- Flink Program Guide (1) -- 基本API概念(Basic API Concepts -- For Java)
false false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNormalTable {mso-style-n ...
- hdu 4635 Strongly connected 强连通
题目链接 给一个有向图, 问你最多可以加多少条边, 使得加完边后的图不是一个强连通图. 只做过加多少条边变成强连通的, 一下子就懵逼了 我们可以反过来想. 最后的图不是强连通, 那么我们一定可以将它分 ...
- 转载:NSobject官方介绍
概述: NSObject协议组对所有的Object-C下的objects都生效. 如果objects遵从该协议,就会被看作是first-class objects(一级类). 另外,遵从该协议的obj ...
- Python进阶--GUI编程
一.图形用户图面(GUI编程) 1. wxpython下载和安装: 下载url: http://wxpython.org/download.php 2.创建示例GUI应用程序 : ①开始需要导入wx ...