项目中有时候需要用到对数据进行关联分析,比如分析一个小商店中顾客购买习惯.

 package com.data.algorithm;

 import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*; /**
* *********************************************************
* <p/>
* Author: XiJun.Gong
* Date: 2017-01-20 15:06
* Version: default 1.0.0
* Class description:
* <p/>
* *********************************************************
*/ class EOC { private static final Logger logger = LoggerFactory.getLogger(EOC.class);
private Map<String, Integer> fmap; //forward map
private Map<Integer, String> bmap; //backward map
private List<Map<String, Integer>> elements = null; private Integer maxDimension; public EOC(final String pathFile, String separatSeq) { BufferedReader bufferedReader = null;
try {
this.fmap = Maps.newHashMap();
this.bmap = Maps.newHashMap();
this.elements = Lists.newArrayList();
maxDimension = 0;
bufferedReader = new BufferedReader(
new InputStreamReader(
new FileInputStream(pathFile), "UTF-8"));
String _line = null;
Integer keyValue = null, mapIndex = 0;
while ((_line = bufferedReader.readLine()) != null) {
Map<String, Integer> lineMap = Maps.newHashMap();
if (_line.trim().length() > 1) {
if (separatSeq.trim().length() < 1) {
separatSeq = ",";
}
for (String word : Splitter.on(separatSeq).split(_line)) {
word = word.trim();
if (null == (keyValue = fmap.get(word))) {
keyValue = mapIndex++;
}
fmap.put(word, keyValue);
bmap.put(keyValue, word);
lineMap.put(word, keyValue);
}
if (maxDimension < lineMap.size())
maxDimension = lineMap.size();
elements.add(lineMap);
}
}
} catch (Exception e) {
logger.error("读取文件出错 , 错误原因:{}", e);
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException e) {
logger.error("bufferedReader , 错误原因:{}", e);
}
}
}
} public Integer getMaxDimension() {
return maxDimension;
} public float getRateOfSet(Collection<Integer> elementChild) {
float rateCnt = 0f;
int allSize = 1;
for (Map<String, Integer> eMap : elements) {
boolean flag = true;
for (Integer element : elementChild) {
if (null == eMap.get(bmap.get(element))) {
flag = false;
break;
}
}
if (flag) rateCnt += 1;
}
return rateCnt / ((allSize = elements.size()) > 1 ? (float) allSize : 1.0f);
} public Set<Integer> getElements() { return new HashSet<Integer>(fmap.values());
} public Integer queryByKey(String key) {
return fmap.get(key);
} public String queryByValue(Integer value) {
return bmap.get(value);
}
} public class Apriori {
private static final Logger logger = LoggerFactory.getLogger(Apriori.class);
private EOC eoc = null;
private Integer maxDimension;
private final float exp = 1e-4f; public Apriori(final String pathFile, String separatSeq, Integer maxDimension) {
this(pathFile, separatSeq);
this.maxDimension = maxDimension;
} public Apriori(final String pathFile, String separatSeq) {
this.eoc = new EOC(pathFile, separatSeq);
this.maxDimension = this.eoc.getMaxDimension();
} public void work(float confidenceLevel) {
List<Set<Integer>> listElement = null;
ArrayList<Set<Integer>> middleWareElement = null;
Map<Set<Integer>, Float> maps = null;
listElement = Lists.newArrayList();
for (Integer element : this.eoc.getElements()) {
Set<Integer> set = new HashSet<Integer>();
set.add(element);
listElement.add(set);
}
maps = Maps.newHashMap();
middleWareElement = Lists.newArrayList();
for (int i = 1; i < this.maxDimension; i++) {
for (Set<Integer> tmpSet : listElement) {
float rate = eoc.getRateOfSet(tmpSet);
if (confidenceLevel - exp <= rate)
maps.put(tmpSet, rate);
}
System.out.println("+++++++++++第 " + i + " 维度关联数据+++++++++++");
output(maps);
listElement.clear();
middleWareElement.addAll(maps.keySet());
maps.clear();
for (int j = 0; j < middleWareElement.size(); j++) {
Set<Integer> tmpSet = middleWareElement.get(j);
for (int k = j + 1; k < middleWareElement.size(); k++) {
Set<Integer> setChild = middleWareElement.get(k);
for (Integer label : setChild) {
if (!tmpSet.contains(label)) {
Set<Integer> newElement = new HashSet<Integer>(tmpSet);
newElement.add(label);
if (!listElement.contains(newElement)) {
listElement.add(newElement);
break;
}
}
}
}
}
middleWareElement.clear();
}
} public void output(Map<Set<Integer>, Float> maps) {
for (Map.Entry<Set<Integer>, Float> iter : maps.entrySet()) {
for (Integer integer : iter.getKey()) {
System.out.print(eoc.queryByValue(integer) + " ");
}
System.out.println(iter.getValue()*100+"%");
}
}
}

  

 package com.data.algorithm;

 /**
* *********************************************************
* <p/>
* Author: XiJun.Gong
* Date: 2017-01-17 17:57
* Version: default 1.0.0
* Class description:
* <p/>
* *********************************************************
*/
public class Main {
public static void main(String args[]) {
Apriori apriori = new Apriori("/home/com/src/main/java/com/qunar/data/algorithm/demo.data", ",");
apriori.work(0.5f);
}
}
 +++++++++++第 1 维度关联数据+++++++++++
苹果 50.0%
西红柿 75.0%
香蕉 75.0%
矿泉水 75.0%
+++++++++++第 2 维度关联数据+++++++++++
苹果 西红柿 50.0%
西红柿 香蕉 50.0%
西红柿 矿泉水 50.0%
香蕉 矿泉水 75.0%
+++++++++++第 3 维度关联数据+++++++++++
西红柿 香蕉 矿泉水 50.0%

