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

 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. 用keras做SQL注入攻击的判断

    本文是通过深度学习框架keras来做SQL注入特征识别, 不过虽然用了keras,但是大部分还是普通的神经网络,只是外加了一些规则化.dropout层(随着深度学习出现的层). 基本思路就是喂入一堆数 ...

  2. 什么是 stack?- 每天5分钟玩转 Docker 容器技术(111)

    什么是 stack ?在回答这个问题之前我们先回忆一下前面部署 WordPress 应用的过程: 首先创建 secret. 然后创建 MySQL service,这是 WordPress 依赖的服务. ...

  3. Material使用07 MatGridListModule的使用

    1 MatGridListModule简介 对相似数据的展现,尤其是像是图片的展示 使用起来很像表格 官方文档:点击前往 2 MatGridListModule提供的指令 2.1 mat-grid-l ...

  4. Java并发编程有多难?这几个核心技术你掌握了吗?

    本文主要内容索引 1.Java线程 2.线程模型 3.Java线程池 4.Future(各种Future) 5.Fork/Join框架 6.volatile 7.CAS(原子操作) 8.AQS(并发同 ...

  5. javascript中的双向绑定

    阅读目录 一:发布订阅模式实现数据双向绑定 二:使用Object.defineProperty 来实现简单的双向绑定. 前言: 双向数据绑定的含义:可以将对象的属性绑定到UI,具体的说,我们有一个对象 ...

  6. Object.assign()

    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign 说明 Ob ...

  7. 数据分析与展示——NumPy数据存取与函数

    NumPy库入门 NumPy数据存取和函数 数据的CSV文件存取 CSV文件 CSV(Comma-Separated Value,逗号分隔值)是一种常见的文件格式,用来存储批量数据. np.savet ...

  8. HTML状态码大全(301,404,500等)

    HTML状态码大全(301,404,500等)HTML状态码大全(301,404,500等)HTML状态码大全(301,404,500等)HTML状态码大全(301,404,500等) 这些状态码被分 ...

  9. 简述ES6其他的东西

    第一是修饰器是ES7的一个提案,现在Babel转码器已经支持.那么什么是修饰器呢,修饰器是对类的行为的改变,在代码编译时发生的,而不是在运行时发生的且修饰器只能用于类和类的方法.修饰器可以接受三个函数 ...

  10. MySQL操作时间的函数集

    求两个Timestamp之间的秒差值: select TIMESTAMPDIFF(SECOND,TIMESTAMP("2017-03-01 07:58:20"),timestamp ...