apriori如何实现apriori算法
apriori 时间:2021-06-22 阅读:(
)
Clementine关联规则Apriori算法事务模式怎么使用
算法: Apriori算法,使用逐层迭代找出频繁项集。
输入:事务数据库D;最小支持度阈值min_sup。
输出:D 中的频繁项集L。
1) L1 = find_frequent_1_itemsets(D);
2) for (k = 2; Lk-1 ≠ ; k++) {
3) Ck = aproiri_gen(Lk-1,min_sup);
4) for each transaction t D{ //scan D for count
5) Ct = subset(Ck,t); //get subsets of t that are candidates
6) for each candidate c Ct
7) c.count++;
8) }
9) Lk={c Ck | c.count ≥ min_sup}
10) }
11) return L = ∪kLk;问读音:null,Apriori,FP-Growth的读法
汉语标出可真不准确,不方便啊
servlet /s?:vlit/--/se wu li te/
HTML 就是一个一个字母的读,它是hyper text markup language简写
null /n?l/--/na ou/
apriori 英文发音为:/?pri?ri/--/e pe rui ao rui/
FP-Growth 英文发音为:/aif pi: gr?uθ/--/F P-ge rou si/
前面一个词一般读中文 普瑞奥瑞
后面的一个词 直接读英文如何实现apriori算法
import?java.util.HashMap;
import?java.util.HashSet;
import?java.util.Iterator;
import?java.util.Map;
import?java.util.Set;
import?java.util.TreeMap;
/**
*?<B>关联规则挖掘:Apriori算法</B>
*?
*?<P>按照Apriori算法的基本思想来实现
*?
*?@author?king
*?@since?2013/06/27
*?
*/
public?class?Apriori?{
private?Map<Integer,?Set<String>>?txDatabase;?//?事务数据库
private?Float?minSup;?//?最小支持度
private?Float?minConf;?//?最小置信度
private?Integer?txDatabaseCount;?//?事务数据库中的事务数
private?Map<Integer,?Set<Set<String>>>?freqItemSet;?//?频繁项集集合
private?Map<Set<String>,?Set<Set<String>>>?assiciationRules;?//?频繁关联规则集合
public?Apriori(
????Map<Integer,?Set<String>>?txDatabase,?
????Float?minSup,?
????Float?minConf)?{
???this.txDatabase?=?txDatabase;
???this.minSup?=?minSup;
???this.minConf?=?minConf;
???this.txDatabaseCount?=?this.txDatabase.size();
???freqItemSet?=?new?TreeMap<Integer,?Set<Set<String>>>();
???assiciationRules?=?new?HashMap<Set<String>,?Set<Set<String>>>();
}
/**
*?扫描事务数据库,计算频繁1-项集
*?@return
*/
public?Map<Set<String>,?Float>?getFreq1ItemSet()?{
???Map<Set<String>,?Float>?freq1ItemSetMap?=?new?HashMap<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();
????//?计算支持度
????Float?supported?=?new?Float(entry.getValue().toString())/new?Float(txDatabaseCount);
????if(supported>=minSup)?{
?????freq1ItemSetMap.put(entry.getKey(),?supported);
????}
???}
???return?freq1ItemSetMap;
}
/**
*?计算候选频繁1-项集
*?@return
*/
public?Map<Set<String>,?Integer>?getCandFreq1ItemSet()?{
???Map<Set<String>,?Integer>?candFreq1ItemSetMap?=?new?HashMap<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(String?item?:?itemSet)?{
?????Set<String>?key?=?new?HashSet<String>();
?????key.add(item.trim());
?????if(!candFreq1ItemSetMap.containsKey(key))?{
??????Integer?value?=?1;
??????candFreq1ItemSetMap.put(key,?value);
?????}
?????else?{
??????Integer?value?=?1+candFreq1ItemSetMap.get(key);
??????candFreq1ItemSetMap.put(key,?value);
?????}
????}
???}
???return?candFreq1ItemSetMap;
}
/**
*?根据频繁(k-1)-项集计算候选频繁k-项集
*?
*?@param?m?其中m=k-1
*?@param?freqMItemSet?频繁(k-1)-项集
*?@return
*/
public?Set<Set<String>>?aprioriGen(int?m,?Set<Set<String>>?freqMItemSet)?{
???Set<Set<String>>?candFreqKItemSet?=?new?HashSet<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?=?new?HashSet<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?=?new?HashSet<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-项集集合
?????}
????}
???}
???return?candFreqKItemSet;
}
/**
?*?使用先验知识,剪枝。
若候选k项集中存在k-1项子集不是频繁k-1项集,则删除该候选k项集
?*?@param?candKItemSet
?*?@param?freqMItemSet
?*?@return
?*/
private?boolean?has_infrequent_subset(Set<String>?candKItemSet,?Set<Set<String>>?freqMItemSet)?{
Set<String>?tempSet?=?new?HashSet<String>();
tempSet.addAll(candKItemSet);
Iterator<String>?itItem?=?candKItemSet.iterator();
while(itItem.hasNext())?{
String?item?=?itItem.next();
tempSet.remove(item);//?该候选去掉一项后变为k-1项集
if(!freqMItemSet.contains(tempSet))//?判断k-1项集是否是频繁项集
return?true;
tempSet.add(item);//?恢复
}
return?false;
}
/**
*?根据一个频繁k-项集的元素(集合),获取到频繁k-项集的从该元素开始的迭代器实例
*?@param?itemSet
*?@param?freqKItemSet?频繁k-项集
*?@return
*/
private?Iterator<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;
????}
???}
???return?it;
}
/**
*?根据频繁(k-1)-项集,调用aprioriGen方法,计算频繁k-项集
*?
*?@param?k?
*?@param?freqMItemSet?频繁(k-1)-项集
*?@return
*/
public?Map<Set<String>,?Float>?getFreqKItemSet(int?k,?Set<Set<String>>?freqMItemSet)?{
???Map<Set<String>,?Integer>?candFreqKItemSetMap?=?new?HashMap<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?=?new?HashSet<String>();
?????set.addAll(kSet);
?????set.removeAll(entry.getValue());?//?候选频繁k-项集与事务数据库中元素做差运算
?????if(set.isEmpty())?{?//?如果拷贝set为空,支持数加1
??????if(candFreqKItemSetMap.get(kSet)?==?null)?{
???????Integer?value?=?1;
???????candFreqKItemSetMap.put(kSet,?value);
??????}
??????else?{
???????Integer?value?=?1+candFreqKItemSetMap.get(kSet);
???????candFreqKItemSetMap.put(kSet,?value);
??????}
?????}
????}
???}
如今我们还有在做个人网站吗?随着自媒体和短视频的发展和兴起,包括我们很多WEB2.0产品的延续,当然也包括个人建站市场的低迷和用户关注的不同,有些个人已经不在做网站。但是,由于我们有些朋友出于网站的爱好或者说是有些项目还是基于PC端网站的,还是有网友抱有信心的,比如我们看到有一些老牌个人网站依旧在运行,且还有新网站的出现。今天在这篇文章中谈谈有网友问关于个人网站备案的问题。这个也是前几天有他在选择...
vpsdime上了新产品系列-Windows VPS,配置依旧很高但是价格依旧是走低端线路。或许vpsdime的母公司Nodisto IT想把核心产品集中到vpsdime上吧,当然这只是站长个人的猜测,毕竟winity.io也是专业卖Windows vps的,而且也是他们自己的品牌。vpsdime是一家新上来不久的奇葩VPS提供商,实际是和backupspy以及crowncloud等都是同一家公司...
virmach怎么样?virmach家这几年非常火,从商家的黑五闪购开始,以超低的价格吸引了大批的国人客户,而且商家的机器还是非常稳定的,站长手里的4.75刀年付已经用了两年了,非常稳定,不过商家到国内的线路一般,目前商家新上了夏季优惠促销,价格低到发指,年付7.2美元起,商家反馈将在9月开始更换AMD+NVMe平台,这个消息从年初就有了,不过一直没有更换,目前这个时间也不确定是否准确。点击进入:...
apriori为你推荐
activity跳转Java android activity间的跳转instagram电脑版iOS 有哪些优秀的照片处理软件windowsmedia电脑的大部分软件打开方式变为了Windows media centerexcel大写金额EXCEL金额大写怎么用电脑发短信谁知道怎样能用电脑给手机发短信无处不在的意思,幸福无处不在,最适合才是最好是什么意思webservice框架如何用webservice 的cxf框架网络安全密钥一般路由器是网络安全密钥是多少泛微协同办公系统泛微软件怎么样?做协同办公的,我要来这做销售前景怎么样?请大家对这个行业或公司了解的给些建议。空间导航QQ空间中如何自定义导航?
网址域名注册 天津服务器租赁 网站域名备案 韩国俄罗斯 cpanel主机 softbank官网 win8.1企业版升级win10 美国php空间 500m空间 howfile 刀片服务器的优势 最好的免费空间 91vps 空间合租 photobucket 攻击服务器 windowssever2008 优惠服务器 linux服务器系统 weblogic部署 更多