数据挖掘Aprior算法详解及c++源码
【算法大致描述】
Aprior算法主要有两个操作,扫描数据库+统计。计算每一阶频繁项集都要扫描一次数据库并且统计出满足支持度的n阶项集。
【算法主要步骤】
一、频繁一项集
算法开始第一步,通过扫描数据库,统计出每条记录中出现的每一个单独项并计数,数据库扫描完成,统计结束,根据支持度,选出满足条件的频繁一项集 L1。
二、连接
用 Lk-1自连接得到Ck。
方法,如果Lk-1中的两个元素的前K-2项都相同,只有最后一项不同,则自连接得到Ck中的一个元素。例如L3{(12,13,14),(12,13,15) }则可自连接得到C4{(12 13 14 15)}
三、修剪
对于自连接得到的Ck,其中有些元素是可以不用扫描数据库就可以确定它肯定不是频繁项集的。一个k-项集,如果它的一个k-1项集(它的子集 )不是频繁的,那它本身也不可能是频繁的。
例如L3{(12 ,13,14),(12,13,15)}自连接得到C4{(12,13,14,15)} 但是(13,14,15)不在L3中,所以可以肯定(12,13,14,15)不是频繁四项集,不用再去扫描数据库。
通过修剪,可以很快的减少Ck中的元素,减少数据库的扫描次数,大大加快效率。
四、扫描数据库得到频繁k项集Lk
将已经修剪过的Ck中的每一个元素拿到数据库中去找,统计出现次数,根据支持度得到结果。
C++源码
#include<bits/stdc++.h>
#include<string>
#include<vector>
#include<map>
using namespace std;
vector <string> result;
map<string,int>r1;
float suport;
vector<string> file;
void Getfile(){
ifstream ifile("D://retail.dat");
if(!ifile){
cout<<"open file error"<<endl;
}
else{
string temp;
while(getline(ifile,temp)){
file.push_back(temp);
}
}
ifile.close();
}
bool IsrealCk(vector<string>& Lk ,vector<string> &str){//判断str的子集是否在Lk-1中
string temp;
int i;
for( i=;i<str.size();i++){
temp.clear();
for(int j=;j<str.size();j++){//Cn 1
if(j!=i){
temp+=str[j];
temp.push_back(',');
}
}//生成一个子集
temp.erase(temp.size()-);
int k;
for( k=;k<Lk.size();k++){//
if(Lk[k]==temp)
break;
}
if(k>=Lk.size()){//不在Lk
break;
} }
if(i>=str.size())
return ;
else
return ;
}
vector<string> minCK(vector<string>& Lk,vector<string>& Ck){//剪枝 (12,45,32)
vector<string> minck;
vector<string> str;
for(int i=;i<Ck.size();i++){
string s;
str.clear();
for(int j=;j<Ck[i].size();j++){
while(Ck[i][j]!=','&&j<Ck[i].size()){
s.push_back(Ck[i][j]);
j++;
}
str.push_back(s);
s.clear();
}
if(IsrealCk(Lk,str)){
minck.push_back(Ck[i]);
}
}
return minck;
}
vector<string> GetL1_C2(){
vector <string> L1;
vector<int> count;
vector<string> l1;
vector<string> C2;
string temp;
int line=;
string lk;
for(int f=;f<file.size();f++){
temp=file[f];
line++;
int i;
for( i=;i<temp.size();i++){
while(temp[i]!=' '&&temp[i]!='\n'&&i!=temp.size()){
lk+=temp[i];
i++;
}
if(r1.find(lk)!=r1.end())
r1[lk]++;
else
r1[lk]=;
lk.clear();//
}
}
temp.clear();
map<string,int>::iterator it;
for(it=r1.begin();it!=r1.end();it++){//待删除
if(it->second>=ceil(suport*line)){
cout<<it->first<<" ("<<it->second<<")"<<endl;
result.push_back(it->first); }
}
for(int i=;i<result.size();i++){
for(int j=i+;j<result.size();j++){
string c2=result[i]+","+result[j];
C2.push_back(c2);
}
}
return C2;
}
vector<string> CK(vector<string>& L){
vector<string> Ck;//k+1候选像集
vector<string> minck;
for(int i=;i<L.size();i++){
for(int j=i+;j<L.size();j++){
if(i!=j){
string temp1,temp2;
int m1,m2;
for(m1=L[i].size()-;m1>;m1--){
if(L[i][m1]==',')
break;
}
temp1=L[i].substr(,m1+);
for(m2=L[j].size()-;m2>;m2--){
if(L[j][m2]==',')
break;
}
temp2=L[j].substr(,m2+);
if(temp1==temp2){//可以连接
string lk=temp1;
for(int x=m1+;x<L[i].size();x++) {
lk.push_back(L[i][x]);
}
lk.insert(lk.end(),',');
for(int x=m2+;x<L[j].size();x++) {
lk.push_back(L[j][x]);
}
Ck.push_back(lk);//加入候选项
}
}
}
}
// minck=minCK(L,Ck);
return minck=minCK(L,Ck);
} bool Isin(string& temp,string& str){
int j;
string s;
for( j=;j<temp.size();j++){//遍历temp
while(temp[j]!=' '&&j<temp.size()){
s.push_back(temp[j]);
j++;
}
if(s==str)
break;
s.clear();
}
if(j>=temp.size())
return ;
else
return ; }
vector<string> GetLk(vector<string>& Ck){
map<string,int> Lk;
string temp;
int flag=;
int line=;
for(int f=;f<file.size();f++){
temp=file[f];
line++;int t=;
vector<string> str;
for(int i=;i<Ck.size();i++){
string s;//记录单个元素 12,32 s=12
str.clear();
for( int j=;j<Ck[i].size();j++){//遍历 12,34
while(Ck[i][j]!=','&&j<Ck[i].size()){
s.push_back(Ck[i][j]);
j++;
}
str.push_back(s);
s.clear();
} int p;
for( p=;p<str.size();p++){
if(!Isin(temp,str[p]))
break;
}
if(p>=str.size()){//在temp中出现
if(Lk.find(Ck[i])!=Lk.end())
Lk[Ck[i]]++;
else
Lk[Ck[i]]=;
}
} }
/*********/
temp.clear();
vector<string> ck;
map<string,int>::iterator it;
for( it=Lk.begin();it!=Lk.end();it++){//待删除
if(it->second>=ceil(suport*line)){
ck.push_back(it->first);
}
}
return ck; }
void Apri(vector<string>& Ck){
if(Ck.size()<){
return ;
}
else{
vector<string> temp=GetLk(Ck);
if(temp.size()<)
return;
else{
for(int i=;i<temp.size();i++){
result.push_back(temp[i]);//记录Lk
}
vector<string>nextck= CK(temp);
Apri(nextck); }
}
}
int main(){
cout<<"请输入最小支持度"<<endl;
cin>>suport;
Getfile();
int c=;
vector<string> C2=GetL1_C2();
Apri(C2);
cout<<"频繁项集如下:"<<endl;
for(int i=;i<result.size();i++){
cout<<result[i]<<endl;
c++;
}
cout<<" count "<<c<<endl;
return ;
}
测试文件(有八万多条记录,测试代码建议跑0.1支持度)
https://pan.baidu.com/s/1Lp7LJOXksIRh3KBra2iVIw
数据挖掘Aprior算法详解及c++源码的更多相关文章
- 《Android NFC 开发实战详解 》简介+源码+样章+勘误ING
<Android NFC 开发实战详解>简介+源码+样章+勘误ING SkySeraph Mar. 14th 2014 Email:skyseraph00@163.com 更多精彩请直接 ...
- Android中Canvas绘图基础详解(附源码下载) (转)
Android中Canvas绘图基础详解(附源码下载) 原文链接 http://blog.csdn.net/iispring/article/details/49770651 AndroidCa ...
- Android事件传递机制详解及最新源码分析——ViewGroup篇
版权声明:本文出自汪磊的博客,转载请务必注明出处. 在上一篇<Android事件传递机制详解及最新源码分析--View篇>中,详细讲解了View事件的传递机制,没掌握或者掌握不扎实的小伙伴 ...
- 【详解】ThreadPoolExecutor源码阅读(三)
系列目录 [详解]ThreadPoolExecutor源码阅读(一) [详解]ThreadPoolExecutor源码阅读(二) [详解]ThreadPoolExecutor源码阅读(三) 线程数量的 ...
- 【详解】ThreadPoolExecutor源码阅读(二)
系列目录 [详解]ThreadPoolExecutor源码阅读(一) [详解]ThreadPoolExecutor源码阅读(二) [详解]ThreadPoolExecutor源码阅读(三) AQS在W ...
- 【详解】ThreadPoolExecutor源码阅读(一)
系列目录 [详解]ThreadPoolExecutor源码阅读(一) [详解]ThreadPoolExecutor源码阅读(二) [详解]ThreadPoolExecutor源码阅读(三) 工作原理简 ...
- SpringBoot Profile使用详解及配置源码解析
在实践的过程中我们经常会遇到不同的环境需要不同配置文件的情况,如果每换一个环境重新修改配置文件或重新打包一次会比较麻烦,Spring Boot为此提供了Profile配置来解决此问题. Profile ...
- Python开发技术详解(视频+源码+文档)
Python, 是一种面向对象.直译式计算机程序设计语言.Python语法简捷而清晰,具有丰富和强大的类库.它常被昵称为胶水语言,它能够很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松地联结 ...
- Android 网络框架之Retrofit2使用详解及从源码中解析原理
就目前来说Retrofit2使用的已相当的广泛,那么我们先来了解下两个问题: 1 . 什么是Retrofit? Retrofit是针对于Android/Java的.基于okHttp的.一种轻量级且安全 ...
随机推荐
- NetworkComms V2版本与V3版本语法的差异
NetworkComms网络通信框架序言 NetworkComms通信框架中V3版本是一次重要的升级,底层做了诸多改变,但语法上与V2版本相比,差不并不大. 监听端口: V3中 IPEndPoint ...
- 一,Jetty启动
一,Jetty安装 从官网download.eclipse.org/jetty/ 下载需要的版本,在指定目录解压即可,下面用$JETTY_HOME表示Jetty的解压目录,也就是安装目录.我用的版本是 ...
- Linux下的解压缩
Linux下常见的压缩包格式有5种:zip tar.gz tar.bz2 tar.xz tar.Z 其中tar是种打包格式,gz和bz2等后缀才是指代压缩方式:gzip和bzip2 filename. ...
- swoole安装异步reids
/usr/local/php/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config --enable-async ...
- go 区分指针
先看一段代码 先放一段代码,人工运行一下,看看自己能做对几题? package main import "fmt" func main() { var a int = 1 var ...
- Apache Solr远程命令执行
简介 Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引:也可以通过Http G ...
- 第四章 K8s部署安装
一.kube-proxy开启ipvs的前置条件 //1.加载netfilter模块 modprobe br_netfilter //2.添加配置文件 cat > /etc/sysconfig/m ...
- python字典拼接方法
python的dict拼接有多种方法,其中一种很好用而且速度非常快: x = {**a, **b} 效果等价于: x = a.copy() x.update(b) 注意update()是没有返回值的 ...
- struct解决socket黏包问题 (指令传输)
服务端代码如下 import struct import subprocess import socket server = socket.socket() server.bind(()) serve ...
- WPF 从服务器下载文件
1.先获取服务器下载地址,给出要下载到的目标地址 public void DownloadFileFromServer() { string serverFilePath = "http:/ ...