/**
* Created by 李勇志 on 2016/12/6.
* 2014301500370
*
* 本工程包含两个数据文件
* fulldata为老师给的原始数据文件,由于数据量过大程序跑不出来结果,没有选用进行测试
* top1000data是从fulldata中摘取的前1000条数据,本程序运行的结果是基于这前1000条数据进行的频繁项集挖掘和关联度分析
*
*/
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.*;
/**
* Apriori算法实现 最大模式挖掘,涉及到支持度,但没有置信度计算
*
* AssociationRulesMining()函数实现置信度计算和关联规则挖掘
*/
public class AprioriMyself {
public static int times=0;//迭代次数
private static double MIN_SUPPROT = 0.02;//最小支持度百分比
private static double MIN_CONFIDENCE=0.6;//最小置信度
private static boolean endTag = false;//循环状态,迭代标识
static List<List<String>> record = new ArrayList<List<String>>();//数据集
static List<List<String>> frequentItemset=new ArrayList<>();//存储所有的频繁项集
static List<Mymap> map = new ArrayList();//存放频繁项集和对应的支持度技术
public static void main(String args[]){
System.out.println("请输入最小支持度(如0.05)和最小置信度(如0.6)");
Scanner in=new Scanner(System.in);
MIN_SUPPROT=in.nextDouble();
MIN_CONFIDENCE=in.nextDouble();
/*************读取数据集**************/
record = getRecord("top1000data");
//控制台输出记录
System.out.println("读取数据集record成功===================================");
ShowData(record);
Apriori();//调用Apriori算法获得频繁项集
System.out.println("频繁模式挖掘完毕。\n\n\n\n\n进行关联度挖掘,最小支持度百分比为:"+MIN_SUPPROT+" 最小置信度为:"+MIN_CONFIDENCE);
AssociationRulesMining();//挖掘关联规则
}
/**********************************************
* ****************读取数据********************/
public static List<List<String>> getRecord(String url) {
List<List<String>> record = new ArrayList<List<String>>();
try {
String encoding = "UTF-8"; // 字符编码(可解决中文乱码问题 )
File file = new File(url);
if (file.isFile() && file.exists()) {
InputStreamReader read = new InputStreamReader(
new FileInputStream(file), encoding);
BufferedReader bufferedReader = new BufferedReader(read);
String lineTXT = null;
while ((lineTXT = bufferedReader.readLine()) != null) {//读一行文件
String[] lineString = lineTXT.split(",");
List<String> lineList = new ArrayList<String>();
for (int i = 0; i < lineString.length; i++) {
lineList.add(lineString[i]);
}
record.add(lineList);
}
read.close();
} else {
System.out.println("找不到指定的文件!");
}
} catch (Exception e) {
System.out.println("读取文件内容操作出错");
e.printStackTrace();
}
return record;
}
public static void Apriori() /**实现apriori算法**/
{
//************获取候选1项集**************
System.out.println("第一次扫描后的1级 备选集CandidateItemset");
List<List<String>> CandidateItemset = findFirstCandidate();
ShowData(CandidateItemset);
//************获取频繁1项集***************
System.out.println("第一次扫描后的1级 频繁集FrequentItemset");
List<List<String>> FrequentItemset = getSupprotedItemset(CandidateItemset);
AddToFrequenceItem(FrequentItemset);//添加到所有的频繁项集中
//控制台输出1项频繁集
ShowData(FrequentItemset);
//*****************************迭代过程**********************************
times=2;
while(endTag!=true){
System.out.println("*******************************第"+times+"次扫描后备选集");
//**********连接操作****获取候选times项集**************
List<List<String>> nextCandidateItemset = getNextCandidate(FrequentItemset);
//输出所有的候选项集
ShowData(nextCandidateItemset);
/**************计数操作***由候选k项集选择出频繁k项集****************/
System.out.println("*******************************第"+times+"次扫描后频繁集");
List<List<String>> nextFrequentItemset = getSupprotedItemset(nextCandidateItemset);
AddToFrequenceItem(nextFrequentItemset);//添加到所有的频繁项集中
//输出所有的频繁项集
ShowData(nextFrequentItemset);
//*********如果循环结束,输出最大模式**************
if(endTag == true){
System.out.println("\n\n\nApriori算法--->最大频繁集==================================");
ShowData(FrequentItemset);
}
//****************下一次循环初值********************
FrequentItemset = nextFrequentItemset;
times++;//迭代次数加一
}
}
public static void AssociationRulesMining()//关联规则挖掘
{
for(int i=0;i<frequentItemset.size();i++)
{
List<String> tem=frequentItemset.get(i);
if(tem.size()>1) {
List<String> temclone=new ArrayList<>(tem);
List<List<String>> AllSubset = getSubSet(temclone);//得到频繁项集tem的所有子集
for (int j = 0; j < AllSubset.size(); j++) {
List<String> s1 = AllSubset.get(j);
List<String> s2 = gets2set(tem, s1);
double conf = isAssociationRules(s1, s2, tem);
if (conf > 0)
System.out.println("置信度为:" + conf);
}
}
}
}
public static double isAssociationRules(List<String> s1,List<String> s2,List<String> tem)//判断是否为关联规则
{
double confidence=0;
int counts1;
int countTem;
if(s1.size()!=0&&s1!=null&&tem.size()!=0&&tem!=null)
{
counts1= getCount(s1);
countTem=getCount(tem);
confidence=countTem*1.0/counts1;
if(confidence>=MIN_CONFIDENCE)
{
System.out.print("关联规则:"+ s1.toString()+"=>>"+s2.toString()+" ");
return confidence;
}
else
return 0;
}
else
return 0;
}
public static int getCount(List<String> in)//根据频繁项集得到其支持度计数
{
int rt=0;
for(int i=0;i<map.size();i++)
{
Mymap tem=map.get(i);
if(tem.isListEqual(in)) {
rt = tem.getcount();
return rt;
}
}
return rt;
}
public static List<String> gets2set(List<String> tem, List<String> s1)//计算tem减去s1后的集合即为s2
{
List<String> result=new ArrayList<>();
for(int i=0;i<tem.size();i++)//去掉s1中的所有元素
{
String t=tem.get(i);
if(!s1.contains(t))
result.add(t);
}
return result;
}
java实现apriori算法
5星 · 超过95%的资源 需积分: 39 50 浏览量
2016-12-15
15:43:53
上传
评论 17
收藏 1.6MB ZIP 举报
木子-勇士心
- 粉丝: 296
- 资源: 21
最新资源
- 2023-04-06-项目笔记 - 第一百十五阶段 - 4.4.2.113全局变量的作用域-113 -2024.04.26
- 2023-04-06-项目笔记 - 第一百十五阶段 - 4.4.2.113全局变量的作用域-113 -2024.04.26
- htmlzwbjq_downyi.com.zip
- 无头单向非循环链表的实现(Test.c)
- 无头单向非循环链表的实现(SList.c)
- 浏览器重定向插件更新文件
- SSA-BP麻雀算法优化BP神经网络多特征分类预测(Matlab实现完整源码和数据)
- 粒子群算法优化BP神经网络PSO-BP的MATLAB代码(数值预测)
- 基于Springboot的一起看书平台.zip
- 无头单向非循环链表的实现(SList.h)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
前往页