聚类算法k-Modes的实现

 <?php
/*
*Kmodes算法(聚类算法的实现)
*/ /*
*获取簇的数目
*/
//--------------------------------------------------------------------
function Category($train)
{
$category = array(NULL);//存放不同的类别
array_splice($category,0,1); for($i=1;$i<count($train);$i++)
{
$flags = true;//标志,用于标记将要存入的类别是否已经存在
for($j=0;$j<count($category);$j++)
{
if($category[$j]==$train[$i][count($train[$i])-1])
{
$flags = false;
break;
}
}
if($flags)
{
array_push($category,$train[$i][count($train[$i])-1]);
}
}
return $category;
}
//-------------------------------------------------------------------- /*
*获得初始矩阵M
*/
//--------------------------------------------------------------------
function first_M($train)
{
$category = Category($train);
$M = array(NULL);
array_splice($M,0,1);
$num = 1;
for($j=0;$j<count($category);$j++)
{
while($num<count($train))
{
if($train[$num][count($train[$num])-1]==$category[$j])
{
$temp = $train[$num];
//print_r($temp);
array_splice($temp,0,1);
array_splice($temp,count($temp)-1,1);
array_push($M,$temp);
$num++;
break;
}else{
$num++;
}
}
}
/* echo "<pre>";
print_r($M);
*/
return $M;
}
//-------------------------------------------------------------------- /*
*获得距离dis(ml,ei)
*/
//--------------------------------------------------------------------
function dis($array,$e)
{
$temp = $array;
$sum = 0;
for($i=1;$i<count($array)-1;$i++)
{
if($array[$i]!=$e[$i-1])
{
$sum++;
}
}
return $sum;
}
//-------------------------------------------------------------------- /*
*获得新的矩阵W
*/
//--------------------------------------------------------------------
function W($train,$M)
{
$W = array(NULL); for($i=1;$i<count($train);$i++)
{
$flags = true;
$min = dis($train[$i],$M[0]);
for($j=2;$j<=count($M);$j++)
{
if(dis($train[$i],$M[$j-1])<$min)
{
$min = dis($train[$j],$M[$j-1]);
}
} for($j=1;$j<=count($M);$j++)
{
if(dis($train[$i],$M[$j-1])==$min)
{
$num = $j;
break;
}
}
for($j=1;$j<=count($M);$j++)
{ if($j!=$num)
{
$W[$j][$i] = 0;
}else{
$W[$j][$i] = 1;
} }
}
/*
for($i=1;$i<=count($M);$i++)
{
$flags = true;
for($j=2;$j<count($train);$j++)
{
$flags = true;
$min = dis($train[$j],$M[$i-1]);
for($k=1;$k<=count($M);$k++)
{
if((dis($train[$j],$M[$k-1])<=$min)&&($k!=$i))
{
$flags = false;
break;
}
}
if($flags)
{
$W[$i][$j] = 1;
}else $W[$i][$j] = 0;
}
}
*/
return $W;
}
//-------------------------------------------------------------------- /*
*获得 F_W_M
*/
//--------------------------------------------------------------------
function F_W_M($train,$M,$W)
{
$fwm = 0;
for($i=1;$i<=count($M);$i++)
{
for($j=1;$j<count($train);$j++)
{
$fwm += dis($train[$j],$M[$i-1])*$W[$i][$j];
}
}
/* echo "<pre>";
//print_r($W);
echo "<pre>";
print_r($fwm);
*/
return $fwm;
}
//-------------------------------------------------------------------- /*
*获得新的矩阵M单行元素
*/
//--------------------------------------------------------------------
function New_SingleM($array)
{
$new_m = array();
array_splice($new_m,0,1);
for($i=1;$i<count($array[0])-1;$i++)
{
$temp = array();
array_splice($temp,0,1);
for($j=0;$j<count($array);$j++)
{
$flags = true;
for($k=0;$k<count($temp);$k++)
{
if($temp[$k][0]==$array[$j][$i])
{
$flags = false;
$temp[$k][1]++;
}
}
if($flags)
{
array_push($temp,array($array[$j][$i],1));
}
}
$max[0]=$temp[0][0];
$max[1]=$temp[0][1];
for($j=1;$j<count($temp);$j++)
{
if($temp[$j][1]>$max[1])
{
$max[0]=$temp[$j][0];
$max[1]=$temp[$j][1];
}
}
array_push($new_m,$max[0]);
/*
echo "<pre>";
print_r($temp);
print_r($max[0]);
*/
}
/*
echo "<pre>";
print_r($new_m);
*/
return $new_m;
}
//-------------------------------------------------------------------- /*
*获得新的矩阵M
*/
//--------------------------------------------------------------------
function New_M($train,$W)
{
$new_train = array(NULL);
array_splice($new_train,0,1);
for($i=1;$i<count($W);$i++)
{
$array = array(NULL);
array_splice($array,0,1);
for($j=1;$j<=count($W[1]);$j++)
{
if($W[$i][$j]==1)
{
array_push($array,$train[$j]);
}
}
array_push($new_train,$array);
}
$new_M = array();
array_splice($new_M,0,1);
for($i=0;$i<count($new_train);$i++)
{
array_push($new_M,New_SingleM($new_train[$i]));
}
/* echo "<pre>";
print_r($new_train); echo "<pre>";
print_r($new_M);
*/
return $new_M;
}
//-------------------------------------------------------------------- /*
*Kmodes算法
*$m,&$w,返回矩阵M,W
*/
//--------------------------------------------------------------------
function Kmodes($train,&$m,&$w)
{
$M = first_M($train);
$FWM = 1;
$FWM2 =0;
while(abs($FWM2 - $FWM)>0)
{
$W = W($train,$M);
$FWM = F_W_M($train,$M,$W);
$M = New_M($train,$W);
$FWM2 = F_W_M($train,$M,$W); if(abs($FWM2 - $FWM )>0)
{
$FWM = $FWM2;
$W = W($train,$M2);
$FWM2 = F_W_M($train,$M,$W);
}
}
$m = $M;
$w = $W;
}
//-------------------------------------------------------------------- /*
*把.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");
Kmodes($train,$M,$W);
Array_Totxt($M,"M.txt");
Array_Totxt($W,"w.txt"); ?>

