数据挖掘之聚类算法Apriori总结
项目中有时候需要用到对数据进行关联分析,比如分析一个小商店中顾客购买习惯.
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总结的更多相关文章
- 续前篇---数据挖掘之聚类算法k-mediod(PAM)原理及实现
上一篇博文中介绍了聚类算法中的kmeans算法.无可非议kmeans由于其算法简单加之分类效率较高 已经广泛应用于聚类应用中. 然而kmeans并非十全十美的.其对于数据中的噪声和孤立点的聚类带来的误 ...
- 数据挖掘之聚类算法K-Means总结
序 由于项目需要,需要对数据进行处理,故而又要滚回来看看paper,做点小功课,这篇文章只是简单的总结一下基础的Kmeans算法思想以及实现: 正文: 1.基础Kmeans算法. Kmeans算法的属 ...
- [数据挖掘] - 聚类算法:K-means算法理解及SparkCore实现
聚类算法是机器学习中的一大重要算法,也是我们掌握机器学习的必须算法,下面对聚类算法中的K-means算法做一个简单的描述: 一.概述 K-means算法属于聚类算法中的直接聚类算法.给定一个对象(或记 ...
- 《数据挖掘导论》实验课——实验七、数据挖掘之K-means聚类算法
实验七.数据挖掘之K-means聚类算法 一.实验目的 1. 理解K-means聚类算法的基本原理 2. 学会用python实现K-means算法 二.实验工具 1. Anaconda 2. skle ...
- 数据挖掘十大算法--K-均值聚类算法
一.相异度计算 在正式讨论聚类前,我们要先弄清楚一个问题:怎样定量计算两个可比較元素间的相异度.用通俗的话说.相异度就是两个东西区别有多大.比如人类与章鱼的相异度明显大于人类与黑猩猩的相异度,这是能 ...
- 数据挖掘聚类算法(DBSCAN、Kmeans)Java实现
学习聚类算法时,参考算法说明随手写的java实现,代码很简单,不多做说明啦,有需要的童鞋可以看看,自己也做个备录. http://files.cnblogs.com/files/yuananyun/% ...
- 一步步教你轻松学K-means聚类算法
一步步教你轻松学K-means聚类算法(白宁超 2018年9月13日09:10:33) 导读:k-均值算法(英文:k-means clustering),属于比较常用的算法之一,文本首先介绍聚类的理 ...
- 基于改进人工蜂群算法的K均值聚类算法(附MATLAB版源代码)
其实一直以来也没有准备在园子里发这样的文章,相对来说,算法改进放在园子里还是会稍稍显得格格不入.但是最近邮箱收到的几封邮件让我觉得有必要通过我的博客把过去做过的东西分享出去更给更多需要的人.从论文刊登 ...
- K-means聚类算法
聚类分析(英语:Cluster analysis,亦称为群集分析) K-means也是聚类算法中最简单的一种了,但是里面包含的思想却是不一般.最早我使用并实现这个算法是在学习韩爷爷那本数据挖掘的书中, ...
随机推荐
- 八.利用springAMQP实现异步消息队列的日志管理
经过前段时间的学习和铺垫,已经对spring amqp有了大概的了解.俗话说学以致用,今天就利用springAMQP来完成一个日志管理模块.大概的需求是这样的:系统中有很多地方需要记录操作日志,比如登 ...
- 对Java中堆栈的解析
Java把内存分为两种:一种是栈内存,一种是堆内存 栈内存:在函数中定义的一些基本类型的变量和对象的引用变量,当超过变量的作用域之后,Java自动释放该变量内存 堆内存:存放new创建的对象和数组,由 ...
- 【java】ArrayList、Iterator用法
package com.tn.collect; import java.util.ArrayList; import java.util.Iterator; class Product{ public ...
- 结构体struct sockaddr_in, struct sockaddr,struct in_addr
一.结构体 struct sockaddr_in, struct sockaddr, struct in_addr struct sockaddr_in, struct sockaddr,str ...
- JavaScript的setter与getter方法
作者:http://hawkzz.com 以前在写项目过程一直都没有使用过Javascript的setter与getter方法,所以对其是一种要懂不懂的概念:今天看书看到这个知识点,还是模模糊糊的,于 ...
- Scala 安装 Exception in thread "main" java.lang.VerifyError: Uninitialized object exists on backward branch 96
windows下载安装完最新版本的Scala(2.12.4)后,终端如下错误 C:\Users\Administrator>scala -versionException in thread & ...
- JDBC 程序实例小练习
JDBC 程序实例问题 编程实现如下功能:在数据库中建立一个表,表名为student,其结构为学号.姓名.性别.年龄.英语.JavaSE程序设计.初级日语.总分,在表中输入多条记录. 学生的总分信息, ...
- javascript + sql编写SQL客户端工具tabris
祝大家2018新年快乐, 前不久发现了一个创意的脚本JtSQL(java编写) 开源地址为:https://github.com/noear/JtSQL JtSQL 特点:*.结合了JS.SQL.模板 ...
- 地理信息系统公开课计划 前言I
对,就是地理信息系统(GIS),不是遥感RS,也不是编程,纯粹的地理信息系统. 地理信息系统=数学+物理+计算机+地理的烧脑组合. 但凡能知道.了解地理信息系统的人,基本上都不会是非知识分子,我就不矫 ...
- 开启tomcat的apr模式,并利用redis做tomcat7的session的共享。
更新系统组件 yum -y install readline* xmlto kernel-devel yum* screen vim* psmisc wget lrzsz pcre-devel lib ...