问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

简述一种关联规则挖掘算法基本过程。《数据挖掘》作业题追分100

发布网友 发布时间:2022-04-07 16:54

我来回答

2个回答

懂视网 时间:2022-04-07 21:15

该算法是为了实现对一些专业文章的词汇关联分析而实现的,并不是Apriori的最佳应用,确实对词频分析的一种实践。
package com.my.analysis;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

import redis.clients.jedis.Jedis;

public class AprioriMyImpl {
	private double minsup = 0.3;// 最小支持度
	private double minconf = 0.99;// 最小置信度
	private int limitword = 100;// 参加统计的
	
	private ArrayList<Set<String>> aricleWL;//
	
	private ArrayList<Set<Set<String>>> candidateList;//候选项list
	private ArrayList<Set<Set<String>>> frequencyList;//频繁项list
	
	public Set<Set<String>> allSub = new HashSet<Set<String>>();//最大频繁项的所有子集
	
	private long filecount;//文件的总数量
	
	private int step = 1;//表示进行到第一步了
	
	private Jedis jedis = new Jedis("localhost", 6379);
	
	
	public AprioriMyImpl() {
		candidateList = new ArrayList<Set<Set<String>>>();
		frequencyList = new ArrayList<Set<Set<String>>>();
		aricleWL = new ArrayList<Set<String>>();
		
		filecount = jedis.llen(AnsjTxtFileParserForRedis.FILELIST);
		for(int i = 0;i < filecount;i++){
			aricleWL.add(jedis.smembers(AnsjTxtFileParserForRedis.FILEPREFIX+i));
		}
		
	}
	
	/**
	 * 初始化第一个候选项集合
	 */
//	public void item1_init(){
//		Set<Set<String>> candidate1 = new HashSet<Set<String>>();
//		Set<String> tset = jedis.zrevrange(AnsjTxtFileParserForRedis.TABLENAME, 0,limitword-1);
//		for(String s:tset){
//			HashSet<String> one = new HashSet<String>();
//			one.add(s);
//			candidate1.add(one);
//		}
//		candidateList.add(candidate1);
//		System.out.println("候选项集-"+(step)+":");
//		printSetSetString(candidate1);
//	}
	
	public void item1_init(){
		String[] keys ={"睡眠","时间","宝宝","治疗","疾病","身体","呼吸","质量","孩子","入睡","人体","精神","习惯","心理","障碍","枕头","保健","关注","医生","女性","症状","食物","饮食","运动","中医","床垫","儿童","婴儿","阅读","大脑","按摩","效果","癫痫","环境","营养","压力","血液","智能","休息","妈妈","男人","生理","医学","社会","药物","肌肉","男性","科技","恢复","减肥","放松","神经","危害","情绪","怀孕","午睡","分泌","下降","反馈","音乐","刺激","糖尿病","姿势","老人","熬夜","消化","记忆","消除","起床","客户","食品","感冒","高血压","招聘","老年人","孕妇","手表","解决","现象","超过","颈椎","全身","空调","侧卧","位置","体温","金笔","达到","打鼾","电视","能量","催眠","物质","状况","精力","作者","设备","价格","病人","保护","数据","经验","正文","适合","妇科","锻炼","新生儿","咳嗽","抑郁症","血管","抑制","幼儿","失眠症","心脏病","食疗","血压","肿瘤","诱发","重视","心血管","寿命","小便","免疫力","月经","评测","记忆力","智力"};
		Set<Set<String>> candidate1 = new HashSet<Set<String>>();
		for(String s:keys){
			HashSet<String> one = new HashSet<String>();
			one.add(s);
			candidate1.add(one);
		}
		candidateList.add(candidate1);
		System.out.println("候选项集-"+(step)+":");
		printSetSetString(candidate1);
	}
	/**
	 * 候选项集转化为频繁项集
	 */
	public boolean candidateToFrequency(){
		Set<Set<String>> candItems = candidateList.get(step-1);
		Set<Set<String>> freqItems = new HashSet<Set<String>>();
		for(Set<String> item:candItems){
			if((count_sup(item)/filecount)>=minsup){
				freqItems.add(item);
			}
		}
		if(freqItems.size()==0){//无法产生符合条件的频繁项集
			return false;
		}
		frequencyList.add(freqItems);
		System.out.println("频繁项集-"+(step)+":");
		printSetSetString(freqItems);//输出频繁项集
		step++;
		return true;
	}
	/**
	 * 频繁项集形成新的候选项集
	 */
	public boolean frequencyToCandidate(){
		Set<Set<String>> frequencyItems = frequencyList.get(step-2);
		Set<String> maxSub = maxSubSet(frequencyItems);
		Set<Set<String>> candidateItems = new HashSet<Set<String>>();
		for(Set<String> freqs : frequencyItems){
			int len = freqs.size();
			for(String sub:maxSub){
				Set<String> pItem = new HashSet<String>();
				pItem.addAll(freqs);
				pItem.add(sub);
				if(pItem.size()==(len+1)&&subIsFreq(frequencyItems,pItem)){
					candidateItems.add(pItem);
				}
			}
		}
		if(candidateItems.size()==0){//没有形成新的候选集
			return false;
		}
		candidateList.add(candidateItems);
		System.out.println("候选项集-"+(step)+":");
		printSetSetString(candidateItems);//输出频繁项集
		return true;
	}
	
