本文实现Apriori算法,数据库为abcdefi七个字母组成的10000条左右的数据,频繁一二项集用下三角矩阵存储,并一共只扫描一次数据库,(其实第一次扫描数据库后取出长度大于3的数据,供后期候选项集找频繁项集使用)。
我实现时是由于别人的要求,在找出候选三项集后遍历一次数据找出频繁三项集,在找出候选四项集后遍历一次数据找出频繁四项集...,其实可以找出所有的候选项集后再一次性找出所有频繁项集。
本人在实现是使用Mysql数据库,大家可以自己随机生成1000条数据,如果有需要我的数据,可以联系我~~
#include <iostream>
#include <time.h>
#include "winsock.h"
#include "mysql.h"
#include <atlstr.h>
#include "vector"
#include "string"
#include <iomanip>//不要忘记包含此头文件
using namespace std ;
int count = 0; //count 是数据量
#define SUPPORT 0.1
#define Confidence 0.63
double Soupport_Number; //支持度
int Candidate_itemsets_count = 3;
int Frequent_itemsets_count = 1;
vector<string> Database;//前一次的数据(初始为长度小于3)
vector<string> Database_Cut;//修剪后的数据
vector<string> All_Frequent_itemsets_ID; //所有频繁项集
vector<int> All_Frequent_itemsets_Int; //所有频繁项集频度
vector<string> Association_Rule_ID; //关联规则
vector<float> Association_Rule_Float; //关联规则置信度
vector<string> Candidate_Association_Rule_ID; //候选关联规则
vector<float> Candidate_Association_Rule_Float; //候选关联规则置信度
//第一步:固定矩阵(10*10)
int row_num = 10; //固定大小
int col_num = 10; //固定大小
//将数据库中每一条数据中的一项和二项累积存放在下三角
vector<vector<int>> matrix(row_num, vector<int>(col_num, 0)); //矩阵
vector<string> First_Frequent_itemsets_ID; //频繁一项集球员ID
vector<int> First_Frequent_itemsets_int; //频繁一项集频数
vector<string> Second_Frequent_itemsets_ID; //频繁二项集球员ID
vector<int> Second_Frequent_itemsets_int; //频繁二项集频数
vector<string> Other_Frequent_itemsets_ID; //其他频繁项集球员ID
vector<int> Other_Frequent_itemsets_int; //其他频繁项集频数
vector<string> Read_MySql_Data(vector<string> Database) ; //读取MySQL数据
vector<vector<int>> StorageData(string Set, vector<vector<int>> matrix);
void print_Matrix(vector<vector<int>> matrix); //打印一次下三角矩阵
bool StringA_IsOf_StringB(string database_string,string item_string); //判断字符串database_string是否包含item_string
void find_First_Frequent_itemsets(); //找出频繁一项集
void find_Second_Frequent_itemsets(); //找出频繁二项集
void pint_Candidate_itemsets(vector<string> Candidate_itemsets_ID,vector<int> Candidate_itemsets_int); //打印候选项集
void pint_Frequent_itemsets(vector<string> Frequent_itemsets_ID,vector<int> Frequent_itemsets_int); //打印频繁项集
void find_Candidate_Association_Rule_ID(vector<string> All_Frequent_itemsets_ID,vector<int> All_Frequent_itemsets_Int); //找出候选关联规则
void find_Association_Rule_ID(vector<string> Candidate_Association_Rule_ID,vector<float> Candidate_Association_Rule_Float); //找出关联规则
vector<string> find_Other_Candidate_itemsets(vector<string> Precede_Frequent_itemsets_ID); //找出候选项集(并成功剪枝)
void find_Other_Frequent_itemsets(vector<string> Other_Candidate_itemsets_ID); //扫描修剪后的数据库(向量),找出频繁项集
string Is_Or_Not_Candidate_itemset(vector<string> Precede_Frequent_itemsets_ID,string string1,string string2); //判断string1与string2自连接生成的项集是否是候选项集
void main ()
{
//
clock_t start,finish;
double totaltime;
start=clock();
Database = Read_MySql_Data(Database);
find_First_Frequent_itemsets(); //找出频繁一项集
find_Second_Fr