只能说用这个Apriori算法来练练容器的操作以及文件流的操作。这两个变得熟练了。
两个小测试数据集
第一组
测试数据第一组:
AA BB EE
BB DD
BB CC
AA BB DD
AA CC
BB CC
AA CC
AA BB CC EE
AA BB CC
频繁项集:
最大频繁项集
闭频繁项集
无闭频繁项集
第二组
测试数据第二组
AA BB CC
AA BB CC DD
BB CC EE
AA CC DD EE
DD EE
频繁项集
最大频繁项集
闭频繁项集
算法实现
apriori.h
#ifndef __APRIORI_H_
#define __APRIORI_H_
#include <iostream>
#include <cstdlib>
#include <map>
#include <set>
#include <fstream>
#include <string>
#include <vector>
#include <sstream>
#include <utility>
using namespace std;
class Apriori{
public:
Apriori(string dataFileName,float minSup){
this->dataFileName = dataFileName;
this->minSup = minSup;
}
/*Functions*/
public:
void printMapSet(map< set<string> ,int> &mapSet);
void printsetSet(set< set<string> > &);
void printSet(set<string> &);
int buildData();
map< set<string>, int> getTextDatabaseFre();
map< set<string>, int> getTextDatabaseSurpport();
map<string, int> getCandidate1ItemSet();
map< set<string>, int > findFrequent1Itemsets();
set< set<string> > aprioriGen(int m, set< set<string> > &);
bool has_infrequent_subset(set<string> &, set< set<string> > &);
map< set<string>, int > getFreqKItemSet(int k, set< set<string> > freqMItemSet);
set< set<string> > keySet(map< set<string>, int > &mapSet);
set<string> retainAll(set<string> set1, set<string> set2);
/*Functions*/
private:
void removeAll(set<string> &set1, set<string> &set2);
set<string> addAll(set<string> &set1, set<string> &set2);
/*Variables*/
private:
string dataFileName;
map<long, set<string> > textDatabase; //事务数据库
float minSup; //最小支持度,(使用绝对支持度)
long textDatabaseCount; //事务数据库中的事务数
map< set< set<string> >, int > freqItemSet; //候选项集集合
map< set< set<string> >, int > candidateItemSet; //频繁项集集合
};
#endif
apriori.cpp
#include "apriori.h"
void Apriori::printMapSet(map< set<string> ,int> &mapSet)
{
map< set<string>, int >::iterator it = mapSet.begin();
while(it != mapSet.end()){
set<string>::iterator itSet = it->first.begin();
cout << "#" << it->second << "\t";
cout << "[" ;
while(itSet != it->first.end()){
cout << *itSet << "," ;
++itSet;