	/**
	 * parentSet的子集在频繁集合freq中
	 * @param freq
	 * @param parentSet
	 * @return true 是 ; false 否
	 */
	public boolean subIsFreq(Set<Set<String>> freq,Set<String> parentSet){
		for(String s:parentSet){
			Set<String> item = new HashSet<String>();
			item.addAll(parentSet);
			item.remove(s);
			if(!freq.contains(item)){
				return false;
			}
		}
		return true;
	}
	/**
	 * 获得频繁项集的最大项集
	 * @param freqIntems
	 */
	public Set<String> maxSubSet(Set<Set<String>> freqIntems){
		Set<String> maxSub = new HashSet<String>();
		for(Set<String> ss:freqIntems){
			for(String s:ss){
				maxSub.add(s);
			}
		}
		return maxSub;
	}
	
	/**
	 * 计算支持度
	 * @param x
	 * @return
	 */
	public double count_sup(Set<String> x){
		int temp = 0;
		for(Set<String> ss:aricleWL){
			if(ss.containsAll(x)){
				temp++;
			}
		}
		return temp;
	}
	/**
	 * 计算集合x=>y的置信度
	 * @param x
	 * @param y
	 * @return
	 */
	public double cout_cand(Set<String> x,Set<String> y){
		Set<String> z = new HashSet<String>();
		z.addAll(x);
		z.addAll(y);
		return count_sup(z)/count_sup(x);
	}

	/**
	 * 获得所有的子集
	 * @param parent
	 */
	public void genSub(Set<String> parent){
		if(parent.size()>0){
			allSub.add(parent);
		}
		Set<String> ss = new HashSet<String>();
		ss.addAll(parent);
		for(String s:ss){
			Set<String> ss2 = new HashSet<String>();
			ss2.addAll(ss);
			ss2.remove(s);
			genSub(ss2);
		}
	}
	
	/**
	 * 输出
	 * @param sss
	 */
	public void printSetSetString(Set<Set<String>> sss){
		for(Set<String> ss:sss){
			System.out.println(ss);
		}
	}
	/**
	 * 关联度分析
	 * @param subSet
	 */
	public void releRuleCount(Set<Set<String>> subSet){
		for(Set<String> x:subSet){
			for(Set<String> y:subSet){
				Set<String> xy = new HashSet<String>();
				xy.addAll(x);
				xy.addAll(y);
				if(xy.size()==(x.size()+y.size())){
					double sup_count = cout_cand(x,y);
					if(sup_count>minconf){
						System.out.println(x+"==>>"+y+"=="+sup_count);
					}
				}
			}
		}
	}
	
	public void jisuan(){
		item1_init();//第一个候选项集的初始化
		while(true){
			if(!candidateToFrequency())
				break;
			if(!frequencyToCandidate())
				break;
		}
		Set<Set<String>> maxfreqs = frequencyList.get(frequencyList.size()-1);
		for(Set<String> maxfreq:maxfreqs){
			allSub = new HashSet<Set<String>>();
			genSub(maxfreq);
			releRuleCount(allSub);
		}
	}
	
