数据挖掘实验(Apriori,fpgrowth)

Apriori:这里做了个小优化,比如abcdeadcef自连接出的新项集abcdef,可以用abcde的位置和f的位置取交集,这样第n项集的计算可以用n-1项集的信息和数字本身的位置信息计算出来,只需要保存第n-1项集的位置信息就可以提速

#include<iostream>
#include<bits/stdc++.h>
#include<cstring>
#include<set>
#include<map>
#include <unordered_set>
#include<string>
#include<vector>
#include<windows.h>
#include<time.h>
#define DATA_NAME R"(D:\Cpan\Download\.vscode\retail.dat)"
#define N 100000
#define MAX_RECORD_NUM 88162 + 1
#define MAX_ITEMID_NUM 16470 + 1
using namespace std;int recordNum = 0; 
int mp[MAX_ITEMID_NUM];
vector<int> items[N];double support;
void fastRead(){char c;bool lastIsNum = false;uint16_t num;FILE* fp = fopen(DATA_NAME, "r");while (~(c = fgetc(fp))) {if (c >= '0' && c <= '9') {if(lastIsNum){num *= 10;num += c - '0';}else{num = c - '0';}lastIsNum = true;}else {if (lastIsNum){items[num].push_back(recordNum);mp[num]++;}if (c == '\n'){recordNum++;}lastIsNum = false;}}if (lastIsNum) {items[num].push_back(recordNum);mp[num]++;}if (c != '\n') {recordNum++;}fclose(fp);
}
vector<int> same_number(vector<int> &tmp1,vector<int> &tmp2){int ite=0;vector<int> res={};for(int i=0;i<tmp1.size();++i){while(tmp2[ite]<tmp1[i] && ite<tmp2.size()-1) ite++;if(tmp2[ite]==tmp1[i]){//cout<<tmp2[ite]<<"*"<<tmp1[i]<<" "<<ite<<" "<<i<<endl;res.push_back(tmp1[i]);}}return res;
}
vector<vector<int>> v;
vector<vector<int>> v2;
vector<string> s,s2;
int total;
void cal(){total=0;s.clear();v.clear();for(int i=0;i<=MAX_ITEMID_NUM;++i){if(mp[i]>=recordNum*support*0.01){string tri=to_string(i);int tmp_len=tri.size();for(int j=1;j<=5-tmp_len;j++){tri="0"+tri;}s.push_back(tri);v.push_back(items[i]);}}int now_set_level=1;while(1){total+=s.size();cout<<"共有"<<s.size()<<"个频繁"<<now_set_level<<"项集\n";// for(auto t:s){cout<<t<<" ";}// cout<<endl;v2.clear();s2.clear();for(int i=0;i<s.size();++i){for(int j=i+1;j<s.size();++j){if(s[i].substr(0,s[i].size()-5)==s[j].substr(0,s[i].size()-5)){int num_end=stol(s[j].substr(s[i].size()-5,5));vector<int> tmp1=v[i];vector<int> tmp2=items[num_end];vector<int> same_vector=same_number(tmp1,tmp2);if(same_vector.size()>=recordNum*support*0.01){v2.push_back(same_vector);string new_tmp_string=s[i]+s[j].substr(s[i].size()-5,5);s2.push_back(new_tmp_string);}}//cout<<(s[i].substr(s[i].size()-5,5))<<endl;}}v=v2;s=s2;if(v.size()==0){break;}now_set_level+=1;}cout<<"共有"<<total<<"个频繁项集\n";
}
signed main(){cout<<"请输入置信度(单位%)\n";cin>>support;fastRead();long starttime = GetTickCount();cal();long endtime = GetTickCount();long time_cost = endtime - starttime;cout << "timecost  " << time_cost << " ms" << endl;cout<<"请输入操作\n";cout<<" 1:更改置信度\n";int oper;cin>>oper;if(oper==1){cout<<"请输入置信度\n";cin>>support;cal();}
}

Fpgrowth的算法,我没有递归建树,只建了一次树,所以速度比完整的fpgrowth要慢(当知道还要建其他树的时候实在不知道我这屎山代码怎么在继续写下去,所以直接后面直接暴力了),建了一次树后直接拿链过去爆搜子集计数了,速度主要慢在我的链最长有10左右,fpgrowth最后剪完只有3-4,通过链获取子集的复杂度是2^{len}链的长度,所以会慢,如果有一些方法能把无用节点去掉,这种做法也会快,(以后有缘再回来改吧

#include<iostream>
#include<bits/stdc++.h>
#include<cstring>
#include<set>
#include<map>
#include <unordered_set>
#include<string>
#include<vector>
#include<windows.h>
#include<time.h>
#define DATA_NAME R"(D:\Cpan\Download\.vscode\retail.dat)"
#define N 100000
#define MAX_RECORD_NUM 88162 + 1
#define MAX_ITEMID_NUM 16470 + 1
using namespace std;int recordNum = 0; 
int mp[MAX_ITEMID_NUM];
vector<int> items[N];double support;
void fastRead(){char c;bool lastIsNum = false;uint16_t num;FILE* fp = fopen(DATA_NAME, "r");while (~(c = fgetc(fp))) {if (c >= '0' && c <= '9') {if(lastIsNum){num *= 10;num += c - '0';}else{num = c - '0';}lastIsNum = true;}else {if (lastIsNum){items[recordNum].push_back(num);mp[num]++;}if (c == '\n'){recordNum++;}lastIsNum = false;}}if (lastIsNum) {items[recordNum].push_back(num);mp[num]++;}if (c != '\n') {recordNum++;}fclose(fp);
}int node_number;
vector<vector<int>> v;
vector<int> head_table[MAX_ITEMID_NUM];
int head_table_back[10*MAX_ITEMID_NUM];
vector<pair<int,int>> fp_tree[10*MAX_ITEMID_NUM];
pair<int,int> fp_tree_value[10*MAX_ITEMID_NUM];bool cmp(int &a,int &b){return mp[a]>mp[b];
}
void build(int son,int fa,vector<int> &value,int index){if(index==value.size()) return;bool exi=0;for(auto t:fp_tree[son]){if(t.first!=fa && fp_tree_value[t.first].first==value[index]){fp_tree_value[t.first].second+=1;exi=1;build(t.first,son,value,index+1);}}if(exi==0){node_number+=1;head_table[value[index]].push_back(node_number);head_table_back[node_number]=value[index];fp_tree_value[node_number]={value[index],1};fp_tree[son].push_back({node_number,1});fp_tree[node_number].push_back({son,-1});build(node_number,son,value,index+1);}
}
int tmp_dp[10*MAX_ITEMID_NUM];
void back(int number,vector<int> &res_chain){if(number==0 && fp_tree_value[number].second==0) return ;for(auto t:fp_tree[number]){if(t.second==-1 && fp_tree_value[t.first].second!=0){// cout<<"节点 "<<t.first<<"  ";// cout<<"以前是"<<tmp_dp[t.first]<<"   ";res_chain.push_back({head_table_back[t.first]});//cout<<"现在是"<<tmp_dp[t.first]<<"\n";back(t.first,res_chain);}}
}
int res[MAX_ITEMID_NUM];
vector<int> number_item;
void dfs_son(vector<vector<int>> &res_son,vector<int> &value,vector<int> tmp,int index,int now_number){if(index==value.size()){if(tmp.size()!=0){res_son.push_back(tmp);}return ;}if(now_number<=3){tmp.push_back(value[index]);dfs_son(res_son,value,tmp,index+1,now_number+1);tmp.pop_back();dfs_son(res_son,value,tmp,index+1,now_number);}else{dfs_son(res_son,value,tmp,index+1,now_number);}
}
signed main(){cout<<"请输入置信度(单位%)\n";cin>>support;fastRead();for(int i=0;i<recordNum;++i){vector<int> tmp;for(auto t:items[i]){if(mp[t]>=recordNum*support*0.01){tmp.push_back(t);}}if(tmp.size()==0) continue;else{sort(tmp.begin(),tmp.end(),cmp);// for(auto t:tmp){cout<<t<<" ";}// cout<<endl<<"**************************\n";v.push_back(tmp);}}// cout<<v.size()<<endl;long starttime = GetTickCount();for(auto t:v){build(0,-1,t,0);}for(int i=0;i<MAX_ITEMID_NUM;++i){if(mp[i]>=recordNum*support*0.01){res[1]+=1;number_item.push_back(i);//cout<<i<<"*\n";}}for(auto t:number_item){for(int i=0;i<MAX_ITEMID_NUM;++i){tmp_dp[i]=0;}map<vector<int>,int> map_vec;for(auto j:head_table[t]){//cout<<j<<"*";vector<int> vt={};int value=fp_tree_value[j].second;back(j,vt);if(!vt.size()) continue;// vector<vector<int>> vs;// for(int k=0;k<(1<<(vt.size()));k++){// 	vector<int> resson;// 	for(int o=0;o<=vt.size()-1;o++){// 		if((k>>o)&1){// 			resson.push_back(vt[o]);// 		}// 	}// 	if(resson.size()){// 		vs.push_back(resson);// 	}// }// for(auto t:vs){// 	map_vec[t]+=value;// }vector<vector<int> > res_son={};vector<int> tmp2={};dfs_son(res_son,vt,tmp2,0,1);for(auto t:res_son){map_vec[t]+=value;}}for(auto t:map_vec){if(t.second>=recordNum*support*0.01){res[t.first.size()+1]+=1;}}}long endtime = GetTickCount();long time_cost = endtime - starttime;cout << "timecost  " << time_cost << " ms" << endl;int total=0;for(int i=1;i<=MAX_ITEMID_NUM;++i){if(res[i]!=0){total+=res[i];cout<<"共有"<<res[i]<<"个频繁"<<i<<"项集\n";}else{cout<<"共有"<<total<<"个频繁项集\n";break;}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/1956.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

day06 51单片机-点阵led

1 点阵LED 1.1 需求描述 本案例介绍如何使用点阵LED显示一排由左上到右下的斜线。 1.2 硬件设计 1.2.1 硬件原理图 点阵内部的原理图: 点阵LED的原理也非常简单,就是LED点灯。例如,我们想要让13列(阳极端)9行(阴极端)的LED点亮,需要13为高电平,9为低电平。注意对于…

苍穹外卖day8(2)用户下单、微信支付

文章目录 前言一、用户下单1. 业务流程2. 接口设计3. 数据库设计3.1 订单表orders3.2 订单明细表 order_detail 4. 代码实现 二、订单支付 前言 用户下单 因为订单信息中包含了其他业务中的数据&#xff0c;在逻辑处理中涉及了多个其他业务&#xff0c;比如要判断地址簿、购物…

基于SSM+Vue的护工预约服务小程序和后台管理系统

1、系统演示视频&#xff08;演示视频&#xff09; 2、需要请联系

虚拟化+Docker基本管理

一、虚拟化简介 1、云端 华为云、谷歌云、腾讯云、阿里云、亚马逊、百度云、移动云、天翼云、西部数码云等 1.国内云 华为云、阿里云、腾讯云、天翼云(私有云) 2.国外云 谷歌云、亚马逊 2、云计算的服务模式是分层的 IaaS&#xff1a;Infrastructure&#xff08;基础设…

计算机网络【CN】Ch3 数据链路层

目录 数据链路层的功能 【※】VLAN 三种划分VLAN的方法&#xff1a; 【※】MAC帧格式 【※】三种可靠传输机制 ​编辑 【※】介质访问控制 信道划分介质访问控制 随机介质访问控制 CSMA CSMA/CD【有线】 CSMA/CA【无线】 信道利用率技巧 循环冗余校验CRC 以太网[802.3] 以太网…

项目实战 | 责任链模式 (下)

案例二&#xff1a;工作流&#xff0c;费用报销审核流程 同事小贾最近刚出差回来&#xff0c;她迫不及待的就提交了费用报销的流程。根据金额不同&#xff0c;分为以下几种审核流程。报销金额低于1000元&#xff0c;三级部门管理者审批即可&#xff0c;1000到5000元除了三级部…

智己汽车数据驱动中心PMO高级经理张晶女士受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 智己汽车科技有限公司数据驱动中心PMO高级经理张晶女士受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“规模化敏捷落地实践”。大会将于5月25-26日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1a; 2…

【Java学习笔记】9.5 Java中的Lambda表达式

Lambda表达式是从Java8版本开始增加的语法。Lambda表达式有利于实现函数式编程&#xff0c;简化开发。 9.5.1 Lambda表达式入门 Lambda表达式由三部分组成&#xff1a;参数列表、箭头(->),及一个表达式或语句块。其完整的语法格式如下&#xff1a; (Type 1 param1 , Type…

hcip实验 — 路由策略实验

目录 实验拓扑 实验要求 实验思路 实验步骤 1.配置接口及环回ip 2.配置ospf协议及rip协议 3.在R2上进行路由引入 4.在R2上进行路由过滤 5.在R4上进行路由过滤&#xff08;地址前缀列表&#xff09; 6.在R2 RIP进程上配置静默接口使RIP报文无法进入OSPF区域 实验拓扑 …

HCF-Net:用于红外小目标检测的分层上下文融合网络

摘要 红外小目标检测是一项重要的计算机视觉任务&#xff0c;涉及在红外图像中识别和定位微小物体&#xff0c;这些物体通常仅包含几个像素。然而&#xff0c;由于物体尺寸极小以及红外图像中通常复杂的背景&#xff0c;这项任务面临困难。在本文中&#xff0c;我们提出了一种…

贪吃蛇代码实现

一.基本信息 实现目标&#xff1a;使用C语言在Windows环境的控制台中实现贪吃蛇游戏 游戏运行&#xff1a; 地图绘制基本玩法提示信息游戏的开始与结束 基本玩法&#xff1a; 通过上下左右键控制蛇的移动蛇可以加速减速吃掉食物可以得分并增加蛇的长度可以自动暂停 游戏结…

代码随想录算法训练营第三十四天|1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果

1005.K次取反后最大化的数组和 思路&#xff1a; 贪心的思路&#xff0c;局部最优&#xff1a;让绝对值大的负数变为正数&#xff0c;当前数值达到最大&#xff0c;整体最优&#xff1a;整个数组和达到最大。 局部最优可以推出全局最优。 那么如果将负数都转变为正数了&…

SAP DMS后台配置(4)

当DMS和CS文档服务器关联的时候,除了需要BASIS进行相关的配置以外,我们DMS也要进行相关的系统配置 路径:SPRO—跨应用组件—文档管理—常规数据—存储系统设置—维护还原系统 路径:SPRO—跨应用组件—文档管理—常规数据—存储系统设置—维护还原类别 当DMS和CS文档服…

HarmonyOS开发实例:【图片编辑应用】

介绍 本篇Codelab通过动态设置元素样式的方式&#xff0c;实现几种常见的图片操作&#xff0c;包括裁剪、旋转、缩放和镜像。效果如图所示&#xff1a; 相关概念 [image组件]&#xff1a;图片组件&#xff0c;用来渲染展示图片。[div组件]&#xff1a;基础容器组件&#xff0…

VMware虚拟机安装CentOS详细教程

前言 最近小白发现&#xff0c;有很多小伙伴在学习过程中都需要配置CentOS的系统&#xff0c;因此决定更新一篇在VMware虚拟机上安装CentOS的教程。 小白最近也去看了一下各种云的服务商出租的服务器&#xff0c;其中可选的系统中也有包括CentOS&#xff0c;所以在VMware配置…

用python做傅里叶变换和系统辨识

一、原始信号 1、理想数据 &#xff08;1&#xff09;系统参数 参数类型数值J0.5 k g ∗ m 2 kg*m^2 kg∗m2K0.2b5 &#xff08;2&#xff09;激励曲线 import matplotlib.pyplot as plt import numpy as np# 生成数据 x np.linspace(0, 10, 1000) # 生成0到10之间的100…

Midjourney与waifu2x双剑合璧:完美打造超高清动漫图像

在追求完美的动漫图像时&#xff0c;质量和分辨率是两个关键因素。Midjourney&#xff08;一个神秘而强大的AI图像生成工具&#xff09;与waifu2x&#xff08;一个专门用于放大动漫风格图像的AI工具&#xff09;的结合使得创造超高清的动漫图像变得触手可及。本文将引导您如何使…

【C++】---STL之vector详解

【C】---STL之vector详解 一、vector的介绍&#xff1a;二、vector的成员函数&#xff1a;1、vector类的构造函数2、vector的元素访问符3、vector的迭代器4、vector的模版5、vector的拷贝构造6、vector的容量&#xff08;1&#xff09;vector的增容机制&#xff08;2&#xff0…

Spring的过滤器、拦截器、切面区别及案例分析

Spring的过滤器、拦截器、切面 三者的区别&#xff0c;以及对应案例分析 一、三者的实现方式 1.1 过滤器 xxxFilter 过滤器的配置比较简单&#xff0c;直接实现Filter接口即可&#xff0c;也可以通过WebFilter注解实现对特定URL的拦截&#xff0c;Filter接口中定义了三个方法…

告别数据丢失,轻松掌握文件自动备份秘籍

在这个数字化高速发展的时代&#xff0c;我们的工作和生活都离不开电脑&#xff0c;而电脑中存储的文件和数据更是至关重要。然而&#xff0c;数据丢失的风险无处不在&#xff0c;可能因为硬件故障、软件崩溃、病毒攻击等原因而导致重要文件丢失。因此&#xff0c;文件自动备份…