数据挖掘实验(Apriori,fpgrowth)

news2024/11/16 18:01:50

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.coloradmin.cn/o/1616236.html

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

相关文章

怎么通过Javascript脚本实现远程控制一路开关

怎么通过Javascript脚本实现远程控制一路开关呢&#xff1f; 本文描述了使用Javascript脚本调用HTTP接口&#xff0c;实现控制一路开关。一路开关可控制一路照明、排风扇等电器。 可选用产品&#xff1a;可根据实际场景需求&#xff0c;选择对应的规格 序号设备名称1智能WiFi…

信息系统项目管理师0062:需求分析(5信息系统工程—5.1软件工程—5.1.2需求分析)

点击查看专栏目录 文章目录 5.1.2需求分析1.需求的层次2.需求过程3.UML4.面向对象分析记忆要点总结5.1.2需求分析 软件需求是指用户对新系统在功能、行为、性能、设计约束等方面的期望。根据IEEE的软件工程标准词汇表,软件需求是指用户解决问题或达到目标所需的条件或能力,是…

入坑 Node.js 1

原文&#xff1a;https://blog.iyatt.com/?p14717 前言 前面刚刚对 Spring Boot 有了个概念&#xff0c;再来学学 Node.js&#xff0c;顺便当学 JavaScript&#xff0c;为后面入前端做准备。 环境 Node.js 20.12.2 官方 API 文档&#xff1a;https://nodejs.org/docs/lat…

iOS OC项目中引入SwiftUI文件

iOS OC项目中引入SwiftUI文件 1、创建SwiftUI文件 2、第一次创建时&#xff0c;Xcode会提示桥接&#xff0c;选择 Creat Bridging Header即可。 3、创建swift管理类 /**在UIKit中使用SwiftUI&#xff0c;需要使用UIHostingController对SwiftUI进行包装&#xff0c;返回的是U…

小游戏:贪吃蛇

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;贪吃蛇 &#x1f337;追光的人&#xff0c;终会万丈光芒 目录 &#x1f3dd;1.头文件&#xff1a; &#x1f3dd;2.实现文件&#xff1a; &#x1f3dd;3.测试文件 &#xff1a; 前言&#…

STM32自动光控窗帘程序+Proteus仿真图 H桥L298驱动电机

目录 1、前言 2、仿真图 3、源程序 资料下载地址&#xff1a;STM32自动光控窗帘程序Proteus仿真图 H桥L298驱动电机 1、前言 基于STM32F103设计的智能光控窗帘&#xff0c;包含STM32芯片、光敏电阻、LCD1602显示屏、电机驱动控制模块等。 备注&#xff1a;通过ARM内部的…

网络安全数字孪生:一种新颖的汽车软件解决方案

摘要 随着汽车行业转变为数据驱动的业务&#xff0c;软件在车辆的开发和维护中发挥了核心作用。随着软件数量的增加&#xff0c;相应的网络安全风险、责任和监管也随之增加&#xff0c;传统方法变得不再适用于这类任务。相应的结果是整车厂和供应商都在努力应对汽车软件日益增加…

CAS和synchronized原理

synchronized与CAS Synchronized 原理加锁工作过程一些优化 CAS实现原子类 小结 Synchronized 原理 synchronized 既可以是乐观锁, 也可以是悲观锁.synchronized 既可以是轻量级锁, 也可以是重量级锁.synchronized 重量级锁是由系统的互斥锁实现的; 轻量级锁是基于自旋锁实现的…

Windows 安全中心:页面不可用 你的 IT 管理员已限制对此应用的某些区域的访问,并且你尝试访问的项目不可用。有关详细信息,请与 IT 支持人员联系。

问题 1&#xff1a;Windows 安全中心提示&#xff1a;【页面不可用 你的 IT 管理员已限制对此应用的某些区域的访问&#xff0c;并且你尝试访问的项目不可用。有关详细信息&#xff0c;请与 IT 支持人员联系。】 修复 Microsoft.SecHealthUI 方法 1&#xff1a;命令自动重装安…

linq select 和selectMany的区别

Select 和 SelectMany 都是 LINQ 查询方法&#xff0c;但它们之间有一些区别。 Select 方法用于从集合中选择特定的属性或对集合中的元素进行转换&#xff0c;并返回一个新的集合。例如&#xff1a; var numbers new List<int> { 1, 2, 3, 4, 5 }; var squaredNumbers…

