使用Matlab对频繁2项集和频繁3项集的求取

  • 一、问题描述
  • 二、实验目的
  • 三、实验内容
    • 程序实现(详细代码)
    • 运行结果截图
    • 分析
  • 四、总结

本文作者原创,如需转载,请注明原作者和地址,谢谢合作!

一、问题描述

(1)读取给定的交易数据库test3.txt,将整个交易数据库表示为一个矩阵,将每个元组表示成一个行向量,
向量长度为项目的个数。其中,一个项目出现在这个元组中,则相应位置设为1,否则为0。
(2)根据给定的最小支持度阈值,确定频繁1项集。
(3)尝试把交易数据矩阵进行缩减,去掉不频繁的项集所在的列。
(4)设计Hash函数,把每个元组散列到Hash桶中。采用HASH桶进行频繁2项集的计算。
(5)计算其余长度的频繁项集,直到Lk为空。
test3.txt的内容如下:项集I={1,2,…,10},支持度阈值为4。
TID 交易记录
1 6 3 7 8 5 1 2
2 6 1 7 4 9
3 2 10 8 9 1 5
4 2 10 4 5
5 5 2 1 7 6 8 9 10
6 5 4 10 1 3 2 7
7 8 9 2 10 3 7

二、实验目的

根据购买数据库中的记录,对数据库中的元素进行连接和剪枝,并采用HASH桶来计算频繁2项集和频繁3项集。

三、实验内容

程序实现(详细代码)

ffid = fopen('test3.txt','r');%以只读的形式打开tline = fgetl(ffid);  %title  读取文件的第一行%tline1=fget1(ffid)  读取文件的第二行i = 0;MAXn = 20;data = [];  %data为一个矩阵%(1)读取给定的交易数据库test3.txt,将整个交易数据库表示为一个矩阵,将每个元组表示成一个行向量, %向量长度为项目的个数。其中,一个项目出现在这个元组中,则相应位置设为1,否则为0。(完成)
while feof(ffid) == 0  %循环读取矩阵中的每一行数据i = i+1;tline1{i,1} = fgetl(ffid);    %可以考虑一行一行来读带有字符串的文件。使用fgetl命令。tline1{i,1}:结果是一个字符串   tline1{i,1}单元数组(可以放任意类型的数值) i表示第i行(看表tline1)newdata = zeros(1,MAXn);%行为1长度为20的零矩阵line = str2num(tline1{i,1});% 字符串矩阵被转换成一个数值矩阵line(1) = [];%把第一列数据(TID)去掉newdata(line) = 1;%统计每个人的买了哪个商品 如果卖了商品6  则为newdata(6)=1data = [data;newdata];%所有人的购买商品的记录  判断谁买了哪个商品(1号商品下的1 判断总的1的个数是否小于最小支持度)
end
%(2)根据给定的最小支持度阈值,确定频繁1项集。
%生成一个矩阵以及使用sum函数对矩阵进行操作。在MATLAB默认的情况下,sum函数对矩阵的每一列的元素进行求和,结果是一个横向量。
%调用格式:b=sum(a); a表示矩阵,b表示矩阵每列求和得到的行向量。
datasum=sum(data);%默认是按列求和  每一列一的个数
%(3)尝试把交易数据矩阵进行缩减,去掉不频繁的项集所在的列。(完成)
datasum(datasum<4)=0;%如果购买的数量小于最小支持度 则把他的值改为0
[,col]=find(datasum==0);%把不满足最小支持度的列的标号记录下来 根据他把矩阵中的数值变为0
%(4)设计Hash函数,把每个元组散列到Hash桶中。采用HASH桶进行频繁2项集的计算。
data(:,col)=0;
disp('频繁一项级为:');
disp(find(datasum(1,:)>0));
hash = zeros(1,4);%将矩阵中所有的零进行减一,所有的元素变成了-1
for i=1:size(data,1)%size()如果是1返回的是行的个数 如果是0返回的是列的个数(此处是行的个数7)index = find(data(i,:)==1);%index表示的是一行中1所在位置的列的下标for j = 1:length(index)-1for k=j+1:length(index)add = mod(index(j)*10+index(k),7);%求二项级属于那个桶  桶的种类HASHindex = find(hash(:,1)==add);if isempty(HASHindex)%如果哈希桶是空的 新的桶没有出现过 创建一个新的桶hash = [hash; add, index(j), index(k), 1];elseJKindex = intersect(find(hash(HASHindex,2)==index(j)),find(hash(HASHindex,3)==index(k)));%这类桶出现过if length(JKindex)>=2disp('error');endif length(JKindex)==1%这个二项级出现过了hash(HASHindex(JKindex),4)= hash(HASHindex(JKindex),4)+1;%统计出现次数加一(第四列4:代表出现的次数)elsehash = [hash; add, index(j),index(k), 1];endendendend
end
newhash=find(hash(:,4)>=4);%满足频繁二项级的行号
hash(find(hash(:,4)<4),:)=[];%清除不满足的行
%disp(hash);
disp('频繁二项级是:');
twohash=hash(:,2:3);
disp(twohash);
%newhash(find(hash(:,4)>=4))=0;%如果购买的数量小于最小支持度 则把他的值改为0
%sanhash:放连接后的三项级
threehash = [];%将矩阵中所有的零进行减一,所有的元素变成了-1
%进行连接 如果频繁二项级的开头一样就可以进行连接
for j=1:size(twohash,1)-1%size(twohash,1)表示这个矩阵有多少行for j1=j+1:size(twohash,1)index1=twohash(j,1);index2=twohash(j1,1);if index1==index2%判断两个频繁二项级的开头是否一致%如果一致放到频繁三项级中%threehash放的是连接的所有结果threehash = [threehash; index1, twohash(j,2),twohash(j1,2)];endend
end
%进行剪枝
%mthreehash放的是threehash中后两项属于频繁二项级的三项级
mthreehash =[];
for j=1:size(threehash,1)index=threehash(j,1);%取出threehash的后两项来index1=threehash(j,2);index2=threehash(j,3);for j1=1:size(twohash,1)%取出频繁二项级来index3=twohash(j1,1);index4=twohash(j1,2);%判断是否在二项级内if index1==index3&&index2==index4%如果在则保存这个三项级mthreehash = [mthreehash; index,index3,index4];endend
end
%最后扫描一边数据库  统计三项级出现的次数 count进行计数
count=0;
finalthreehash=[];
for j=1:size(mthreehash,1)count=0;for i=1:size(data,1)if data(mthreehash(j,1))==1&&data(mthreehash(j,2))==1&&data(mthreehash(j,3))==1count=count+1;endend%如果次数大于等于最小支持度则为频繁三项级if count>=4%finalthreehash存放频繁三项级finalthreehash = [finalthreehash; mthreehash(j,1),mthreehash(j,2),mthreehash(j,3)];end
end
disp('频繁三项级是:');
disp(finalthreehash);

