本文转自:http://blog.youkuaiyun.com/google19890102/article/details/41448979
一、关联分析
二、关联分析的重要概念
- 频繁项集
- 关联关系
2、关联关系
3、支持度
4、可信度
三、Apriori算法
1、Apriori算法
2、Apriori原理
四、使用Apriori算法发现频繁项集
六、Matlab实现
1、频繁项集
- %% 主函数
- clear all;
- clc;
- %% 导入数据
- % 数据集中的0表示无
- dataSet = load('data.txt');
- % %构建第一个候选集C1
- % C1 = createC1(dataSet);
- %
- % %构建第一个频繁项集L1
- % [retList, supportData] = scanD(dataSet, C1, 0.7)
- % 调用产生频繁项集
- [L, supportData] = apriori(dataSet, 0.5);
查找候选集C1
- %% 查找候选集C1
- function [ C1 ] = createC1( dataSet )
- C1 = unique(dataSet);%取得所有相异元素
- end
生成频繁项集
- %% 计算频繁项集L1
- function [ retList, supportData ] = scanD( dataSet, Ck, minSupport )
- [m,n] = size(Ck);
- if m==0
- retList = [];
- supportData = 0;
- else
- if n==1
- Ck(Ck==0)=[];%将候选集中的0去掉
- [m,n] = size(Ck);%获得候选集的大小,注意候选集的大小
- [m_1,n_1] = size(dataSet);%获得整个数据集的大小
- %% 统计候选集中的元素在dataSet中出现的次数
- dataNum = zeros(m,1);
- for i = 1:m%行数为候选集中元素的个数
- for j = 1:m_1
- if all(ismember(Ck(i,:), dataSet(j,:)))==1
- dataNum(i,1) = dataNum(i,1)+1;
- end
- end
- % if all(ismember(Ck(i,:), dataSet))==1
- % dataNum(i,1) = dataNum(i,1)+1;
- % end
- end
- else
- [m,n] = size(Ck);%获得候选集的大小,注意候选集的大小
- [m_1,n_1] = size(dataSet);%获得整个数据集的大小
- %% 统计候选集中的元素在dataSet中出现的次数
- dataNum = zeros(m,1);
- for i = 1:m%行数为候选集中元素的个数
- tmp = Ck(i,:);
- tmp(tmp==0)=[];%将候选集中的0去掉
- for j = 1:m_1
- if all(ismember(tmp, dataSet(j,:)))==1
- dataNum(i,1) = dataNum(i,1)+1;
- end
- end
- % if all(ismember(Ck(i,:), dataSet))==1
- % dataNum(i,1) = dataNum(i,1)+1;
- % end
- end
- end
- %% 计算每个元素出现的比率
- numItems = length(dataSet);
- supportData = zeros(length(dataNum), 1);
- retListSize = 1;
- for i = 1:length(dataNum)
- supportData(i, 1) = dataNum(i, 1)/numItems;
- if supportData(i ,1) >= minSupport
- retList(retListSize, :) = Ck(i, :);
- retListSize = retListSize+1;
- end
- end
- end
- end
生成后续的候选集
- function [ retList ] = aprioriGen( Lk )
- [m,n] = size(Lk);%得到Lk矩阵的大小
- r = 1;
- for i = 1:m-1
- for j = i+1:m
- retListTmp_1(r,:) = [Lk(i,:),Lk(j,:)];
- tmp = unique(retListTmp_1(r,:));
- if length(tmp)<2*n
- tmp(1,2*n) = 0;%补0
- end
- retListTmp_2(r,:) = tmp;
- r = r+1;
- end
- end
- if m~=1
- retList=unique(retListTmp_2,'rows');
- else
- retList=[];
- end
- end
总的生成频繁项集的模块
- %% 控制整个频繁项集的生成
- function [ L, supportData ] = apriori( dataSet, minSupport )
- C1 = createC1(dataSet)%生成最初的候选集
- [L1, supportData] = scanD(dataSet, C1, minSupport)%生成最初的频繁项集
- L = L1;
- while ~isempty(L)
- Ck = aprioriGen(L)
- [Lk, supportData] = scanD(dataSet, Ck, minSupport)
- L = Lk;
- end
- end
实现
假设有一个数据库D,其中有4个事务记录,分别表示为:
| TID | Items |
|---|---|
| T1 | I1,I3,I4 |
| T2 | I2,I3,I5 |
| T3 | I1,I2,I3,I5 |
| T4 | I2,I5 |
这裡预定最小支持度minSupport=2,下面用图例说明算法运行的过程:
| TID | Items |
|---|---|
| T1 | I1,I3,I4 |
| T2 | I2,I3,I5 |
| T3 | I1,I2,I3,I5 |
| T4 | I2,I5 |
扫描D,对每个候选项进行支持度计数得到表C1:
| 项集 | 支持度计数 |
|---|---|
| {I1} | 2 |
| {I2} | 3 |
| {I3} | 3 |
| {I4} | 1 |
| {I5} | 3 |
比较候选项支持度计数与最小支持度minSupport,产生1维最大项目集L1:
| 项集 | 支持度计数 |
|---|---|
| {I1} | 2 |
| {I2} | 3 |
| {I3} | 3 |
| {I5} | 3 |
由L1产生候选项集C2:
| 项集 |
|---|
| {I1,I2} |
| {I1,I3} |
| {I1,I5} |
| {I2,I3} |
| {I2,I5} |
| {I3,I5} |
扫描D,对每个候选项集进行支持度计数:
| 项集 | 支持度计数 |
|---|---|
| {I1,I2} | 1 |
| {I1,I3} | 2 |
| {I1,I5} | 1 |
| {I2,I3} | 2 |
| {I2,I5} | 3 |
| {I3,I5} | 2 |
比较候选项支持度计数与最小支持度minSupport,产生2维最大项目集L2:
| 项集 | 支持度计数 |
|---|---|
| {I1,I3} | 2 |
| {I2,I3} | 2 |
| {I2,I5} | 3 |
| {I3,I5} | 2 |
由L2产生候选项集C3:
| 项集 |
|---|
| {I2,I3,I5} |
扫描D,对每个候选项集进行支持度计数:
| 项集 | 支持度计数 |
|---|---|
| {I2,I3,I5} | 2 |
比较候选项支持度计数与最小支持度minSupport,产生3维最大项目集L3:
| 项集 | 支持度计数 |
|---|---|
| {I2,I3,I5} | 2 |
算法终止。
7613



被折叠的 条评论
为什么被折叠?