	public static void main(String[] args) {
		//初始化候选项,取前几位word
		new AprioriMyImpl().jisuan();
	}
	
}

关联算法Apriori的java实现,数据库使用redis

标签:redis   java   算法   apriori   

热心网友 时间:2022-04-07 18:23

Apriori算法是一种发现频繁项集的基本算法。算法使用频繁项集性质的先验知识。Apriori算法使用一种称为逐层搜索的迭代方法,其中K项集用于探索(k+1)项集。首先,通过扫描数据库,累计每个项的计数,并收集满足最小支持度的项,找出频繁1项集的集合。该集合记为L1.然后,使用L1找出频繁2项集的集合L2,使用L2找到L3,如此下去,直到不能再找到频繁k项集。
Apriori算法的主要步骤如下:
(1)扫描事务数据库中的每个事务,产生候选1.项集的集合Cl;
(2)根据最小支持度min_sup,由候选l-项集的集合Cl产生频繁1一项集的集合Ll;
(3)对k=l;
(4)由Lk执行连接和剪枝操作,产生候选(k+1).项集的集合Ck+l-
(5)根据最小支持度min_sup,由候选(k+1)一项集的集合Ck+l产生频繁(k+1)-项
集的集合Lk+1.
(6)若L⋯≠①,则k.k+1,跳往步骤(4);否则,跳往步骤(7);
(7)根据最小置信度min_conf,由频繁项集产生强关联规则,结束。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
蚂蚁泡酒适合哪些人喝 蚂蚁酒的功效与禁忌蚂蚁酒的功效与作用 热血无赖卡怎么办 了解这两方面内容 益生菌孕妇 孕妇能喝益生菌吗 羽毛球双打底线是内线还是外线 为什么泰国两位尊者有不死之身 秦始皇活了多少岁?当了几年皇帝? DELL电脑D630.PP18L2手机。才用了4个多月。多少钱我可以买呢,麻烦谁说... dellpp18l现在买多少钱 富国以农,距敌恃卒的以是什么意思 中国古代为什么要“以农为本” iphone6无法正常删除软件,长按不显示红色叉键,求解~ 西汉初期,提倡以农为本,把田赋降到了三十税一的是谁 怎么长点app显示只有删除 以农立国的大一统王朝向广阔的边疆地区推进农业为什么不是没有限度的? 以农立国是什么意思 为什么说休闲农业,必须坚持以农为本呢? OPPO手机为什么长按软件的时候显示的不是删除而是移除?移除了也没用,系统仍然存在。 为什么要实行以农为本政策? 以农为本思想在中国历史上有什么作用 中国古代自然经济以农为本的原因有哪些? 汉文帝为什么实施以农为本 以农为本(穿越)_by经年未醒_txt全文阅读,百度网盘免费下载 ”以农轻重位顺序发展国民经济“是在什么时候提出的? 答案:以农轻重为序什么意思 以农为经体现了孙中山的什么思想它的核心是什么 西汉文景帝在位时期为什么提倡以农为本? vivo手机历史通知怎么查看 为什么商人出身的吕不韦认为“以农为本,以商为末”? 长按安卓手机桌面应用程序不会出现卸载字样,这类软件如何彻底卸载呢 离昆明较近的城市 人力资源管理风险及防范方法 人力资源管理主要风险点有哪些? 昆明为中心点,东北方位有哪些城市? 人力资源管理有哪些风险? 昆明是更南方向有那些城市 人力资源管理有哪些风险 对人力资源存在的风险采取什么控制措施 如何规避人力资源的法律风险 塔建与建设有区别吗? 人力资源管理的主要风险是什么? 初创企业在人力资源管理方面有哪些难点和风险点 回避人力资源管理风险的坏处有哪些,回避的方法是什么 企业人力资源管理风险主要指什么?哪方面 请问:在Excel里面怎么开三次方根,甚至更高次方?用什么函数? 怎样从人力资源管理者的角度为公司节约成本,规避风险。 承揽合同与建设工程合同的区别? 想做人事专员,从零学起,有没有比较好入门的书籍介绍下,在上海哪里能买到? excel中怎么呢计算开三次根式