M矩阵:

W矩阵:

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

  1. K-means算法[聚类算法]

    聚类算法k-Means的实现 <?php /* *Kmeans法(聚类算法的实现) */ /* *求误差平方和J */ //----------------------------------- ...

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

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

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

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

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

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

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

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

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

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

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

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

  8. 聚类算法:K-means 算法(k均值算法)

    k-means算法:      第一步:选$K$个初始聚类中心,$z_1(1),z_2(1),\cdots,z_k(1)$,其中括号内的序号为寻找聚类中心的迭代运算的次序号. 聚类中心的向量值可任意设 ...

  9. 聚类算法:K均值、凝聚层次聚类和DBSCAN

    聚类分析就仅根据在数据中发现的描述对象及其关系的信息,将数据对象分组(簇).其目标是,组内的对象相互之间是相似的,而不同组中的对象是不同的.组内相似性越大,组间差别越大,聚类就越好. 先介绍下聚类的不 ...

随机推荐

  1. 如何生成log新信息背景图片和在图片上添加水印

    在图片上添加文字水印,其实就是要用到两个类, using System.Drawing;             using System.Drawing.Drawing2D; 废话不多说了,直接上代 ...

  2. C# Log4Net使用指南(转)

    1           简介 1.1          Log4net的优点: 几乎所有的大型应用都会有自己的用于跟踪调试的API.因为一旦程序被部署以后,就不太可能再利用专门的调试工具了.然而一个管 ...

  3. 漫谈AOP开发之初探AOP及AspectJ的用法

    一.为什么需要AOP技术 AOP 是一个很成熟的技术. 假如项目中有方法A.方法B.方法C……等多个方法, 如果项目需要为方法A.方法B.方法C……这批方法增加具有通用性质的横切处理.   下图可以形 ...

  4. php传参方式1--ajax

    AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术. AJAX = 异步 JavaScript和 ...

  5. background:url 的使用方法

    #pingfen li{ width:27px; float:left; height:28px; cursor:pointer; background:url( ; list-style:none; ...

  6. python request使用

    相比httplib.urllib,request真是太美丽了,记录下 下载安装地址:http://docs.python-requests.org/en/latest/user/install/#in ...

  7. Sencha Touch 之 Ext.ComponentManager.get方法使用

    HTML代码: <!doctype html> <html> <head> <meta charset="utf-8"> <t ...

  8. html中上标、下标、删除字、小号字等

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. J2SE知识点摘记(二十三)

    我们简单介绍一下这个接口: 1.4.3        Comparable 接口 在 java.lang 包中,Comparable 接口适用于一个类有自然顺序的时候.假定对象集合是同一类型,该接口允 ...

  10. J2SE知识点摘记(二十二)

    Map 1.4.1        概述 数学中的映射关系在Java中就是通过Map来实现的.它表示,里面存储的元素是一个对(pair),我们通过一个对象,可以在这个映射关系中找到另外一个和这个对象相关 ...