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个点为中心进行聚类,对最靠近他们的对象归类.通过迭代的 ...
随机推荐
- DevExpress中ChartControl柱状图(Bar)用法
我的数据 代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 chartControl1.Series.Clear(); ...
- HTTP协议探析
1.HTTP协议概述 超文本传输协议(HTTP)是一种为分布式,协作式的,超媒体信息系统.它是一种通用的,无状态(stateless)的协议,除了应用于超文本传输外,它也可以应用于诸如名称服务器和分布 ...
- M记单刷鸡盒副本
今天去M记单刷鸡盒副本,听说此副本掉落最新道具:黑暗之门.鸡翅区和鸡块区全通无压力,鸡腿区难度最大,老一是个灭团点.现在肚子很难受,刚去厕所吐了一把,看来有点高估自己,此副本最好还是组队前往,单刷压力 ...
- JVM结构、GC工作机制详解(转)
原文地址:http://blog.csdn.NET/tonytfjing/article/details/44278233 JVM结构.内存分配.垃圾回收算法.垃圾收集器.下面我们一一来看. 一.JV ...
- QF——iOS的单例模式
iOS的单例模式: 单例,即为单个实例,确保一个类里只有一个实例,向整个系统提供一个唯一的实例. 甚至为了严格提供唯一的实例,通常只允许该类自己提供实例化的方法,不允许出现其他入口.这时我们通常得重写 ...
- jQuery 源码分析和使用心得 - 文档遍历 ( traversing.js )
jQuery之所以这么好用, 首先一点就是$()方法和它强大的选择器. 其中选择器使用的是sizzle引擎, sizzle是jQuery的子项目, 提供高效的选择器查询. 有个好消息告诉大家, 就是s ...
- javascript 多行字符串
javascript 字符串多行 平时一般使用 字符串+,或者[].join('')的方式 同事推荐了这样的形式 ExceptionDivHtml="<div class='gameI ...
- 利用JSP编程技术实现一个简单的购物车程序
实验二 JSP编程 一.实验目的1. 掌握JSP指令的使用方法:2. 掌握JSP动作的使用方法:3. 掌握JSP内置对象的使用方法:4. 掌握JavaBean的编程技术及使用方法:5. 掌握JSP ...
- Python中文显示问题
默认pyhon使用ASCII码来解释程序的,默认不支持中文,需要在程序的第一行或者第二行声明编码. 官方解决方案:https://www.python.org/dev/peps/pep-0263/ T ...
- 轮播图插件myFocus使用
myFocus官网下载源码,本文是v2.0.1版,解压后如下 将js包内文件拷入工程 在工程内引入 <script src="js/myfocus-2.0.1.min.js" ...