数据挖掘 apriori算法

原创 2015年11月17日 22:09:49

这个算法是数据挖掘的经典算法,而且写起来并不麻烦,我是apriori的详解~

这个算法是我们数据结构老师让我们编的,事物集达到了88000多条,第一次验证xcode读txt还是蛮简单的哈哈哈哈哈哈哈哈~( ̄▽ ̄)~

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
using namespace std;

struct L   //频繁项集存储的结构体
{
    int itemm[100];  //每次求n项频繁项集时都会刷新一遍l,这个数组存放的是n项集里的每个项
    int itemm_num;  //存放n项集的n,有点麻烦了
}L[90000];

struct C  //候选项集存储结构体
//每次求n项候选项集时会刷新c
{
    int itemmm[100];  //每次求n项候选项集时,每个n项候选项存放在这里,编号从0到n-1
    int itemmm_num;
}C[90000];

struct RowFromTxt   //存放资料的结构题,一行用一个结构体存储,一行里的每个数据存在item的数组里
{
    int item[1000];
    int alldatafromtxt[17000]={0};  //为了查找方便特意安排一个数组,数字最大不超过17000,所以可以存放一行里每个数字出现过几遍
    int item_num;  //存放一行里几个数字
}RowFromTxt[90000];

double AllDataFromTxt[17000]={0};   //所有数字出现的频率,计算频繁一项集时会用
int RowNumTxt=0;  //资料里一共有多少行
double support;    //支持度,在程序里自定的,可以改,不要小于0.005~
//int c_num[100];

int change_row(char row_string[],int row_num)
{
    char row_end[]=" \n";
    char *new_row;
    new_row=strtok(row_string, row_end);
    int row_item_num=0;
    int item;
    while (new_row!=NULL) {
        row_item_num++;
        item=atoi(new_row);
        AllDataFromTxt[item]+=1.0000;
        RowFromTxt[row_num].item[row_item_num]=item;
        RowFromTxt[row_num].alldatafromtxt[item]++;
        new_row=strtok(NULL, row_end);
        if (new_row==NULL) {
            break;
        }
    }
    RowFromTxt[row_num].item_num=row_item_num;
    return 0;
}

int GetCnplus1(int Cplus1EachStructNum,int LTotalStructNum)   //得到n+1项的候选项集
{
    int i,j,m;
    cout<<"候选"<<Cplus1EachStructNum<<"项集为:"<<endl;
    int Cplus1TotalStructNum=0;
    for (i=1; i<=LTotalStructNum; i++) {   //和其他频繁项对比,如果前n-1项一样,则其他频繁项合起来存进新的候选项
        for (j=i+1; j<=LTotalStructNum; j++) {
            int flag=1;
            for (m=0; m<Cplus1EachStructNum-2; m++) {
                if (L[i].itemm[m]!=L[j].itemm[m]) {
                    flag=0;
                    break;
                }
            }
            if (flag==0) {
                continue;
            }
            if (flag==1) {        //合并两个n项频繁项,存进n+1的频繁项集
                Cplus1TotalStructNum++;
                C[Cplus1TotalStructNum].itemmm_num=Cplus1EachStructNum;
                for (m=0; m<Cplus1EachStructNum-1; m++) {
                    C[Cplus1TotalStructNum].itemmm[m]=L[i].itemm[m];
                }
                C[Cplus1TotalStructNum].itemmm[m]=L[j].itemm[m-1];
            }
        }
    }
    for (i=1; i<=Cplus1TotalStructNum; i++) {
        for (j=0; j<Cplus1EachStructNum; j++) {
            cout<<C[i].itemmm[j]<<" ";
        }
        cout<<"   ";
    }
    cout<<endl;
    cout<<"共"<<Cplus1TotalStructNum<<"项"<<endl;
    return Cplus1TotalStructNum;
}


