Aprori算法[关联规则算法]

  1 <meta http-equiv="Content-Type" content="text/html; charset=GBK" />
  2 <?php
  3 /*
  4 *Apriori算法(关联规则算法的实现)
  5 */
  6
  7 /*
  8 *项目集X支持G个数小于等于1去除
  9 */
 10 //--------------------------------------------------------------------
 11 function first($train)
 12 {
 13     $new_array = $train;
 14     $array_count = array(NULL);
 15     array_splice($array_count,0,1);
 16     for($i=1;$i<count($train[0]);$i++)
 17     {
 18         $count = 0;
 19         for($j=1;$j<count($train);$j++)
 20         {
 21             if($train[$j][$i]==1)
 22             {
 23                 $count++;
 24             }
 25         }
 26
 27         if($count==1){//非频繁项目集
 28             array_push($array_count,$i);
 29         }
 30     }
 31
 32     for($i=count($array_count)-1;$i>=0;$i--)
 33     {
 34         for($j=0;$j<count($train);$j++)
 35         {
 36             array_splice($new_array[$j],$array_count[$i],1);
 37         }
 38
 39     }
 40
 41     return $new_array;
 42 }
 43 //--------------------------------------------------------------------
 44
 45 /*
 46 *总事务D中包含事务X的数量
 47 */
 48 //--------------------------------------------------------------------
 49 function search($train,$array)
 50 {
 51     $array_num = array();
 52     array_splice($array_num,0,1);
 53     for($i=0;$i<count($array);$i++)
 54     {
 55         for($j=1;$j<count($train[0]);$j++)
 56         {
 57
 58             if($train[0][$j]==$array[$i])
 59             {
 60                 array_push($array_num,$j);
 61                 break;
 62             }
 63         }
 64     }
 65     $count = 0;//用于统计满足数据项集X的事务个数
 66     for($i=1;$i<count($train);$i++)
 67     {
 68         $flags = true;
 69         for($j=0;$j<count($array_num);$j++)
 70         {
 71             if($train[$i][$array_num[$j]]==0)
 72             {
 73                 $flags = false;
 74                 break;
 75             }
 76         }
 77         if($flags)$count++;
 78
 79     }
 80     return $count;
 81 }
 82 //--------------------------------------------------------------------
 83
 84 /*
 85 *合并两数组,除去其中相同的元素
 86 */
 87 //--------------------------------------------------------------------
 88 function  merge($arrayA,$arrayB)
 89 {
 90     $array =  array(NULL);
 91     array_splice($array,0,1);
 92
 93     //将两数组中的元素合并
 94     for($i=0;$i<count($arrayA)+count($arrayB);$i++)
 95     {
 96         if($i<count($arrayA))
 97         {
 98             array_push($array,$arrayA[$i]);
 99         }
100         else {
101             array_push($array,$arrayB[$i-count($arrayA)]);
102         }
103     }
104
105     $array = array_unique($array);//删除两数组中重复的元素
106
107     //对新的数组下标重新进行排序
108     foreach($array as $value)
109     {
110         $newarray[]=$value;
111     }
112     return $newarray;
113 }
114 //--------------------------------------------------------------------
115
116 /*
117 *判断两个一维数组是否相等(不考虑键的位置,也不考虑数组中有重复的元素)
118 */
119 //--------------------------------------------------------------------
120 function judgeequal($arrayA,$arrayB)
121 {
122
123     if(count($arrayA)!=count($arrayB))
124     {
125         $flags = false;
126     }else{
127         $flags2 = true;
128         for($i=0;$i<count($arrayA);$i++)
129         {
130             if(!in_array($arrayA[$i],$arrayB,true))
131             {
132                 $flags2 = false;
133                 break;
134             }
135         }
136         if($flags2)
137         {
138             $flags = true;
139         }else {
140             $flags = false;
141         }
142     }
143     return $flags;
144 }
145 //--------------------------------------------------------------------
146
147 /*
148 *求支持度和置信度
149 */
150 //--------------------------------------------------------------------
151 function support_confidence($arrayA,$arrayB,$train,&$support,&$confidence)
152 {
153     $newarray = merge($arrayA,$arrayB);
154     $countxy = search($train,$newarray);
155     $support = $countxy / (count($train)-1);//项集X的支持度
156     $countx = search($train,$arrayA);
157     $confidence = $countxy / $countx;
158     return 0;
159
160 }
161 //--------------------------------------------------------------------
162
163 /*
164 *Apriori算法
165 */
166 //--------------------------------------------------------------------
167 function Apriori($train,$sup,$con)
168 {
169     $aprioriAll = array();//存储所有的关联
170     array_splice($aprioriAll,0,1);
171     $apriori = array();
172     array_splice($apriori,0,1);
173     $train = first($train);
174     for($i=1;$i<count($train[0])-1;$i++)
175     {
176         $arrayA[0] =$train[0][$i];
177         for($j=$i+1;$j<count($train[0]);$j++)
178         {
179             $arrayB[0] =$train[0][$j];
180             support_confidence($arrayA,$arrayB,$train,$support,$confidence);
181             if(($support>=$sup)&&($confidence>=$con))
182             {
183                 $Meg = merge($arrayA,$arrayB);
184                 array_push($apriori,$Meg);
185             }
186         }
187     }
188     array_push($aprioriAll,$apriori);
189     while(count($apriori)>1)
190     {
191         $array = array();
192         array_splice($array,0,1);
193         for($i=0;$i<count($apriori)-1;$i++)
194         {
195             for($j=$i+1;$j<count($apriori);$j++)
196             {
197                 $arrayB = merge($apriori[$i],$apriori[$j]);
198                 support_confidence($apriori[$i],$arrayB,$train,$support,$confidence);
199                 if(($support>=$sup)&&($confidence>=$con))
200                 {
201 /*                    echo "<pre>";
202                     print_r($arrayA);
203                     echo "<pre>";
204                     print_r($arrayB);
205 */
206                     array_push($array,$arrayB);
207                 }
208
209             }
210         }
211         $apriori = $array;
212         for($i=0;$i<count($apriori)-1;$i++)
213         {
214             for($j=count($apriori)-1;$j>=$i+1;$j--)
215             {
216                 if(judgeequal($apriori[$i],$apriori[$j]))
217                 {
218                     array_splice($apriori,$j,1);
219                 }
220             }
221         }
222         foreach($apriori as $value)
223         {
224             $newarray[]=$value;
225         }
226         $apriori = $newarray;
227         array_push($aprioriAll,$apriori);
228     }
229     return $aprioriAll;
230 }
231 //--------------------------------------------------------------------
232
233 /*
234 *把.txt中的内容读到数组中保存
235 *$filename:文件名称
236 */
237 //--------------------------------------------------------------------
238 function  getFileContent($filename)
239 {
240     $array = array(null);
241     $content = file_get_contents($filename);
242     $result = explode("\r\n",$content);
243     //print_r(count($result));
244     for($j=0;$j<count($result);$j++)
245     {
246         //print_r($result[$j]."<br>");
247         $con = explode(" ",$result[$j]);
248         array_push($array,$con);
249     }
250     array_splice($array,0,1);
251     return $array;
252 }
253 //--------------------------------------------------------------------
254
255
256 /*
257 *把数组中内容写到.txt中保存
258 *$result:要存储的数组内容
259 *$filename:文件名称
260 */
261 //--------------------------------------------------------------------
262 function Array_Totxt($result,$filename)
263 {
264     $fp= fopen($filename,‘wb‘);
265     for($i=0;$i<count($result);$i++)
266     {
267
268         for($j=0;$j<count($result[$i]);$j++)
269         {
270
271             $temp = NULL;
272             for($k=0;$k<count($result[$i][$j]);$k++){
273             $temp =  $result[$i][$j][$k]."\t";
274             fwrite($fp,$temp);
275             }
276             fwrite($fp,"\r\n");
277         }
278
279     }
280     fclose($fp);
281 }
282 //--------------------------------------------------------------------
283     $train = getFileContent("train.txt");
284 //    $train = getFileContent("er.txt");
285     $apriori = Apriori($train,0.5,0.6);
286     echo "<pre>";
287     print_r($apriori);
288     Array_Totxt($apriori,"result.txt")
289 //    Array_Totxt($apriori,"erresult.txt")
290 ?>

