数据挖掘(4)关联规则挖掘

一、关联规则挖掘的基本概念

1. 关联规则挖掘(Association rule mining)

  1. 对象:交易型数据库
  2. 通过量化的数字来描述物品X的出现对物品Y的出现有多大的影响。
  3. 购物篮分析
    • 在购买计算机的同时购买财务管理软件,可用其关联规则表示:
    • financial_management_software[support = 2%,confidence = 60%]
    • 关联规则的支持度(support):全部事务中,有2%的交易同时购买了计算机和财务管理软件。
    • 关联规则的置信度(confidence):购买计算机的顾客中,有60%也同时购买了财务管理软件。

2. 关联规则的基本概念

  1. 事务数据库

    1. 设I={i1,i2,…,im}是一个项目集合,事务数据库D={t1,t2,…,tn}是一些列唯一唯一表示的TID的事务组成。每个事务ti都对应I上的一个子集。
      • I:全部物品。
      • D:购物清单
      • ti:一次购买物品的集合,是I的子集
    2. 存放的是单个维度,在上面挖掘只能挖掘出单个维度的东西
  2. 支持度(support)

    1. 定义:真的任务相关的元组(事务)所占的百分比。

    2. 公式:数据挖掘(4)关联规则挖掘_第1张图片

  3. 置信度(certainty)

    1. 定义:规则的前键与后键的影响程度。
    2. 数据挖掘(4)关联规则挖掘_第2张图片
  4. 强关联规则

    1. 置信度(certainty)表示规则的可信度:置信度小,规则无意义。
    2. 支持度(support)表示模式在事务数据库中出现频率:支持度小、规则使用面窄
    3. 同时满足最小置信度、最小支持度的关联规则为强关联规则

3. 关联规则的分类

  1. 处理的变量类别
    • 布尔型:离散的、可枚举的、种类化的
      • 性别=“男” -> 职业=‘网络工程师’
    • 数值型:有定量的数据项
      • 性别=‘男’ -> 收入=‘3500’
  2. 数据的抽象层次
    • 单层关联规则:所有的变量都不考虑层次
      • 性别=“男” -> 职业=‘网络工程师’
    • 多层关联规则:考虑变量的不同层次性
      • 同层关联规则:相机 -> 手机(相机、手机是三星相机、三星手机的较高层抽象)
      • 层间关联规则:相机 -> 三星手机
  3. 涉及的数据维数
    • 单维关联规则:只涉及一个属性
      • 啤酒 -> 尿布,在商品维度
    • 多维关联规则:处理多个维度
      • 性别"女" -> 职业"秘书"

二、由事物数据库挖掘单维(单层)布尔关联规则

  1. 挖掘的步骤:

    1. 找出频繁项集:满足最小支持度
    2. 由频繁项集产生强关联规则:满足最小支持度、最小置信度
  2. 基本概念

    1. 项集:k-项集:项的集合,eg:{computer,software},2-项集。
    2. 项集的频率:项集{A,B,C,D…}出现的所有数量/事务总数
    3. 频繁项集:项集出现的频率>=支持度阈值,记作L_k数据挖掘(4)关联规则挖掘_第3张图片
  3. Apriori算法
    1. 原理:数据挖掘(4)关联规则挖掘_第4张图片
    2. 符号
      1. C_K:K项集,候选k项集
      2. L_K:频繁k项集
    3. 步骤(迭代法):
      1. 在第一次迭代中,产生候选1-项集,并计算支持度s,选择频繁1-项集
      2. 第二次迭代中,删除非频繁1-项集,在频繁1-项集的基础上产生候选2-项集,再生成频繁2-项集,不断迭代
    4. 例子
  4. 由频繁项集产生关联规则:

    1. 不使用支持度是因为:得到的频繁项集是满足支持度大与阈值。
    2. 根据最小置信度确定:求P(AB)与P(B),然后划分就行。
    3. 划分数量:2^n-2
    4. 数据挖掘(4)关联规则挖掘_第5张图片
    5. 数据挖掘(4)关联规则挖掘_第6张图片

 

function [frequentItemsets] = apriori(data, minSupport)
    % 初始化频繁项集
    frequentItemsets = {};
    
    % 获取数据集中的所有项
    items = unique(data);
    
    % 计算第一层候选项集的支持度
    candidateItemsets = cell(length(items), 1);
    for i = 1:length(items)
        candidateItemsets{i} = items(i); % 将每个项作为一个单元素候选项集
    end
    supportCounts = countSupport(data, candidateItemsets); % 调用countSupport函数计算每个候选项集在数据集中出现的次数
    
    % 筛选出支持度大于等于minSupport的频繁项集
    frequentItemsets{1} = candidateItemsets(supportCounts >= minSupport); % 支持度等于出现次数除以总事务数,这里用逻辑索引筛选出满足条件的候选项集
    
    % 生成候选项集和频繁项集的迭代过程
    k = 2; % k表示候选项集和频繁项集的元素个数,从2开始递增
    while ~isempty(frequentItemsets{k-1}) % 当上一层的频繁项集不为空时,继续生成下一层
        % 生成候选项集
        candidateItemsets = generateCandidates(frequentItemsets{k-1}, k); % 调用generateCandidates函数根据上一层的频繁项集生成下一层的候选项集
        
        % 计算候选项集的支持度
        supportCounts = countSupport(data, candidateItemsets); % 调用countSupport函数计算每个候选项集在数据集中出现的次数
        
        % 筛选出支持度大于等于minSupport的频繁项集
        frequentItemsets{k} = candidateItemsets(supportCounts >= minSupport); % 支持度等于出现次数除以总事务数,这里用逻辑索引筛选出满足条件的候选项集
        
        k = k + 1; % 增加k值,进入下一层循环
    end