int apriori(int ThisCRowTotalStructNum,int ThisCEveryRowDataNumber)   //高能!!!
{
    int i,j,m,n;
    int count=0;
    cout<<"频繁"<<C[1].itemmm_num<<"项集有:"<<endl;   //频繁n项集有……
    for (i=1; i<ThisCRowTotalStructNum; i++) {   //所有频繁候选n项集的总项数
        double show=0;                           //每一项里每个数字在资料里每一行出现的个数统计
        
        for (j=1; j<RowNumTxt; j++) {     //资料里总的行数,全局变量
            int flag=1;
            for (m=0; m<C[i].itemmm_num; m++) {    //一个n项集里每个数是否在资料里的第j行存在?
                if (RowFromTxt[j].alldatafromtxt[C[i].itemmm[m]]==0) {
                    flag=0;         //不存在退出
                    break;
                }
            }
            if (flag==1) {    //存在说明这一行可以统计,事物里有这个项
                show+=1.00;
            }
        }
        if (show/RowNumTxt>=support) {         //如果出现次数除以总的事物rownumtxt大于支持度,那就是频繁项啦~
            for (n=0; n<C[1].itemmm_num; n++) {
                cout<<C[i].itemmm[n]<<" ";   //输出看看~~
            }
            cout<<"    ";
            count++;
            for (m=0; m<C[i].itemmm_num; m++) {
                L[count].itemm[m]=C[i].itemmm[m];   //把这个候选项一个一个存进l
            }
        }
    }
    cout<<endl;
    cout<<"共"<<count<<"项"<<endl;
    
    if (count==1||count==0) {       //如果频繁项只有一个或没有的话,挖掘就结束了
        return 0;
    }
    
    int Cplus1TotalstructNum=GetCnplus1(C[1].itemmm_num+1, count);  //如果没有结束的话继续得到n+1项的候选项
    if(apriori(Cplus1TotalstructNum , C[1].itemmm_num+1)==0)  //计算n+1项的频繁项
        return 0;
    return 0;
}

int main(int argc, const char * argv[])
{
    freopen("/Users/gray/Documents/数据挖掘/数据挖掘课程资料大全/retail副本.txt", "r", stdin);  //打开并读取文件
    char row_string[1000];   //每行字符串
    while (gets(row_string)) {
        RowNumTxt++;
        change_row(row_string, RowNumTxt);
        memset(row_string, 0, sizeof(1000));
    }
    support=0.0113;      //定义支持度0.01
    int i,j;
    int l_num=1;       //开始计算频繁一项集
    for (i=0; i<17000; i++) {
        if (AllDataFromTxt[i]/RowNumTxt>=support) {   //alldatafromtxt在changerow函数里记录了每个数字出现的次数们可以直接用
            L[l_num].itemm[0]=i;   //讲频繁一项集存入l(其实可以直接存入c用作频繁二项集候选项)
            L[l_num].itemm_num=1;   //此l的频繁n项集,n为1
            l_num++;    //频繁1项集的总数
        }
    }
    cout<<"频繁1项集有:"<<endl;
    for (i=1; i<l_num; i++) {
        cout<<L[i].itemm[0]<<" ";
        cout<<AllDataFromTxt[L[i].itemm[0]]<<endl;
    }
    //cout<<endl;
    //c_num[1]=l_num-1;    //频繁候选2项集的
    int l2_num=1;   //统计频繁候选二项集,其实叫c2_num更合适
    for (i=1; i<l_num; i++) {       //得到频繁候选二项集,存入结构体
        for (j=i+1; j<l_num; j++) {
            C[l2_num].itemmm[0]=L[i].itemm[0];
            C[l2_num].itemmm[1]=L[j].itemm[0];
            C[l2_num].itemmm_num=2;
            l2_num++;
        }
    }
    //准备工作完成,开始各种候选
    apriori(l2_num, 2);  //输入频繁候选二项集的个数,和频繁候选二项集里每个项集的个数,就是2
    return 0;
}

事物都是数字,可以直接改字符型……

版权声明:本文为博主原创文章,未经博主允许不得转载。

数据挖掘第一课学习笔记(Apriori算法和FPTree算法)

