matlab apriori算法实现记录

该代码示例展示了如何在MATLAB环境中,通过读取txt文件中的事务数据,规范化为01矩阵,并利用编码规则进行数据转换,然后计算频繁项集。代码首先处理数据,创建编码规则,接着转换数据并计算不同支持度下的频繁项集。最终,程序输出满足最小支持度的频繁项集。
摘要由CSDN通过智能技术生成

以数据挖掘第三版习题6.6为例 实现算法功能挖掘频繁项集

注:在满足txt的格式的情况下,其他类型数据也可使用

思路:首先使用txt文件存储事务数据,为了让数据维度一致,随后将数据规范化为0 1矩阵,并创建一个编码规则数组,用以转换输出。随后对产生的0 1矩阵进行数据挖掘,循环找出频繁项集,并在对比编码规则数组后输出对应数据。

代码如下:

%% 数据初始化
clear,clc;
% 事务以文件形式存储为data.txt
code = {};            % 数据规范化,1*n形式,包含所有唯一1项集,也是编码规则基础
fid= fopen('data.txt');
tline = fgetl(fid);
lines = 0 ;
while ischar(tline)
    lines = lines+1;                              % 记录行数
    tline = deblank(tline);
    tline = regexp(tline,',','split');
    code = [code tline];                          % 合并 
    code = unique(code);                          % 去除重复记录
    tline = fgetl(fid);
end
fclose(fid);

%% 读取文件,根据编码规则对原始数据进行转换,创建以data为基础的转换矩阵
itemsnum = size(code,2);                          % code 长度
data = zeros(lines,itemsnum);                     % data 数据规范化的矩阵 line*code(itemsnum)
fid= fopen('data.txt');
tline = fgetl(fid);
lines = 0;
while ischar(tline)
    lines = lines+1;                              % 记录行数
    tline = deblank(tline);
    tline = regexp(tline,',','split');
    [~,icode,~] = intersect(code,tline);          % 寻找下标
    data(lines,icode') = 1;
    tline = fgetl(fid);
end
fclose(fid);

%% 频繁1项集计算
minSup = 0.6*lines;                              % 最小支持度
minConf = 0.8*lines;                             % 最小置信度
%求出所有单个元素出现的次数
C1 = {};
for i = 1:size(data,2)
    C1{i} = code{i};
    count(i) = sum(data(:,i));
end
%根据最小支持度剪枝,只保留频繁项集
L1 = {};                                         % 储存频繁项集
sup = {};                                        % 储存对应支持度 sup 1项
for i = 1:length(C1)
    if count(i) >= minSup
        L1{end+1} = {C1{i}};
        sup{end+1} = {count(i)};
    end
end
% 输出频繁项集L1
disp(['频繁1项集与对应支持度:']);
for i = 1:length(L1)
    disp([L1{i} sup{i}]);
end

%% 循环求解 k-项频繁项集,直到无法继续延伸
k = 1;
% 循环求解频繁K项集
while length(L1) > 0
    % 求出所有可能的 k+1 项候选集
    C = {};                                     % 储存k项集  C 
    Sup = {};                                   % 储存对应支持度 Sup -k
    for i = 1:length(L1)
        for j = i+1:length(L1)
            if k == 1 || isequal(L1{i}(1:end-1),L1{j}(1:end-1))
                C{end+1} = sort([L1{i},L1{j}{end}]);
            else
                break;
            end
        end
    end
    % 剪枝,只保留频繁项集
    L = {};                                     % 用于保存当前 k-项频繁项集    L
    for i = 1:length(C);
        count = 0;
        for j = 1:size(data,1)
            if all(ismember(C{i},code(find(data(j,:)))))    % 计算项集出现次数
                count = count + 1;
            end
        end
        if count >= minSup
            L{end+1} = C{i};                      
            Sup{end+1} = {count};
        end
    end
    % 输出当前得到的 k-项频繁项集
    if length(L) > 0
        fprintf('频繁%d项集与对应支持度:\n',k+1);
        for i = 1:length(L)
            disp([L{i} Sup{i}]);
        end
    end
    % 更新本次循环使用的频繁项集,用于下一轮迭代
    L1 = L;
    k = k+1;
end

data.txt:

运行结果:

 

 

其中有重复赋值的代码,为保证代码可读性,故不作删除。

本代码运行软件为matlab R2022b

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值