Matlab上机三(Apriori算法)

news/2024/7/6 4:26:43 标签: matlab, 算法, 开发语言

1、题目要求

(1) 读取给定的交易数据库test3.txt,将整个交易数据库表示为一个矩阵,每个元组表示成一个行向量,向量长度为4。其中,一个项目出现在这个元组中,则相应位置设为1,否则为0。如第1个交易{1,2}表示为
向量[ 1 1 0 0]。
(2)根据给定的最小支持度阈值(本题为3),确定频繁1项集。
(3)计算其余长度的频繁项集,直到Lk为空。
(4)尝试用Apriori算法实现

text3.txt数据

matlab"> 1 2
 2 3 4
 1 2 3 4
 1 2 4
 1 2 3 4

2、解题代码和步骤

matlab">clear
clc
%fopen以读的方式打开一个文件
ffid=fopen('text3.txt','r')
i=0;
MAXn=4;
data=[];
%读取给定的交易数据库text3.txt将整个交易数据库表示为一个矩阵,将元祖表示成一个行向量
%向量的长度为项目的个数,其中一个项目初夏你在这个元组中,响应位置设为1,否则为0

%检查流文件ffid是否已经达到末尾
while feof(ffid)==0
    i=i+1;
    %读取文件流ffid中一行数据,并将其存储到变量tline{i,1}中
    tline{i,1}=fgetl(ffid);
    %显示值
    disp(tline{i,1})
    %创建一个长度为MAXn的全0向量
    newdata=zeros(1,MAXn);
    %str2num将字符串转换为数值
    line=str2num(tline{i,1});
    disp(line)
    
    newdata(line)=1;
    disp(newdata)
    %将newdata向量添加到data向量末尾
    data=[data;newdata];
end
disp('data')
disp(data)

%最小支持度为3
%用datasum统计每个项目的支持度,将datasum中支持度小于3的位置等于0
%标记datasum中为0的序列号,将data矩阵中相应的序列号的位置等于0
%频繁1项级为datasum中大于0的项

%data向量中所有元素的和
datasum=sum(data);
disp('datasum')
disp(datasum)
%小于3的元素设置为0
datasum(datasum<3)=0;
%datasum元素等于0的索引
[,col]=find(datasum==0);
%第col列的元素设置为0
data(:,col)=0;
%找到第一行大于0的元素
disp(datasum(1,:)>0)
L1=find(datasum(1,:)>0);
disp('L1');
disp(L1);

C2=[];
%从1开始到L1最后一列的前一列
for j=1:size(L1,2)-1
    %从j+1开始到L1矩阵最后一列
    for j1=j+1:size(L1,2)
        C2=[C2;L1(j),L1(j1)];
    end
end
disp('C2')
disp(C2)
count=0;
L2=[];

%从1开始到C2的最后一列
for j=1:size(C2,1)
    count=0;
    for i=1:size(data,1)%size(data,1)=5
        if data(i,C2(j,1))==1 && data(i,C2(j,2))==1
            count=count+1;
        end
    end
    if count>=3
        L2=[L2;C2(j,1),C2(j,2)];
    end
end
disp('L2');
disp(L2);

C3=[];
%size(L2,1)=5
for j=1:size(L2,1)-1
    for j1=j+1:size(L2,1)
        index1=L2(j,1);%index1=1
        index2=L2(j1,1);%index2=1
        if index1==index2
            %将矩阵L2的第j和j1行的第二列添加的C3末尾
            C3=[C3;index1,L2(j,2),L2(j1,2)];
        end
    end
end
disp('C3')
disp(C3)
mC3=[];
%遍历C3的每一行
for j=1:size(C3,1)
    %将每行第一列元素赋值
    index=C3(j,1);
    index1=C3(j,2);
    index2=C3(j,3);
    for j1=1:size(L2,1)
        index3=L2(j1,1);
        index4=L2(j1,2);
        if index1==index3&&index2==index4
            mC3=[mC3;index,index3,index4];
        end
    end
end
disp('mC3')
disp(mC3)
L3=[];
for j=1:size(mC3,1)%size(mC3,1)=2
    count=0;
    for j1=1:size(data,1)%size(data,1)=5
        if data(j1,mC3(j,1))==1&&data(j1,mC3(j,2))==1&&data(j1,mC3(j,3))==1%data(1~5,1~2)==1&&data(1~5,2,3)==1
                count=count+1;
        end
    end
    if(count>=3)
        L3=[L3;mC3(j,1),mC3(j,2),mC3(j,3)];
    end