运行结果截图

分析

首先要对数据库中的数据进行筛选,去掉支持度小于4的数据,然后进行连接,得到2项集,继续进行支持度的判断,去掉不满足条件的,得到频繁2项集,后进行连接、剪枝、对比数据库,找到频繁3项集,完成实验。

四、总结

知识技能方面的收获:如果一个项集是频繁的,则它的所有子集也一定是频繁的;相反,如果一个项集是非频繁的,则它所有的超集都是非频繁的,这种基于支持度度量修剪指数搜索空间的策略称为基于支持度的剪枝。Apriori算法是第一个关联规则挖掘算法,它开创性地使用基于支持度的剪枝技术,系统地控制候选项集指数增长。
对未来学习的改进:对于以后的学习,要先理解透彻相关的知识,然后才能更有效的进行实验,同时在实验的过程中找出自己不会的知识,利用网络等平台搞懂弄清。

使用Matlab对频繁2项集和频繁3项集的求取相关推荐

  1. 【MATLAB编程】求斐波那契数列的第n项与前n项和

    [问题描述]求斐波那契数列的第n项与前n项和 [问题分析]斐波那契数列即从第三项开始每一项都等于它的前两项之和,求斐波那契数列第n项与前n项和常用的方法是递归. [主程序代码] %% clear al ...

  2. 怎么用matlab分析孔隙度,基于MATLAB软件的声波测井孔隙度求取

    ·99·2016年 第 24 期 基于MATLAB软件的声波测井孔隙度求取 向旻 (新疆工程学院,新疆 乌鲁木齐 830091) 摘要 :目前,声波测井是一种重要的孔隙度测井方法,被各大油田广泛的使用 ...

  3. Tableau必知必会之如何用颜色 突显 前N项和后N项

    在做业绩汇报时,有一个非常重要的应用场景:让你的上级直观的看到数据分析结论.例如,在某个销售周期内,不同地区的哪些商品销售是 Top N 或 Bottom N . 什么方法可以最一目了然?答案是Hig ...

  4. MATLAB点云处理:读取、展示、最近邻、ICP算法求取转移矩阵、旋转

    MATLAB中关于点云的几个函数的简单应用.作者使用的是MATLAB R2015b,这几个函数应该是在Computer Vison包里. 全文都是作者自己结合MATLAB文档的理解,欢迎指教. 1. ...

  5. linux efi不要boot目录,LINUX下EFIBOOTMGR的使用,删除UEFI主板多余启动项和添加启动项-Go语言中文社区...

    用uefi装了几次次archlinux,搞的uefi启动选项下多出来好多启动项..这东西重格硬盘也是不好用的.发现以下方法可以解决. efibootmgr   //显示efi的启动项 删除一个引导项 ...

  6. matlab寻找闭合,MatLab求取多个闭合区域的轮廓、面积和bbox

    问题描述 要对如下所示的二值标签图做如下处理: 获取每一个闭合小区域的轮廓曲线坐标 获取每一个闭合小区域的面积 获取每一个闭合小区域的 bounding box 处理方法 问题一: 获取每一个闭合小区 ...

  7. 交乘项专题:主效应项可以忽略吗?

    原文链接:https://www.lianxh.cn/news/2ce3c4fbb6d0f.html Source: WHAT HAPPENS IF YOU OMIT THE MAIN EFFECT ...

  8. 选择视频直播SDK的4项技术指标,5项基本能力

    选择视频直播SDK的4项技术指标,5项基本能力 对于直播行业来说,虽然平台的内容五花八门,但内核却始终取决于视频直播SDK的音视频能力.纵观当前直播行业,云智真音视频直播SDK占有重要地位,不仅涵盖了 ...

  9. 动态渲染element组件el-table表头项+自定义el-table列表项

    动态渲染el-table表头项+自定义el-table列表项 现在不少项目的表格需要结合穿梭框动态显示表头有哪些项,但按照el-table原本的设置,有多少项就直接在html写多少个el-table- ...

