聚类算法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
聚类分析就仅根据在数据中发现的描述对象及其关系的信息,将数据对象分组(簇).其目标是,组内的对象相互之间是相似的,而不同组中的对象是不同的.组内相似性越大,组间差别越大,聚类就越好. 先介绍下聚类的不 ...
随机推荐
-
[转]ActionScript 3.0入门:Hello World、文件读写、数据存储(SharedObject)、与JS互调
本文转自:http://www.cnblogs.com/artwl/p/3396330.html 近期项目中可能要用到Flash存取数据,并与JS互调,所以就看了一下ActionScript 3.0, ...
-
linux mail命令用法
在Linux系统下mail命令的测试 1. 最简单的一个例子: mail -s test admin@aispider.com 这条命令的结果是发一封标题为test的空信给后面的邮箱,如果你有mta并 ...
-
linux make
linux make file 以下是转载 感谢原作者 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和 ...
-
[置顶] 使用Android OpenGL ES 2.0绘图之五:添加运动
传送门 ☞ 系统架构设计 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229 传送门 ☞ GoF23种设计模式 ☞ 转载请注明 ☞ http://blog.csd ...
-
Jmeter-基于Ubuntu运行
这几天折腾了很久,整合了一套接口自动化的持续集成工具,先从最基础的运行Jmeter说起.由于我是用Docker部署的持续集成环境,所以接口运行必须在服务器上 一:在Linux服务器先安装jdk 1:先 ...
-
JavaScript中两个对象数组 属性undefined
var BaiduUsers = []; var UserArray = function(name, phone, id, id2) { this.name = name; this.phone = ...
-
mac上安装ta-lib
Now I am ready to start installing TA-Lib. Generally I followed the steps listed in here. 1. Install ...
-
PLSQL使用SCN码恢复误删表数据
#查询数据库当前的SCN码select current_scn from v$database 1250494 #将当前的SCN码减小后,根据SCN码查询误删数据表的数据情况#直至找到被删的数据为止s ...
-
《深入理解Java虚拟机》笔记--第十三章、线程安全与锁优化
先保证并发的正确性,然后在此基础上来实现高效. 线程安全: 当多个线程访问一个对象时,如果不考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操 ...
-
iOS 9音频应用播放音频之播放控制暂停停止前进后退的设置
iOS 9音频应用播放音频之播放控制暂停停止前进后退的设置 ios9音频应用播放控制 在“iOS 9音频应用播放音频之ios9音频基本功能”一文可以看到AVAudioPlayer类有很多的属性以及方法 ...