end
disp('L3');
disp(L3);

3、代码和图解释

L1:
在这里插入图片描述
L2:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、输出的结果

matlab">
ffid =

    83

 1 2
     1     2

     1     1     0     0

 2 3 4
     2     3     4

     0     1     1     1

 1 2 3 4
     1     2     3     4

     1     1     1     1

 1 2 4
     1     2     4

     1     1     0     1

 1 2 3 4
     1     2     3     4

     1     1     1     1

data
     1     1     0     0
     0     1     1     1
     1     1     1     1
     1     1     0     1
     1     1     1     1

datasum
     4     5     3     4

     1     1     1     1

L1
     1     2     3     4

C2
     1     2
     1     3
     1     4
     2     3
     2     4
     3     4

L2
     1     2
     1     4
     2     3
     2     4
     3     4

C3
     1     2     4
     2     3     4

mC3
     1     2     4
     2     3     4

L3
     1     2     4
     2     3     4

>> 

http://www.niftyadmin.cn/n/5154122.html

相关文章

C++基础面试题

一、vector和list的区别 1.1 底层数据结构 vector 使用动态数组作为底层数据结构&#xff0c;元素在内存中是连续存储的&#xff1b; list 使用双向链表作为底层数据结构&#xff0c;元素在内存中通过节点相互连接。 1.2 插入和删除操作 vector 在尾部插入或删除元素效率高&…

llinux的更目录下的文件作用和举例

Linux是一种开源的操作系统&#xff0c;其文件系统采用了一种层次化的结构。在Linux文件系统中&#xff0c;最顶层的目录被称为根目录&#xff0c;也就是“/”&#xff08;斜杠&#xff09;。在根目录下&#xff0c;有很多文件和目录&#xff0c;它们各自有着不同的作用。本文将…

Docker-compose 运行MySQL 连接不上

Docker-compose 运行MySQL 连接不上 📔 千寻简笔记介绍 千寻简笔记已开源,Gitee与GitHub搜索chihiro-notes,包含笔记源文件.md,以及PDF版本方便阅读,且是用了精美主题,阅读体验更佳,如果文章对你有帮助请帮我点一个Star~ 更新:支持在线阅读文章,根据发布日期分类…

[python] logging输出到控制台(标准输出)

要将logging.info输出到控制台&#xff08;标准输出&#xff09;&#xff0c;可以使用以下代码&#xff1a; import logging# 创建一个logger对象 logger logging.getLogger(__name__)# 创建一个控制台处理器 console_handler logging.StreamHandler()# 设置控制台处理器的输…

【ARFoundation学习笔记】ARFoundation基础(上)

写在前面的话 本系列笔记旨在记录作者在学习Unity中的AR开发过程中需要记录的问题和知识点。难免出现纰漏&#xff0c;更多详细内容请阅读原文。 本文从原文第二章开始 文章目录 ARFoundation的体系Subsystem的使用跟踪子系统 ARSession & AR Session OriginARSessionARSe…

linux shell sh 脚本开机自启动

文章目录 1. 写脚本2. 给权限3. 设自启 1. 写脚本 写一个shell脚本 随便举个例子&#xff0c;每次开机在/home下touch个aa.txt # 创建脚本 touch my_shell.sh# 编写内容&#xff1a; #!/bin/bash touch /home/aa.txt2. 给权限 给编写的脚本执行权限 sudo chmod x my_shell…

FinalCutPro 移动项目的时候,遇到失去连接的文件怎么处理

FinalCutPro 移动项目的时候&#xff0c;遇到失去连接的文件怎么处理 有时候&#xff0c;FinalCutPro 项目在移动之后&#xff0c;一些链接到外面的文件会失去连接&#xff0c;文件虽然还在原有位置&#xff0c;但显示成下面这样&#xff1a; 解决方法 1. 点击菜单【文件】…

力扣382.链表随机节点(java利用数组随机返回节点值)

Problem: 382. 链表随机节点 文章目录 思路解题方法复杂度Code 思路 注意链表与数组的特性&#xff0c;对于随机访问读取的操作利用数组可以较方便实现&#xff0c;所以我们可以将链表中的节点值先存入到数组中最后再取出随机生成节点位置的值。 解题方法 1.生成List集合与Rand…