数据挖掘实验(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.rhkb.cn/news/313949.html

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

相关文章

2024年巴黎奥运会临近,中国义乌又爆弹了?网友:这就是硬核实力

奥运订单热潮涌动&#xff0c;中国制造不可或缺 随着巴黎奥运会脚步的日益临近&#xff0c;中国义乌再次聚焦全球视野。 近日&#xff0c;国货探访浙江义乌国际商贸城&#xff0c;发现众多蕴含法国元素的商品被置于显眼位置&#xff0c;吸引众多采购商纷至沓来&#xff0c;争…

android脱壳:一种使用native进行抽取壳脱壳的方法,native版本的frida-fart

前言 写rxposed的时候&#xff0c;搞了很多模块&#xff0c;其中有一个远程调用脱壳的&#xff0c;但是当时使用的是rmi远程调用&#xff0c;因为一些问题无法使用&#xff0c;可能是对抗问题&#xff0c;也有可能是技术问题&#xff0c;所以我又换了一种远程调用方式。 概述…

云原生的基石:containerd引领未来容器发展趋势

文章目录 一、Containerd简介&#xff1a;容器技术的心脏二、Containerd核心原理解析三、Containerd与Docker的关系四、Containerd在云原生应用部署中的作用五、Containerd的扩展性和插件机制六、Containerd的安全特性七、Containerd的性能优化八、Containerd的社区和生态系统九…

【51单片机项目】基于51单片机自制多功能小键盘/模拟USB键盘【附源码】(STC89C52RC+CH9328)

目录 一、效果展示 二、创作灵感 三、硬件电路 注意事项 工作原理 四、源码 main.c 五、附录 CH9328工作原理 CH9328的模式选择 ​编辑 全键盘键码值表 参考链接 一、效果展示 该小键盘具有三种功能&#xff1a; 1、自动输入开机密码 2、每隔一段时间自动按下ct…

通用大模型研究重点之五:llama family

LLAMA Family decoder-only类型 LLaMA&#xff08;Large Language Model AI&#xff09;在4月18日公布旗下最大模型LLAMA3&#xff0c;参数高达4000亿。目前meta已经开源了80亿和700亿版本模型&#xff0c;主要升级是多模态、长文本方面工作。 模型特点&#xff1a;采用标准的…

Unreal Engine创建Plugin

打开UE工程&#xff0c;点击编辑&#xff0c;选择插件 点击“新插件”按钮&#xff0c;选择“空白选项”填入插件名字"MultiPlayerPlugin"&#xff0c;填入插件作者、描述&#xff0c;点击“创建插件”按钮打开C工程&#xff0c;即可看到插件目录&#xff0c;编译C工…

【网络安全】安全事件管理处置 — 安全事件处置思路指导

专栏文章索引&#xff1a;网络安全 有问题可私聊&#xff1a;QQ&#xff1a;3375119339 目录 一、处理DDOS事件 1.准备工作 2.预防工作 3.检测与分析 4.限制、消除 5.证据收集 二、处理恶意代码事件 1.准备 2.预防 3.检测与分析 4.限制 5.证据收集 6.消除与恢复 …

游戏新手村18:游戏广告渠道与广告形式

上文我们说到&#xff0c;渠道为王&#xff0c;渠道可以为我们带来流量和用户&#xff0c;进而带来收入。我们可以通过哪些渠道导入用户呢&#xff1f;每个渠道有哪些优劣呢&#xff1f;在进行游戏营销推广的时候我们该如何选择呢&#xff1f; 根据付费性质&#xff0c;我们可…

鸿蒙ArkUI实战开发-如何通过上下滑动实现亮度和音量调节

场景说明 在音视频应用中通常可以通过上下滑动来调节屏幕亮度和音量大小&#xff0c;本例即为大家介绍如何实现上述UI效果。 说明&#xff1a; 由于当前亮度和音量调节功能仅对系统应用开发&#xff0c;所以本例仅讲解UI效果的实现。 效果呈现 本例效果如下&#xff1a; 当在…

iOS - 多线程-GCD-队列组

文章目录 iOS - 多线程-GCD-队列组1. 队列组1.1 基本使用步骤 iOS - 多线程-GCD-队列组 开发过程中&#xff0c;有时候想实现这样的效果 多个任务并发执行所有任务执行完成后&#xff0c;进行下一步处理&#xff08;比如回到主线程刷新UI&#xff09; 1. 队列组 可以使用GC…

区间图着色问题:贪心算法设计及实现

区间图着色问题&#xff1a;贪心算法设计及实现 1. 问题定义2. 贪心算法设计2.1 活动排序2.2 分配教室2.3 算法终止 3. 伪代码4. C语言实现5. 算法分析6. 结论7. 参考文献 在本文中&#xff0c;我们将探讨如何使用贪心算法解决一个特定的资源分配问题&#xff0c;即区间图着色问…

ruby 配置代理 ip(核心逻辑)

在 Ruby 中配置代理 IP&#xff0c;可以通过设置 Net::HTTP 类的 Proxy 属性来实现。以下是一个示例&#xff1a; require net/http// 获取代理Ip&#xff1a;https://www.kuaidaili.com/?refrg3jlsko0ymg proxy_address 代理IP:端口 uri URI(http://www.example.com)Net:…

【002_音频开发_基础篇_Linux音频架构简介】

002_音频开发_基础篇_Linux音频架构简介 文章目录 002_音频开发_基础篇_Linux音频架构简介创作背景Linux 音频架构ALSA 简介ASoC 驱动硬件架构软件架构MachinePlatformCodec ASoC 驱动 PCMALSA设备文件结构 ALSA 使用常用概念alsa-libALSA Open 流程ALSA Write 流程2种写入方法…

Android Studio查看viewtree

前言&#xff1a;之前开发过程一直看的是手机上开发者选项中的显示布局边界&#xff0c;开关状态需要手动来回切换&#xff0c;今天偶然在Android Studio中弄出了布局树觉得挺方便的。

【STM32F407+CUBEMX+FreeRTOS+lwIP之TCP记录】

STM32F407CUBEMXFreeRTOSlwIP之TCP记录 注意TCP client(socket)示例 TCP_server(socket)效果 注意 如果连接失败&#xff0c;建议关一下代理软件。 配置方面可以参考一下上一篇UDP的文章 STM32F407CUBEMXFreeRTOSlwIP之UDP记录 TCP client(socket) #define LWIP_DEMO_PORT 8…

【C语言__指针02__复习篇12】

目录 前言 一、数组名的理解 二、使用指针访问数组 三、一维数组传参的本质 四、冒泡排序 五、二级指针 六、指针数组 七、指针数组模拟二维数组 前言 本篇主要讨论以下问题&#xff1a; 1. 数组名通常表示什么&#xff0c;有哪两种例外情况&#xff0c;在例外情况中…

【论文浅尝】Phi-3-mini:A Highly Capable Language Model Locally on Your Phone

Phi-3-mini phi-3-mini&#xff0c;一个3.8亿个参数的语言模型&#xff0c;训练了3.3万亿个token&#xff0c;其总体性能&#xff0c;通过学术基准和内部测试进行衡量&#xff0c;可以与Mixtral 8x7B和GPT-3.5等模型相媲美(在MMLU上达到69%&#xff0c;在MT-bench上达到8.38)&…

Maya vs Blender:制作3D动画首选哪一个?

就 3D 动画而言&#xff0c;有两款3D软件引发了最多的争论&#xff1a;Blender 与 Maya。这两个强大的平台都提供强大的工具集&#xff0c;使动画故事和角色栩栩如生。但作为一名3D动画师&#xff0c;您应该投入时间学习和创作哪一个呢&#xff1f;下面我将从以下六点给您一个清…

用Python将原始边列表转换为邻接矩阵

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在图论和网络分析中&#xff0c;图是一种非常重要的数据结构&#xff0c;它由节点&#xff…

C++感受6-Hello World 交互版

变量、常量输入、输出、流getline() 函数读入整行输入Hello() 函数复习新定义函数 Input() 实现友好的人机交互还有 “痘痘” 为什么挤不到的分析…… 1. DRY 原则简介 上一节课&#xff0c;我们写了两版“问候”程序。第一版的最大问题是重复的内容比较多&#xff0c;每一次问…