数据挖掘之聚类算法Apriori总结的更多相关文章

  1. 续前篇---数据挖掘之聚类算法k-mediod(PAM)原理及实现

    上一篇博文中介绍了聚类算法中的kmeans算法.无可非议kmeans由于其算法简单加之分类效率较高 已经广泛应用于聚类应用中. 然而kmeans并非十全十美的.其对于数据中的噪声和孤立点的聚类带来的误 ...

  2. 数据挖掘之聚类算法K-Means总结

    序 由于项目需要,需要对数据进行处理,故而又要滚回来看看paper,做点小功课,这篇文章只是简单的总结一下基础的Kmeans算法思想以及实现: 正文: 1.基础Kmeans算法. Kmeans算法的属 ...

  3. [数据挖掘] - 聚类算法:K-means算法理解及SparkCore实现

    聚类算法是机器学习中的一大重要算法,也是我们掌握机器学习的必须算法,下面对聚类算法中的K-means算法做一个简单的描述: 一.概述 K-means算法属于聚类算法中的直接聚类算法.给定一个对象(或记 ...

  4. 《数据挖掘导论》实验课——实验七、数据挖掘之K-means聚类算法

    实验七.数据挖掘之K-means聚类算法 一.实验目的 1. 理解K-means聚类算法的基本原理 2. 学会用python实现K-means算法 二.实验工具 1. Anaconda 2. skle ...

  5. 数据挖掘十大算法--K-均值聚类算法

    一.相异度计算  在正式讨论聚类前,我们要先弄清楚一个问题:怎样定量计算两个可比較元素间的相异度.用通俗的话说.相异度就是两个东西区别有多大.比如人类与章鱼的相异度明显大于人类与黑猩猩的相异度,这是能 ...

  6. 数据挖掘聚类算法(DBSCAN、Kmeans)Java实现

    学习聚类算法时,参考算法说明随手写的java实现,代码很简单,不多做说明啦,有需要的童鞋可以看看,自己也做个备录. http://files.cnblogs.com/files/yuananyun/% ...

  7. 一步步教你轻松学K-means聚类算法

    一步步教你轻松学K-means聚类算法(白宁超  2018年9月13日09:10:33) 导读:k-均值算法(英文:k-means clustering),属于比较常用的算法之一,文本首先介绍聚类的理 ...

  8. 基于改进人工蜂群算法的K均值聚类算法(附MATLAB版源代码)

    其实一直以来也没有准备在园子里发这样的文章,相对来说,算法改进放在园子里还是会稍稍显得格格不入.但是最近邮箱收到的几封邮件让我觉得有必要通过我的博客把过去做过的东西分享出去更给更多需要的人.从论文刊登 ...

  9. K-means聚类算法

    聚类分析(英语:Cluster analysis,亦称为群集分析) K-means也是聚类算法中最简单的一种了,但是里面包含的思想却是不一般.最早我使用并实现这个算法是在学习韩爷爷那本数据挖掘的书中, ...

随机推荐

  1. 青否云 - 小程序待办事项 jquery开源系统

    青否云最新开源系统:小程序待办事项 jquery-demo 青否云 Jquery demo 下载地址:https://github.com/qingful/jquery-demo 官网 http:// ...

  2. 《编程语言实现模式》【PDF】下载

    <编程语言实现模式> 编程语言实现模式旨在传授构建语言应用(工具)的经验和理念,教读者构建自己的语言应用.这里的语言应用并非特指用编译器或解释器实现编程语言,而是泛指任何处理.分析.翻译输 ...

  3. 《写给大家看的设计书(第3版)》【PDF】下载

    <写给大家看的设计书(第3版)>[PDF]下载链接: https://u253469.ctfile.com/fs/253469-231196355 内容简介 <写给大家看的设计书&g ...

  4. Hibernate--使用xml配置映射关系

    写在前面: 配置实体类与数据库的映射关系,有两种方式: 1.使用*.hbm.xml  2.使用@注解 二:xml的配置方式: eg:员工的xml配置文件: <?xml version=" ...

  5. 39.Linux应用调试-strace命令

    1.strace简介 strace常用来跟踪进程执行时的系统调用和所接收的信号.通过strace可以知道应用程序打开了哪些文件,以及读写了什么内容,包括消耗的时间以及返回值等 2.安装strace命令 ...

  6. DotNetCore跨平台~功能测试TestHost的使用

    回到目录 之前写了关于自动化测试的相关文章,包括gitlab,unittest,jenkins pipeline等,基于都是功能点的测试,当我们的框架或者业务修改之后,需要走一篇自动化测试,以此来保证 ...

  7. 并行rsync

    #!/bin/bash ]; then echo -e "usage : \n\t$0 hostList src_file dst_path" echo -e "exam ...

  8. ArcGIS API for JavaScript 4.2学习笔记[24] 【IdentifyTask类】的使用(结合IdentifyParameters类)(第七章完结)

    好吧,我都要吐了. 接连三个例子都是类似的套路,使用某个查询参数类的实例,结合对应的Task类,对返回值进行取值.显示. 这个例子是Identify识别,使用了TileLayer这种图层,数据来自Se ...

  9. 视觉SLAM的数学表达

    相机是在某些时刻采集数据的,所以只关心这些时刻的位置和地图. 就把这一段时间的运动变成了李三时刻 t=1,2,...K当中发生的事情. 在这些事可,x表示机器自身的位置. x1,x2,x3,x4... ...

  10. 如何在yarn上运行Hello World(二)

      在之前的一篇文章我们介绍了如何编写在yarn集群提交运行应用的AM的yarnClient端,现在我们来继续介绍如何编写在yarn集群控制应用app运行的核心模块 ApplicationMaster ...