sc2024项目consul

1. 什么是consul HashiCorp Consul是一款服务网络解决方案&#xff0c;可让团队管理服务之间以及内部部署和多云环境及运行时的安全网络连接。consul提供服务发现、服务治理、流量管理和对网络基础设施设备的自动更新。(添加链接描述)Consul使用Go语言开发 2. 功能 多数据中…

【PCL】教程global_hypothesis_verification 通过验证模型假设来实现 3D 对象识别与位姿估计...

测试程序1 milk.pcd milk_cartoon_all_small_clorox.pcd 终端输出1&#xff1a; Model total points: 12575; Selected Keypoints: 193 Scene total points: 307200; Selected Keypoints: 7739 [pcl::SHOTEstimation::computeFeature] The local reference frame is not valid!…

windows驱动开发-内存概述

“90%的程序问题都是由内存引起的&#xff0c;剩下的10%是使用内存引起的&#xff01;”这是一句非常经典的论证&#xff0c;实际上&#xff0c;在程序开发中&#xff0c;内存问题就是最大的问题&#xff0c;没有之一。 现代的计算机体系中&#xff0c;内存承载了太多的功能&a…

解决“该扩展程序未列在 Chrome 网上应用店中,并可能是在您不知情的情况下添加的”的方法

一、问题 安装插件出现时“该扩展程序未列在 Chrome 网上应用店中&#xff0c;并可能是在您不知情的情况下添加的” 二、解决方法 1、把需要安装的第三方插件&#xff0c;后缀.crx 改成 .rar&#xff0c;然后解压&#xff0c;得到一个文件夹 2、再打开chrome://extensions/谷歌…

Visual Studio Code使用

目录 1.python的调试 2.c的运行 方法1&#xff1a; 方法2&#xff1a; 3.c的调试 3.1调试方法一&#xff1a;先生成执行文件&#xff0c;再调试 3.2调试方法二&#xff1a;同时生成执行文件&#xff0c;调试 4.tasks.json 与launch.json文件的参考 4.1C生成执行文件tas…

linux之进程通信

目录 一、进程通信介绍 1.目的 2.发展 3.进程通信是什么&#xff0c;怎么通信&#xff1f; 二、管道 1.介绍 2.匿名管道 1.单向通信管道原理 2.代码实现 3.管道特征 4.管道的四种情况 5.管道的应用场景 使用管道实现一个简易版本的进程池 3.命名管道 1.思考 2.…

燃冬之yum、vim和你

了解了很多指令和权限&#xff0c;搞点真枪实弹来瞅瞅 学Linux不是天天就在那掰扯指令玩&#xff0c;也不是就研究那个权限 准备好迎接Linux相关工具的使用了么码农桑~ yum 软件包 什么是软件包呢&#xff1f; 首先来举个生活中常见点的例子&#xff1a;比如我的手机是华为…

PLC无线通讯技术在汽车喷涂车间机械手臂上的应用

一、项目背景 在汽车生产装配工艺中&#xff0c;机械臂目前已经广泛地应用于装配、搬运等工业生产中&#xff0c;在机械臂系列产品中&#xff0c;汽车喷漆自动控制喷涂机械装置以其独特的优势&#xff0c;能够根据油漆喷涂量的大小&#xff0c;严格控制喷嘴与喷漆面之间距离等…

【函数式接口使用✈️✈️】配合策略模式实现文件处理的案例

目录 &#x1f378;前言 &#x1f37b;一、功能描述 &#x1f37a;二、面向对象设计模式 &#x1f379;三、策略模式 &#x1f366;四、策略 VS 面向对象 &#x1f368;章末 &#x1f378;前言 小伙伴们大家好&#xff0c;上周初步了解了下函数式接口&#xff0c;Consume…

「最没存在感」港姐冠军入行10年不受捧,与相恋4年男友分手

昨日&#xff08;4月21日&#xff09;一众歌手艺人齐集红馆举行《全港运动全城跃动第九届全港运动会开幕礼》录影&#xff0c;TVB亦派出不少的歌手艺人小花表演。其中一部分是邵珮诗与黄婧灵大跳拉丁舞&#xff0c;同属身材丰满的二人跳起上来视觉极夸张。 而平常经常露出姣好身…