数据挖掘实验(Apriori,fpgrowth)

这篇具有很好参考价值的文章主要介绍了数据挖掘实验(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,通过链获取子集的复杂度是链的长度,所以会慢,如果有一些方法能把无用节点去掉,这种做法也会快,(以后有缘再回来改吧文章来源地址https://www.toymoban.com/news/detail-856239.html

#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;
		}
	}

}

到了这里,关于数据挖掘实验(Apriori,fpgrowth)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 利用weka进行数据挖掘——基于Apriori算法的关联规则挖掘实例

    首先,如果不熟悉weka的使用的话,可以从我的git仓库里面拉取一下weka的相关教程,仓库里面还有包含此次实例的所有资源 我们可以在weka的官网上下载weka软件:weka官网 如果下载速度慢的话也可以直接从我的git仓库里面拉取这个软件,软件是win64位的weka-3-8-6 然后找到对应版

    2024年02月06日
    浏览(54)
  • 数据挖掘(一)使用 Apriori 算法进行关联分析

    关联分析是一种在大规模数据集中寻找有趣关系的任务。 这些关系可以有两种形式: 频繁项集(frequent item sets): 经常出现在一块的物品的集合。 关联规则(associational rules): 暗示两种物品之间可能存在很强的关系。 关联分析(关联规则学习): 从大规模数据集中寻找物品间的

    2024年02月09日
    浏览(54)
  • 大数据关联规则挖掘:Apriori算法的深度探讨

    在本文中,我们深入探讨了Apriori算法的理论基础、核心概念及其在实际问题中的应用。文章不仅全面解析了算法的工作机制,还通过Python代码段展示了具体的实战应用。此外,我们还针对算法在大数据环境下的性能局限提出了优化方案和扩展方法,最终以独到的技术洞见进行

    2024年01月24日
    浏览(265)
  • 【海量数据挖掘/数据分析】 之 关联规则挖掘 Apriori 算法 (数据集、事务、频繁项集、关联规则、支持度、置信度)

    目录 【海量数据挖掘/数据分析】 之 关联规则挖掘 Apriori 算法 (数据集、事务、频繁项集、关联规则、支持度、置信度) 一、 关联规则挖掘简介 二、 数据集 与 事务 ( Transaction ) 概念 三、项 ( Item ) 概念 四、项集 ( Item Set ) 概念 五、频繁项集 六、数据集、事物、项、项集

    2024年02月05日
    浏览(70)
  • 数据挖掘——关联规则(Association Rule)Apriori算法和python代码实现

    关联规则(Association Rules)是反映一个事物与其他事物之间的相互依存性和关联性,是数据挖掘的一个重要技术,用于从大量数据中挖掘出有价值的数据项之间的相关关系。 用一些例子来说明一下: 当我们在超市进行购物时,超市中有琳琅满目的商品,在每一次购物结束之后,

    2024年02月04日
    浏览(55)
  • 【数据挖掘与人工智能自然语言处理】自然语言处理和人工智能:如何利用自然语言处理技术进行数据挖掘

    作者:禅与计算机程序设计艺术 随着互联网和大数据时代的到来,数据挖掘已成为各个行业的热门话题。数据挖掘的核心在于发现数据中的有价值信息,而自然语言处理(NLP)技术是实现这一目标的重要手段。本文旨在通过自然语言处理技术进行数据挖掘,为数据挖掘提供一

    2024年02月05日
    浏览(102)
  • 【数据挖掘与人工智能可视化分析】可视化分析:如何通过可视化技术进行数据挖掘和发现

    作者:禅与计算机程序设计艺术 数据挖掘(Data Mining)和人工智能(Artificial Intelligence,AI)已经成为当今社会热点话题。这两者之间的结合也带来了很多挑战。作为数据科学家、机器学习工程师、深度学习研究员等,掌握了数据的获取、清洗、处理、建模、应用这些技术的前提下,

    2024年02月07日
    浏览(78)
  • 《数据挖掘基础》实验:Weka平台实现关联规则挖掘

    进一步理解关联规则算法(Apriori算法、FP-tree算法),利用weka实现数据集的挖掘处理,学会调整模型参数,读懂挖掘规则,解释规则的含义 (1)随机选取数据集为对象,完成以下内容:(用两种方法:Apriori算法、FP-tree算法) 文件导入与编辑; 参数设置说明; 结果截图;

    2024年02月02日
    浏览(58)
  • 数据挖掘 实验一、数据预处理

    一、 实验目的: (1) 熟悉 VC++编程工具和完全数据立方体构建、联机分析处理算法。 (2) 浏览拟被处理的的数据,发现各维属性可能的噪声、缺失值、不一致性等,针对存在的问题拟出采用的数据清理、数据变换、数据集成的具体算法。 (3) 用VC++编程工具编写程序,实

    2024年02月08日
    浏览(48)
  • 【手写数字识别】数据挖掘实验二

    用PyTorch实现MNIST手写数字识别(最新,非常详细) 图像识别 (Image Recognition)是指利用计算机对图像进行处理、分析和理解,以识别各种不同模式的目标和对象的技术。 图像识别的发展经历了三个阶段:文字识别、数字图像处理与识别、物体识别。机器学习领域一般将此类

    2024年02月07日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包