Aprori算法[关联规则算法]
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
<?php
/*
*Apriori算法(关联规则算法的实现)
*/ /*
*项目集X支持G个数小于等于1去除
*/
//--------------------------------------------------------------------
function first($train)
{
$new_array = $train;
$array_count = array(NULL);
array_splice($array_count,0,1);
for($i=1;$i<count($train[0]);$i++)
{
$count = 0;
for($j=1;$j<count($train);$j++)
{
if($train[$j][$i]==1)
{
$count++;
}
} if($count==1){//非频繁项目集
array_push($array_count,$i);
}
} for($i=count($array_count)-1;$i>=0;$i--)
{
for($j=0;$j<count($train);$j++)
{
array_splice($new_array[$j],$array_count[$i],1);
} } return $new_array;
}
//-------------------------------------------------------------------- /*
*总事务D中包含事务X的数量
*/
//--------------------------------------------------------------------
function search($train,$array)
{
$array_num = array();
array_splice($array_num,0,1);
for($i=0;$i<count($array);$i++)
{
for($j=1;$j<count($train[0]);$j++)
{ if($train[0][$j]==$array[$i])
{
array_push($array_num,$j);
break;
}
}
}
$count = 0;//用于统计满足数据项集X的事务个数
for($i=1;$i<count($train);$i++)
{
$flags = true;
for($j=0;$j<count($array_num);$j++)
{
if($train[$i][$array_num[$j]]==0)
{
$flags = false;
break;
}
}
if($flags)$count++; }
return $count;
}
//-------------------------------------------------------------------- /*
*合并两数组,除去其中相同的元素
*/
//--------------------------------------------------------------------
function merge($arrayA,$arrayB)
{
$array = array(NULL);
array_splice($array,0,1); //将两数组中的元素合并
for($i=0;$i<count($arrayA)+count($arrayB);$i++)
{
if($i<count($arrayA))
{
array_push($array,$arrayA[$i]);
}
else {
array_push($array,$arrayB[$i-count($arrayA)]);
}
} $array = array_unique($array);//删除两数组中重复的元素 //对新的数组下标重新进行排序
foreach($array as $value)
{
$newarray[]=$value;
}
return $newarray;
}
//-------------------------------------------------------------------- /*
*判断两个一维数组是否相等(不考虑键的位置,也不考虑数组中有重复的元素)
*/
//--------------------------------------------------------------------
function judgeequal($arrayA,$arrayB)
{ if(count($arrayA)!=count($arrayB))
{
$flags = false;
}else{
$flags2 = true;
for($i=0;$i<count($arrayA);$i++)
{
if(!in_array($arrayA[$i],$arrayB,true))
{
$flags2 = false;
break;
}
}
if($flags2)
{
$flags = true;
}else {
$flags = false;
}
}
return $flags;
}
//-------------------------------------------------------------------- /*
*求支持度和置信度
*/
//--------------------------------------------------------------------
function support_confidence($arrayA,$arrayB,$train,&$support,&$confidence)
{
$newarray = merge($arrayA,$arrayB);
$countxy = search($train,$newarray);
$support = $countxy / (count($train)-1);//项集X的支持度
$countx = search($train,$arrayA);
$confidence = $countxy / $countx;
return 0; }
//-------------------------------------------------------------------- /*
*Apriori算法
*/
//--------------------------------------------------------------------
function Apriori($train,$sup,$con)
{
$aprioriAll = array();//存储所有的关联
array_splice($aprioriAll,0,1);
$apriori = array();
array_splice($apriori,0,1);
$train = first($train);
for($i=1;$i<count($train[0])-1;$i++)
{
$arrayA[0] =$train[0][$i];
for($j=$i+1;$j<count($train[0]);$j++)
{
$arrayB[0] =$train[0][$j];
support_confidence($arrayA,$arrayB,$train,$support,$confidence);
if(($support>=$sup)&&($confidence>=$con))
{
$Meg = merge($arrayA,$arrayB);
array_push($apriori,$Meg);
}
}
}
array_push($aprioriAll,$apriori);
while(count($apriori)>1)
{
$array = array();
array_splice($array,0,1);
for($i=0;$i<count($apriori)-1;$i++)
{
for($j=$i+1;$j<count($apriori);$j++)
{
$arrayB = merge($apriori[$i],$apriori[$j]);
support_confidence($apriori[$i],$arrayB,$train,$support,$confidence);
if(($support>=$sup)&&($confidence>=$con))
{
/* echo "<pre>";
print_r($arrayA);
echo "<pre>";
print_r($arrayB);
*/
array_push($array,$arrayB);
} }
}
$apriori = $array;
for($i=0;$i<count($apriori)-1;$i++)
{
for($j=count($apriori)-1;$j>=$i+1;$j--)
{
if(judgeequal($apriori[$i],$apriori[$j]))
{
array_splice($apriori,$j,1);
}
}
}
foreach($apriori as $value)
{
$newarray[]=$value;
}
$apriori = $newarray;
array_push($aprioriAll,$apriori);
}
return $aprioriAll;
}
//-------------------------------------------------------------------- /*
*把.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++)
{ for($j=0;$j<count($result[$i]);$j++)
{ $temp = NULL;
for($k=0;$k<count($result[$i][$j]);$k++){
$temp = $result[$i][$j][$k]."\t";
fwrite($fp,$temp);
}
fwrite($fp,"\r\n");
} }
fclose($fp);
}
//--------------------------------------------------------------------
$train = getFileContent("train.txt");
// $train = getFileContent("er.txt");
$apriori = Apriori($train,0.5,0.6);
echo "<pre>";
print_r($apriori);
Array_Totxt($apriori,"result.txt")
// Array_Totxt($apriori,"erresult.txt")
?>
Aprori算法[关联规则算法]的更多相关文章
- 关联规则算法Apriori的学习与实现
转自关联规则算法Apriori的学习与实现 首先我们来看,什么是规则?规则形如"如果-那么-(If-Then-)",前者为条件,后者为结果.关联规则挖掘用于寻找给定数据集中项之间的 ...
- HotSpot关联规则算法(2)-- 挖掘连续型和离散型数据
本篇代码可在 http://download.csdn.net/detail/fansy1990/8502323下载. 前篇<HotSpot关联规则算法(1)-- 挖掘离散型数据>分析了离 ...
- Fp关联规则算法计算置信度及MapReduce实现思路
说明:參考Mahout FP算法相关相关源代码. 算法project能够在FP关联规则计算置信度下载:(仅仅是单机版的实现,并没有MapReduce的代码) 使用FP关联规则算法计算置信度基于以下的思 ...
- Python机器学习算法 — 关联规则(Apriori、FP-growth)
关联规则 -- 简介 关联规则挖掘是一种基于规则的机器学习算法,该算法可以在大数据库中发现感兴趣的关系.它的目的是利用一些度量指标来分辨数据库中存在的强规则.也即是说关联规则挖掘是用于知识发现,而非预 ...
- GMM算法k-means算法的比较
1.EM算法 GMM算法是EM算法族的一个具体例子. EM算法解决的问题是:要对数据进行聚类,假定数据服从杂合的几个概率分布,分布的具体参数未知,涉及到的随机变量有两组,其中一组可观测另一组不可观测. ...
- 简单易学的机器学习算法——EM算法
简单易学的机器学习算法——EM算法 一.机器学习中的参数估计问题 在前面的博文中,如“简单易学的机器学习算法——Logistic回归”中,采用了极大似然函数对其模型中的参数进行估计,简单来讲即对于一系 ...
- 最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)(转)
一,问题描述 在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词.比如:hive-->five:wine-->line:line-->nine:nine- ...
- 重新想象 Windows 8 Store Apps (31) - 加密解密: 哈希算法, 对称算法
原文:重新想象 Windows 8 Store Apps (31) - 加密解密: 哈希算法, 对称算法 [源码下载] 重新想象 Windows 8 Store Apps (31) - 加密解密: 哈 ...
- Hash散列算法 Time33算法
hash在开发由频繁使用.今天time33也许最流行的哈希算法. 算法: 对字符串的每一个字符,迭代的乘以33 原型: hash(i) = hash(i-1)*33 + str[i] ; 在使用时.存 ...
随机推荐
- iOS根据2个经纬度计算距离
#pragma mark - calculate distance 根据2个经纬度计算距离 #define PI 3.14159265358979323 +(double) CalculationDi ...
- fs读取某个json文件的数据
/** * Created by Administrator on 2016/7/12. * 流数据 */ var fs = require('fs'); var stream = fs.create ...
- 我本人一直以来犯的错误,在看了《Think In Java》后才抓了出来(转)
也许你是只老鸟,也许你的程序编的很精,但是,在你的程序生活,你也许没有注意到一些“常识性”的问题,因为有些时候我们不需要去注意,我们的程序 照样能够运行得飞快,但是如果那天有一个无聊的人问你一个像这样 ...
- poj2459 Treasure Exploration (闭包+二分)
这道题是让求派出机器人的最少数量,乍一看以为是简单的求最小路径覆盖,后来发现错了,因为有的点可以走多次,而二分中每个点只能走一次,所以要先用floyd进行传递闭包,然后用二分 #include< ...
- C++中重载、重写(覆盖)和隐藏的区别实例分析
这篇文章主要介绍了C++中重载.重写(覆盖)和隐藏的区别,是C++面向对象程序设计非常重要的概念,需要的朋友可以参考下 本文实例讲述了C++中重载.重写(覆盖)和隐藏的区别,对于C++面向对象程序设计 ...
- Labview常用快捷键
对象调整和移动快捷键 Shift-click 选择多个对象,在现有选择的基础上添加对象 方向键 ...
- Oracle数据库的启动和关闭
深刻理解Oracle数据库的启动和关闭 Oracle数据库提供了几种不同的数据库启动和关闭方式,本文将详细介绍这些启动和关闭方式之间的区别以及它们各自不同的功能. 一.启动和关闭Oracle数据库 对 ...
- Internet设置->连接选项卡->局域网(LAN)设置 某些设置由系统管理员进行管理
今天突然发现ss不能使用了.经过一系列排查发现 Internet设置->连接选项卡->局域网(LAN)设置 某些设置由系统管理员进行管理,如上图. 修改注册表值HKEY_LOCAL_MAC ...
- Eclipse下如何打开ftl文件
ftl文件是freemarker模板文件,用freemarker时,常用该文件模板:但是该文件在eclipse编辑时,黑白底的,没有任何提示,下面介绍如何用JSP编辑器打开该文件. 工具/原料 e ...
- ArcGIS Engine DEM拉伸渲染
从符号库中取出渲染使用的色带对象IColorRamp(也可以自己定义色带内容) <pre name="code" class="csharp">IS ...