时间: 2024-10-19 17:59:33

Aprori算法[关联规则算法]的相关文章

HotSpot关联规则算法(2)-- 挖掘连续型和离散型数据

本篇代码可在 http://download.csdn.net/detail/fansy1990/8502323下载. 前篇<HotSpot关联规则算法(1)-- 挖掘离散型数据>分析了离散型数据的HotSpot关联规则,本篇分析离散型和连续型数据的HotSpot关联规则挖掘. 1. 首先看下数据格式(txt文档): @attribute outlook {sunny, overcast, rainy} @attribute temperature numeric @attribute hum

HotSpot关联规则算法(1)-- 挖掘离散型数据

提到关联规则算法,一般会想到Apriori或者FP,一般很少有想到HotSpot的,这个算法不知道是应用少还是我查资料的手段太low了,在网上只找到很少的内容,这篇http://wiki.pentaho.com/display/DATAMINING/HotSpot+Segmentation-Profiling ,大概分析了一点,其他好像就没怎么看到了.比较好用的算法类软件,如weka,其里面已经包含了这个算法,在Associate--> HotSpot里面即可看到,运行算法界面一般如下: 其中,

Fp关联规则算法计算置信度及MapReduce实现思路

说明:參考Mahout FP算法相关相关源代码. 算法project能够在FP关联规则计算置信度下载:(仅仅是单机版的实现,并没有MapReduce的代码) 使用FP关联规则算法计算置信度基于以下的思路: 1. 首先使用原始的FP树关联规则挖掘出全部的频繁项集及其支持度:这里须要注意,这里是输出全部的频繁项集,并没有把频繁项集合并,所以须要改动FP树的相关代码,在某些步骤把全部的频繁项集输出:(ps:參考Mahout的FP树单机版的实现,进行了改动,暂不确定是否已经输出了全部频繁项集) 为举例简

