K-Modes算法[聚类算法]
聚类算法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算法[聚类算法]的更多相关文章
- K-means算法[聚类算法]
聚类算法k-Means的实现 <?php /* *Kmeans法(聚类算法的实现) */ /* *求误差平方和J */ //----------------------------------- ...
- 机器学习 - 算法 - 聚类算法 K-MEANS / DBSCAN算法
聚类算法 概述 无监督问题 手中无标签 聚类 将相似的东西分到一组 难点 如何 评估, 如何 调参 基本概念 要得到的簇的个数 - 需要指定 K 值 质心 - 均值, 即向量各维度取平均 距离的度量 ...
- 一步步教你轻松学K-means聚类算法
一步步教你轻松学K-means聚类算法(白宁超 2018年9月13日09:10:33) 导读:k-均值算法(英文:k-means clustering),属于比较常用的算法之一,文本首先介绍聚类的理 ...
- Spark MLlib架构解析(含分类算法、回归算法、聚类算法和协同过滤)
Spark MLlib架构解析 MLlib的底层基础解析 MLlib的算法库分析 分类算法 回归算法 聚类算法 协同过滤 MLlib的实用程序分析 从架构图可以看出MLlib主要包含三个部分: 底层基 ...
- 基于改进人工蜂群算法的K均值聚类算法(附MATLAB版源代码)
其实一直以来也没有准备在园子里发这样的文章,相对来说,算法改进放在园子里还是会稍稍显得格格不入.但是最近邮箱收到的几封邮件让我觉得有必要通过我的博客把过去做过的东西分享出去更给更多需要的人.从论文刊登 ...
- K均值聚类算法的MATLAB实现
1.K-均值聚类法的概述 之前在参加数学建模的过程中用到过这种聚类方法,但是当时只是简单知道了在matlab中如何调用工具箱进行聚类,并不是特别清楚它的原理.最近因为在学模式识别,又重新接触了这 ...
- Kmeans算法的K值和聚类中心的确定
0 K-means算法简介 K-means是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一. K-means算法的基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类.通过迭代的 ...
- 聚类算法:K-means 算法(k均值算法)
k-means算法: 第一步:选$K$个初始聚类中心,$z_1(1),z_2(1),\cdots,z_k(1)$,其中括号内的序号为寻找聚类中心的迭代运算的次序号. 聚类中心的向量值可任意设 ...
- 聚类算法:K均值、凝聚层次聚类和DBSCAN
聚类分析就仅根据在数据中发现的描述对象及其关系的信息,将数据对象分组(簇).其目标是,组内的对象相互之间是相似的,而不同组中的对象是不同的.组内相似性越大,组间差别越大,聚类就越好. 先介绍下聚类的不 ...
随机推荐
- JS继承,原型继承,构造函数的继承,非构造函数"的继承
a.原型继承 一.new运算符的缺点 用构造函数生成实例对象,有一个缺点,那就是无法共享属性和方法.比如,在DOG对象的构造函数中,设置一个实例对象的共有属性species. function DOG ...
- js实现弹出窗口、页面变成灰色并不可操作的例子
function show() //显示隐藏层和弹出层 { var hideobj=document.getElementById("hidebg"); hidebg.style. ...
- JAVA 年老代收集器 第10节
JAVA 年老代收集器 第10节 上一章我们讲了新生代的收集器,那么这一章我们要讲的就是关于老年代的一些收集器.老年代的存活的一般是大对象以及生命很顽强的对象,因此新生代的复制算法很明显不能适应该区域 ...
- start.sh
JAVA_OPTS=" -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true "JAVA_MEM_OPTS=" ...
- Java格式化输出
Java的格式化输出等同于String.Format,与C有很大的相似,比如 System.out.printf("%8.2f", x);在printf中,可以使用多个参数,例如: ...
- Matlab插值计算各时刻磁法勘探日变观测值
Matlab插值计算各时刻磁法勘探日变观测值 在磁法勘探中,消日变影响的改正称为日变改正.进行日变改正时必须设立日变站,观测日变情况.根据日变数据和测点观测时间,对观测数据进行改正. 在本次磁法实习中 ...
- 全数字锁相环(DPLL)的原理简介以及verilog设计代码
随着数字电路技术的发展,数字锁相环在调制解调.频率合成.FM 立体声解码.彩色副载波同步.图象处理等各个方面得到了广泛的应用.数字锁相环不仅吸收了数字电路可靠性高.体积小.价格低等优点,还解决了模拟锁 ...
- MVC3 分页Helper
利用mvc3实现分页效果.效果图如下: 直接拷代码: 首页添加一个Helper的类(命名空间为System.Web.Mvc;). public static HtmlString ShowPageNa ...
- vs错误【C1083 C1854 C4727】的若干解决办法(对预编译文件头的解释)
这几天写程序,无意间把编译中间文件给删了,然后就出现了C1083编译错误. xxx.cpp ..\commen\xxx.cpp(2) : fatal error C1083: 无法打开预编译头文件:“ ...
- android加载更多的图片
这是昨天改进后的,我测试了下,可以加载图片到5万张,估计5万以上也是没问题的,我只试到5万,其实也没必要这么高,现实中1000左右就差不多了,不过我的应用到100就差不多了, package com. ...