当前位置:首页 » 操作系统 » apriori算法

apriori算法

发布时间: 2022-01-14 02:32:38

‘壹’ 如何实现apriori算法

java">importjava.util.HashMap;
importjava.util.HashSet;
importjava.util.Iterator;
importjava.util.Map;
importjava.util.Set;
importjava.util.TreeMap;
/**
*<B>关联规则挖掘:Apriori算法</B>
*
*<P>按照Apriori算法的基本思想来实现
*
*@authorking
*@since2013/06/27
*
*/
publicclassApriori{
privateMap<Integer,Set<String>>txDatabase;//事务数据库
privateFloatminSup;//最小支持度
privateFloatminConf;//最小置信度
privateIntegertxDatabaseCount;//事务数据库中的事务数

privateMap<Integer,Set<Set<String>>>freqItemSet;//频繁项集集合
privateMap<Set<String>,Set<Set<String>>>assiciationRules;//频繁关联规则集合

publicApriori(
Map<Integer,Set<String>>txDatabase,
FloatminSup,
FloatminConf){
this.txDatabase=txDatabase;
this.minSup=minSup;
this.minConf=minConf;
this.txDatabaseCount=this.txDatabase.size();
freqItemSet=newTreeMap<Integer,Set<Set<String>>>();
assiciationRules=newHashMap<Set<String>,Set<Set<String>>>();
}

/**
*扫描事务数据库,计算频繁1-项集
*@return
*/
publicMap<Set<String>,Float>getFreq1ItemSet(){
Map<Set<String>,Float>freq1ItemSetMap=newHashMap<Set<String>,Float>();
Map<Set<String>,Integer>candFreq1ItemSet=this.getCandFreq1ItemSet();
Iterator<Map.Entry<Set<String>,Integer>>it=candFreq1ItemSet.entrySet().iterator();
while(it.hasNext()){
Map.Entry<Set<String>,Integer>entry=it.next();
//计算支持度
Floatsupported=newFloat(entry.getValue().toString())/newFloat(txDatabaseCount);
if(supported>=minSup){
freq1ItemSetMap.put(entry.getKey(),supported);
}
}
returnfreq1ItemSetMap;
}

/**
*计算候选频繁1-项集
*@return
*/
publicMap<Set<String>,Integer>getCandFreq1ItemSet(){
Map<Set<String>,Integer>candFreq1ItemSetMap=newHashMap<Set<String>,Integer>();
Iterator<Map.Entry<Integer,Set<String>>>it=txDatabase.entrySet().iterator();
//统计支持数,生成候选频繁1-项集
while(it.hasNext()){
Map.Entry<Integer,Set<String>>entry=it.next();
Set<String>itemSet=entry.getValue();
for(Stringitem:itemSet){
Set<String>key=newHashSet<String>();
key.add(item.trim());
if(!candFreq1ItemSetMap.containsKey(key)){
Integervalue=1;
candFreq1ItemSetMap.put(key,value);
}
else{
Integervalue=1+candFreq1ItemSetMap.get(key);
candFreq1ItemSetMap.put(key,value);
}
}
}
returncandFreq1ItemSetMap;
}

/**
*根据频繁(k-1)-项集计算候选频繁k-项集
*
*@paramm其中m=k-1
*@paramfreqMItemSet频繁(k-1)-项集
*@return
*/
publicSet<Set<String>>aprioriGen(intm,Set<Set<String>>freqMItemSet){
Set<Set<String>>candFreqKItemSet=newHashSet<Set<String>>();
Iterator<Set<String>>it=freqMItemSet.iterator();
Set<String>originalItemSet=null;
while(it.hasNext()){
originalItemSet=it.next();
Iterator<Set<String>>itr=this.getIterator(originalItemSet,freqMItemSet);
while(itr.hasNext()){
Set<String>identicalSet=newHashSet<String>();//两个项集相同元素的集合(集合的交运算)
identicalSet.addAll(originalItemSet);
Set<String>set=itr.next();
identicalSet.retainAll(set);//identicalSet中剩下的元素是identicalSet与set集合中公有的元素
if(identicalSet.size()==m-1){//(k-1)-项集中k-2个相同
Set<String>differentSet=newHashSet<String>();//两个项集不同元素的集合(集合的差运算)
differentSet.addAll(originalItemSet);
differentSet.removeAll(set);//因为有k-2个相同,则differentSet中一定剩下一个元素,即differentSet大小为1
differentSet.addAll(set);//构造候选k-项集的一个元素(set大小为k-1,differentSet大小为k)
if(!this.has_infrequent_subset(differentSet,freqMItemSet))
candFreqKItemSet.add(differentSet);//加入候选k-项集集合
}
}
}
returncandFreqKItemSet;
}

/**
*使用先验知识,剪枝。若候选k项集中存在k-1项子集不是频繁k-1项集,则删除该候选k项集
*@paramcandKItemSet
*@paramfreqMItemSet
*@return
*/
privatebooleanhas_infrequent_subset(Set<String>candKItemSet,Set<Set<String>>freqMItemSet){
Set<String>tempSet=newHashSet<String>();
tempSet.addAll(candKItemSet);
Iterator<String>itItem=candKItemSet.iterator();
while(itItem.hasNext()){
Stringitem=itItem.next();
tempSet.remove(item);//该候选去掉一项后变为k-1项集
if(!freqMItemSet.contains(tempSet))//判断k-1项集是否是频繁项集
returntrue;
tempSet.add(item);//恢复
}
returnfalse;
}

/**
*根据一个频繁k-项集的元素(集合),获取到频繁k-项集的从该元素开始的迭代器实例
*@paramitemSet
*@paramfreqKItemSet频繁k-项集
*@return
*/
privateIterator<Set<String>>getIterator(Set<String>itemSet,Set<Set<String>>freqKItemSet){
Iterator<Set<String>>it=freqKItemSet.iterator();
while(it.hasNext()){
if(itemSet.equals(it.next())){
break;
}
}
returnit;
}

/**
*根据频繁(k-1)-项集,调用aprioriGen方法,计算频繁k-项集
*
*@paramk
*@paramfreqMItemSet频繁(k-1)-项集
*@return
*/
publicMap<Set<String>,Float>getFreqKItemSet(intk,Set<Set<String>>freqMItemSet){
Map<Set<String>,Integer>candFreqKItemSetMap=newHashMap<Set<String>,Integer>();
//调用aprioriGen方法,得到候选频繁k-项集
Set<Set<String>>candFreqKItemSet=this.aprioriGen(k-1,freqMItemSet);

//扫描事务数据库
Iterator<Map.Entry<Integer,Set<String>>>it=txDatabase.entrySet().iterator();
//统计支持数
while(it.hasNext()){
Map.Entry<Integer,Set<String>>entry=it.next();
Iterator<Set<String>>kit=candFreqKItemSet.iterator();
while(kit.hasNext()){
Set<String>kSet=kit.next();
Set<String>set=newHashSet<String>();
set.addAll(kSet);
set.removeAll(entry.getValue());//候选频繁k-项集与事务数据库中元素做差运算
if(set.isEmpty()){//如果拷贝set为空,支持数加1
if(candFreqKItemSetMap.get(kSet)==null){
Integervalue=1;
candFreqKItemSetMap.put(kSet,value);
}
else{
Integervalue=1+candFreqKItemSetMap.get(kSet);
candFreqKItemSetMap.put(kSet,value);
}
}
}
}

‘贰’ 数据挖掘中的apriori算法的具体步骤是什么

算法:Apriori
输入:D - 事务数据库;min_sup - 最小支持度计数阈值
输出:L - D中的频繁项集
方法:
L1=find_frequent_1-itemsets(D); // 找出所有频繁1项集
For(k=2;Lk-1!=null;k++){
Ck=apriori_gen(Lk-1); // 产生候选,并剪枝
For each 事务t in D{ // 扫描D进行候选计数
Ct =subset(Ck,t); // 得到t的子集
For each 候选c 属于 Ct
c.count++;
}
Lk={c属于Ck | c.count>=min_sup}
}
Return L=所有的频繁集;

Procere apriori_gen(Lk-1:frequent(k-1)-itemsets)
For each项集l1属于Lk-1
For each项集 l2属于Lk-1
If((l1[1]=l2[1])&&( l1[2]=l2[2])&&……..
&& (l1[k-2]=l2[k-2])&&(l1[k-1]<l2[k-1])) then{
c=l1连接l2 //连接步:产生候选
if has_infrequent_subset(c,Lk-1) then
delete c; //剪枝步:删除非频繁候选
else add c to Ck;
}
Return Ck;

Procere has_infrequent_sub(c:candidate k-itemset; Lk-1:frequent(k-1)-itemsets)
For each(k-1)-subset s of c
If s不属于Lk-1 then
Return true;
Return false;

‘叁’ 请问以下题目用apriori算法怎么做

这个题跟allelectronics数据集是一样的
你网络一下apriori allelectronics
或者找找《数据挖掘概念与技术》就会了
只能讲到这了

‘肆’ 如何提高apriori算法的效率

Apriori算法是关联规则挖掘中的经典算法。在Apriori算法中,使用频繁项集的先验知识,逐层搜索的迭代方法,通过扫描数据库,累积每个项的计数,并收集满足最小支持度的项,找每个Lk都需要扫描一次数据库。算法的效率随着数据量的增大,频繁项集的增多,算法的效率就非常的低,本文通过对Apriori算法分析,应用散列、事务压缩、划分、抽样等方法,最大可能的减少数据库扫描的次数,快速发现频繁项集,提高Apriori算法的效率。

‘伍’ apriori算法的计算复杂度受什么影响

一个算法的时间复杂度和其空间复杂度的关系可这样理解
一个算法要做高效率低存储是很困难的,也就是说,算法的时间复杂度小,可能需要较大的空间复杂度。反之亦然。也可以说,通过空间换得时间
希望我的回答可以帮到您哦

‘陆’ Apriori算法的核心是

  • 连接和剪枝。

  • 简言之就是对一个已知的交易数据库D,有一个最小支持阈值min_support,即为该算法的输入;算法的输出为满足最小支持阈值的频繁项集L。

  • 具体为:扫描D,对每个交易商品(T1,...,Tk---1项候选项集)计数,找出满足计数大于min_support的项集,即为1项频繁集L1;

  • 关键的来了:如何由1项频繁集L1产生2项候选项集C2,此步称为连接。

  • 如何由C2得到L2,此步即为剪枝。从C2中找出计数大于min_support的项集,即为L2。

  • 重复以上过程,增大频繁项集的长度,直至没有更长的频繁项集。

‘柒’ 用Matlab实现apriori算法关联规则的挖掘程序,完整有详细注解

下面这段是apriori算法中由2频繁项集找k频繁项集的程序,程序中有两个问题:
1、似乎while循环的K永远都是固定的,也就是都是频繁2项集的个数。得到频繁3项集后K的个数不是要变吗?如何体现呢?
2、程序中有两个for的大循环,但是发现结果是只要找到一个频繁3项集第二个for循环就会结束,但是其实还应该有其它的频繁3项集。for循环不是应该无条件执行到参数k结束吗?当时k值是15,可是程序结束的时候i=2,j=3,然后j就不执行4以及一直到k的部分了。是什么原因呢?麻烦高手指点一下。急啊……
while( k>0)
le=length(candidate{1});
num=2;
nl=0;
for i=1:k-1
for j=i+1:k
x1=candidate{i}; %candidate初始值为频繁2项集,这个表示频繁项集的第i项
x2=candidate{j};
c = intersect(x1, x2);
M=0;
r=1;
nn=0;
l1=0;
if (length(c)==le-1) & (sum(c==x1(1:le-1))==le-1)
houxuan=union(x1(1:le),x2(le));
%树剪枝,若一个候选项的某个K-1项子集为非频繁,则剪枝掉
sub_set=subset(houxuan);
%生成该候选项的所有K-1项子集
NN=length(sub_set);
%判断这些K-1项自己是否都为频繁的
while(r & M<NN)
M=M+1;
r=in(sub_set{M},candidate);
end
if M==NN
nl=nl+1;
%候选k项集
cand{nl}=houxuan;
%记录每个候选k项集出现的次数
le=length(cand{1});
for i=1:m
s=cand{nl};
x=X(i,:);
if sum(x(s))==le
nn=nn+1;
end
end
end
end
%从候选集中找频繁项集
if nn>=th
ll=ll+1;
candmid{nl}=cand{nl};
pfxj(nl).element=cand{nl};
pfxj(nl).time=nn;
disp('得到的频繁项集为:')
result=(candmid{nl});
disp(result);
end

end
end
end

‘捌’ r apriori算法结果怎么看

算法:Apriori
输入:D - 事务数据库;min_sup - 最小支持度计数阈值
输出:L - D中的频繁项集
方法:
L1=find_frequent_1-itemsets(D); // 找出所有频繁1项集
For(k=2;Lk-1!=null;k++){
Ck=apriori_gen(Lk-1); // 产生候选,并剪枝
For each 事务t in D{ // 扫描D进行候选计数
Ct =subset(Ck,t); // 得到t的子集
For each 候选c 属于 Ct
c.count++;
}
Lk={c属于Ck | c.count>=min_sup}
}
Return L=所有的频繁集;

Procere apriori_gen(Lk-1:frequent(k-1)-itemsets)
For each项集l1属于Lk-1
For each项集 l2属于Lk-1
If((l1[1]=l2[1])( l1[2]=l2[2])……..
(l1[k-2]=l2[k-2])(l1[k-1]<l2[k-1])) then{
c=l1连接l2 //连接步:产生候选
if has_infrequent_subset(c,Lk-1) then
delete c; //剪枝步:删除非频繁候选
else add c to Ck;
}
Return Ck;

Procere has_infrequent_sub(c:candidate k-itemset; Lk-1:frequent(k-1)-itemsets)
For each(k-1)-subset s of c
If s不属于Lk-1 then
Return true;
Return false;

‘玖’ Apriori算法是什么适用于什么情境

经典的关联规则挖掘算法包括Apriori算法和FP-growth算法。apriori算法多次扫描交易数据库,每次利用候选频繁集产生频繁集;而FP-growth则利用树形结构,无需产生候选频繁集而是直接得到频繁集,大大减少扫描交易数据库的次数,从而提高了算法的效率。但是apriori的算法扩展性较好,可以用于并行计算等领域。

Apriori algorithm是关联规则里一项基本算法。是由Rakesh Agrawal和Ramakrishnan Srikant两位博士在1994年提出的关联规则挖掘算法。关联规则的目的就是在一个数据集中找出项与项之间的关系,也被称为购物蓝分析 (Market Basket analysis),因为“购物蓝分析”很贴切的表达了适用该算法情景中的一个子集。

‘拾’ apriori算法使用了什么性质

Apriori性质:一个频繁项集的任一子集也应该是频繁项集。证明根据定义,若一个项集I不满足最小支持度阈值min_sup,则I不是频繁的,即P(I)<min_sup。若增加一个项A到项集I中,则结果新项集(I∪A)也不是频繁的,在整个事务数据库中所出现的次数也不可能多于原项集I出现的次数,因此P(I∪A)<min_sup,即(I∪A)也不是频繁的。这样就可以根据逆反公理很容易地确定Apriori性质成立。
http://ke..com/link?url=8F29ZS1ufQ4gtAsaXsyZr__Eut632ia

热点内容
明日之后目前适用于什么配置 发布:2024-12-23 14:56:09 浏览:50
php全角半角 发布:2024-12-23 14:55:17 浏览:825
手机上传助手 发布:2024-12-23 14:55:14 浏览:729
什么样的主机配置吃鸡开全效 发布:2024-12-23 14:55:13 浏览:827
安卓我的世界114版本有什么 发布:2024-12-23 14:42:17 浏览:707
vbox源码 发布:2024-12-23 14:41:32 浏览:274
诗经是怎么存储 发布:2024-12-23 14:41:29 浏览:656
屏蔽视频广告脚本 发布:2024-12-23 14:41:24 浏览:416
php解析pdf 发布:2024-12-23 14:40:01 浏览:815
多看阅读上传 发布:2024-12-23 14:34:05 浏览:176