数据挖掘十大算法--Apriori算法

一.Apriori 算法概述 Apriori 算法是一种最有影响力的挖掘布尔关联规则的频繁项集的 算法,它是由Rakesh Agrawal 和RamakrishnanSkrikant 提出的.它使用一种称作逐层搜索的迭代方法,k- 项集用于探索(k+1)- 项集.首先,找出频繁 1- 项集的集合.该集合记作L1.L1 用于找频繁2- 项集的集合 L2,而L2 用于找L2,如此下去,直到不能找到 k- 项集.每找一个 Lk 需要一次数据库扫描.为提高频繁项集逐层产生的效率,一种称作Apriori

【啊哈!算法】算法7:Dijkstra最短路算法

上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短路”.本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”.例如求下图中的1号顶点到2.3.4.5.6号顶点的最短路径. <ignore_js_op> 与Floyd-Warshall算法一样这里仍然使用二维数组e来存储顶点之间边的关系,初始值如下. <ignore_js_op> 我们还需要用一个一维数组dis来存储1号顶点到其余各个顶点的初始路程,如下.

【啊哈!算法】算法9:开启树之旅

这是什么?是一个图?不对,确切的说这是一棵树.这哪里像树呢?不要着急我们来变换一下. 是不是很像一棵倒挂的树,也就是说它是根朝上,而叶子朝下的.不像?哈哈,看完下面这幅图你就会觉得像啦. 你可能会问:树和图有什么区别?这个称之为树的东西貌似和无向图差不多嘛.不要着急,继续往下看.树其实就是不包含回路的连通无向图.你可能还是无法理解这其中的差异,举个例子,如下.          上面这个例子中左边的是一棵树,而右边的是一个图.因为左边的没有回路,而右边的存在1->2->5->3->

【啊哈!算法】算法10:二叉树

二叉树是一种特殊的树.二叉树的特点是每个结点最多有两个儿子,左边的叫做左儿子,右边的叫做右儿子,或者说每个结点最多有两棵子树.更加严格的递归定义是:二叉树要么为空,要么由根结点.左子树和右子树组成,而左子树和右子树分别是一棵二叉树. 下面这棵树就是一棵二叉树. 二叉树的使用范围最广,一棵多叉树也可以转化为二叉树,因此我们将着重讲解二叉树. 二叉树中还有连两种特殊的二叉树叫做满二叉树和完全二叉树.如果二叉树中每个内部结点都有两个儿子,这样的二叉树叫做满二叉树.或者说满二叉树所有的叶结点都有同样的深

九章算法 基础算法 强化算法 系统设计 大数据 安卓 leetcode 高清视频

leetcode 直播视频讲座录像 九章算法视频录像,PPT 算法班,算法强化班,Java入门与基础算法班,big data项目实战班,Andriod项目实战班 九章算法下载 九章算法面试 九章算法leetcode 九章算法答案 九章算法mitbbs 九章算法班 九章算法ppt 九章算法录像 九章算法培训 九章算法微博 leetcode 视频 九章算法偷录 算法培训 算法班课程大纲: 1 从strStr谈面试技巧与Coding Style(免费试听) 2 二分搜索与旋转排序数组 Binary S

[算法]有趣算法合辑[31-40]

题目31:八进制转换为十进制 1.程序分析: 2.程序源代码: main() { char *p,s[6];int n; p=s; gets(p); n=0; while(*(p)!='\0') {n=n*8+*p-'0'; p++;} printf("%d",n); } 题目32:求0-7所能组成的奇数个数. 1.程序分析: 2.程序源代码: main() { long sum=4,s=4; int j; for(j=2;j<=8;j++)/*j is place of num