首先明确关联规则挖掘中的几个概念定义: 假设有数据集表示几个客户买的东西如下: t1: 牛肉、鸡肉、牛奶 t2: 牛肉、奶酪 t3: 奶酪、靴子 t4: 牛肉、鸡肉、奶酪 t5: 牛肉、鸡肉、衣服、奶...
  • hahajinbu
  • hahajinbu
  • 2016年03月22日 15:40
  • 1821

数据挖掘算法之关联规则挖掘(一)apriori算法

关联规则挖掘算法在生活中的应用处处可见,几乎在各个电子商务网站上都可以看到其应用 举个简单的例子 如当当网,在你浏览一本书的时候,可以在页面中看到一些套餐推荐,本书+有关系的书1+有关系的书2+......
  • qq1010885678
  • qq1010885678
  • 2015年04月23日 22:55
  • 1762

数据挖掘十大算法翻译——4Apriori算法

1算法描述数据挖掘方法中最流行的方法之一就是从事务数据集中找到频繁的物品集合并且推到出关联规则。由于组合的复杂性,找到一个频繁的项集(拥有高于或者等于一个用户的特定最低需求的食物集合)并不是一件容易的...
  • u010293844
  • u010293844
  • 2015年11月25日 21:27
  • 529

数据挖掘 apriori算法的 php实现

在数据挖掘中, 关联规则挖掘是较为重要的处理。而apriori算法则是关联规则挖掘中最基本的一种算法。我将这次期考试中用c实现的apriori算法用php重写出来,希望php爱好者在做挖掘分析程序设计...
  • luowei1998
  • luowei1998
  • 2009年03月25日 22:45
  • 1311

数据挖掘十大算法之Apriori算法原理及源码实现

一、基本概念     频繁模式:指频繁地出现在数据集中的模式。例如,频繁地同时出现在交易数据集中的商品(如牛奶和面包)的集合就是频繁项集。     支持度:支持度的公式是support(A->B) =...
  • Olaking
  • Olaking
  • 2015年01月17日 21:31
  • 2737

数据挖掘 Apriori算法的Java代码实现

简单说明学院开了一门课《数据挖掘与机器学习》,要求我们计算机1、2两个班的全部同学选修这门课,包括课程实验。教材采用王振武、徐慧编著的《数据挖掘算法原理与实现》。教材里面提供的代码是C++代码,由于本...
  • sinat_33982461
  • sinat_33982461
  • 2016年09月06日 20:35
  • 641

数据挖掘十大算法--Apriori算法

一、Apriori 算法概述 Apriori 算法是一种最有影响力的挖掘布尔关联规则的频繁项集的 算法,它是由Rakesh Agrawal 和RamakrishnanSkrikant 提出的。它使用...
  • u011067360
  • u011067360
  • 2014年04月30日 20:32
  • 6270

数据挖掘之Apriori算法详解

关联规则挖掘(Association rule mining)是数据挖掘中最活跃的研究方法之一,可以用来发现事情之间的联系,最早是为了发现超市交易数据库中不同的商品之间的关系。(啤酒与尿布) 基本概...
  • oaimm
  • oaimm
  • 2015年10月28日 00:08
  • 2799

数据挖掘十大经典算法之Apriori算法以及Java实现

1.什么是Apriori算法?2.Apriori的具体实现 Apriori算法是一种发现频繁项集的基本算法,通过Apriori算法得出频繁项集,以此来产生强关联规则。  Apriori算法思想是:使用...
  • jizilong123
  • jizilong123
  • 2016年09月18日 23:19
  • 1620

数据挖掘中的模式发现(二)Apriori算法

基本概念对于A→BA\rightarrow B 支持度(support):P(A∩B)P(A ∩ B),既有A又有B的概率 置信度(Confidence Strength):conf(A→B)=sup...
  • u013007900
  • u013007900
  • 2017年01月27日 14:51
  • 1678
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据挖掘 apriori算法
举报原因:
原因补充:

(最多只允许输入30个字)