end

function [candidates] = generateCandidates(itemsets, k)
    candidates = {}; % 初始化候选项集
    numItemsets = length(itemsets); % 获取上一层频繁项集的个数
    
    for i = 1:numItemsets % 遍历每个频繁项集
        for j = i+1:numItemsets % 遍历后面的每个频繁项集,避免重复组合
            itemset1 = itemsets{i}; % 取出第一个频繁项集
            itemset2 = itemsets{j}; % 取出第二个频繁项集
            
            % 检查前k-2项是否相同,如果相同,则可以合并为一个k元素候选项集,否则跳过
            if isequal(itemset1(1:k-2), itemset2(1:k-2))
                % 合并两个频繁项集,取第一个频繁项集和第二个频繁项集的最后一个元素组成新的候选项集
                candidates{end+1} = [itemset1, itemset2(end)];
            end
        end
    end
end

function [supportCounts] = countSupport(data, itemsets)
    numItemsets = length(itemsets); % 获取候选项集的个数
    numTransactions = size(data, 1); % 获取数据集的事务数
    supportCounts = zeros(numItemsets, 1); % 初始化每个候选项集的出现次数
    
    for i = 1:numItemsets % 遍历每个候选项集
        itemset = itemsets{i}; % 取出一个候选项集
        for j = 1:numTransactions % 遍历每个事务
            transaction = data(j, :); % 取出一个事务
            
            % 检查候选项集是否包含在事务中,如果是,则增加该候选项集的出现次数,否则跳过
            if all(ismember(itemset, transaction))
                supportCounts(i) = supportCounts(i) + 1;
            end
        end
    end
end

假设我们有一个超市的销售数据,其中每个事务代表一个顾客购买的商品集合。我们希望使用Apriori算法来找出频繁购买的商品组合。

假设我们有以下销售数据:

data = [1 2 3 4; 1 2 4; 1 2; 2 3 4; 2 3; 3 4; 2 4];

其中每一行代表一个顾客的购买记录,数字代表不同的商品。我们希望找出至少有两个顾客购买的频繁商品组合。

我们可以使用以下代码来运行Apriori算法:

minSupport = 2; frequentItemsets = apriori(data, minSupport);

运行后,frequentItemsets将包含所有频繁项集。在这个例子中,frequentItemsets的结果如下:

frequentItemsets = [1x3 double] [1x3 double] [1x3 double] [1x2 double] [1x2 double] [1x2 double] [1x2 double]

每个频繁项集都是一个行向量,表示一组频繁购买的商品。例如,第一个频繁项集[1x3 double]表示顾客经常购买商品1、2和3。

 三、由事务数据库挖掘多层关联规则

多层关联规则:数据挖掘(4)关联规则挖掘_第7张图片

  1. 两种支持度策略
    1. 一致支持度:在每一层挖掘时,使用相同的最小支持度阈值
      • 优势:简单
      • 缺点:设置太高会对丢失出现在较低抽象层中有意义的关联规则。太低,会在高层产生无异议的规则。数据挖掘(4)关联规则挖掘_第8张图片
    2. 递减支持度:在底层使用递减的最小支持度阈值
      • 逐层独立:

        • 如果一个项集是频繁的,则其所有子集也是皮烦的
        • 考虑每一个节点时,不管它父亲节点是否是频繁的。
      • 层交叉单项过滤:

        • 当一个节点是频繁的,其儿子结点也将被考查;否则,将被剪枝。
        • 数据挖掘(4)关联规则挖掘_第9张图片
      • 层交叉k-项集过滤:

        • 第i层的k-项集被考查,当且仅当其父亲节点k-项集是频繁的
        • 数据挖掘(4)关联规则挖掘_第10张图片

四、 由关系数据库和数据仓库挖掘多维关联规则

  1. 多维关联规则的出现:
    • 当对关系数据库或、数据仓库进行分析时,数据是多维出现的。
    • 如:在记录购买的商品外,关系数据库还可能记录着购买数量、价格、销售地、顾客信息等。
  2. 解决方案:
    • 将数据库(数据仓库)中每个属性(维)看做一个谓词
  3. 属性的类型
    1. 符号属性:取有限个无序的值。
      • occupation、brand、color
    2. 数值属性:有大小的数值。
      • age、income、price
      • 在挖掘前先进行离散化、在进行"支持度-置信度"原则,完成挖掘。
  4. 举例数据挖掘(4)关联规则挖掘_第11张图片

你可能感兴趣的:(数据挖掘,人工智能)