最新文章

  1. 面试季,Java中的static关键字解析
  2. LeetCode 82 删除排序链表中的重复元素 II python
  3. 解决cc1plus.exe: out of memory allocating bytes
  4. MVC中使用代码创建数据库(code first +mysql+EF)
  5. 图论 —— AOE 网与关键路径
  6. 【mysql基础知识】数据库中新建触发器,监控数据变化
  7. db2如何锁定一张表_DB2数据库为单个会话锁定的技巧
  8. python输入时间_一文搞懂python日期时间处理
  9. 设置IDEA修改html、jsp后立即生效,不用重启项目
  10. linux vim与less区别,linux中cat、more、less命令区别详解##less 最合适最好用,和vim一样好用...
  11. 文本文件以EF BB开头,使用UTF8读取
  12. Atitit 读取数据库的api orm SQL Builder sql对比 目录 1.1. 提高生产效率的 ORM 和 SQL Builder 1 1.2. SQL Builder 在 SQL
  13. WeChat8Xposed通用hook框架适配新版微信-单元测试适配新微信
  14. 苹果系统 python闪退怎么解决_MacOS pyinstaller 打包python应用闪退问题解决
  15. 我是斗图王之python爬取表情包
  16. linux gmac10下载,ethmac10g verilog代码 10G eth mac verilog代码参考下载 - 下载 - 搜珍网...
  17. 应急照明市电检测_应急照明接线方式,这几点你必须知道!
  18. 处理iphone 微信中.play()方法不能播放的问题
  19. 为什么只有状态转移算法才是真正意义上的智能优化算法,其它的都是“假冒伪劣”?
  20. JAVA——附加作业4——体重指数计算器

热门文章

  1. spring-上手spring
  2. vue+echart实现双柱状图
  3. 软件开发过程培训总结
  4. 题目中的英语短语积累
  5. 有关xml中的xmlns
  6. 浅谈JAVA的往日辉煌与未来趋势
  7. Stack Overflow:开发者在周末更喜欢用哪个编程语言
  8. aris终端桌面_「最美应用」 Aris :这款神奇的桌面,助你化身神盾局特工
  9. 考上好大学,然后进入IT行业是穷人孩子晋级中产的唯一出路?
  10. AD20版如何生成PCB