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

 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. 17082 两个有序数序列中找第k小(优先做)

    17082 两个有序数序列中找第k小(优先做) 时间限制:1000MS  内存限制:65535K提交次数:0 通过次数:0 题型: 编程题   语言: G++;GCC;VC Description 已 ...

  2. js登录滑动验证,不滑动无法登陆

    js的判断这里是根据滑块的位置进行判断,应该是用一个flag判断 <%@ page language="java" contentType="text/html; ...

  3. GDB scheduler-locking 命令详解

    GDB scheduler-locking 命令详解 GDB> show scheduler-locking     //显示线程的scheduler-locking状态GDB> set ...

  4. [知了堂学习笔记]_用JS制作《飞机大作战》游戏_第4讲(创建敌方飞机、敌方飞机发射子弹、玩家子弹击中敌方小飞机,小飞机死亡)

    一.创建敌方飞机 1.思考创建思路: 创建敌方飞机思路与创建玩家飞机思路一样: (1)思考敌方飞机具备什么属性: 敌方飞机的图片.坐标.飞行速度.状态(是否被击中) 设置小飞机被击中时消失时间.飞机可 ...

  5. 活动倒计时-兼容ios

    最近要做一个活动,需要用倒计时,写好之后再IOS上无效,经过百度知道了,原来IOS不能识别格式"2017-11-09 --",所以要进行转换才有效 直接上代码了: <!DOC ...

  6. Chrome 里的请求报错 "CAUTION: Provisional headers are shown" 是什么意思?

    在调试器中看到文件显示提示为 CAUTION: Provisional headers are shown, 可是直接复制链接访问资源却可以正常访问, 最后发现是https 问题,资源采用ssl协议, ...

  7. 使用HTML语言和CSS开发商业站点

    第一章 预习笔记 单词: head:前进 title:标题 meta:超过 body:身体.尸体 W3C:全球最大的中文Web技术教程 strong:强烈的 target:目标,对象 href:水平参 ...

  8. js解析xml浏览器兼容性处理

    /****************************************************************************** 说明:xml解析类 ********** ...

  9. Java Web高级编程(三)

    使用过滤器改进应用程序 一.过滤器的目的 过滤器是可以拦截访问资源的请求.资源的响应或者同时拦截两者的应用组件.过滤器可以检测和修改请求和响应,同时也可以拒绝.重定向或转发请求.javax.servl ...

  10. SQL2005 到 SQL2008R2 发布订阅----发布'xxxxx'的初始快照尚不可用。

    步骤略! SQL2005 到 SQL2008R2 发布订阅----发布'xxxxx'的初始快照尚不可用. 发布库快照已经创建完成为什么到订阅就快照不可用呢! 订阅通过日志读取代理解析! 查了下代理安全 ...