数据挖掘中关联规则中求频繁项集的aprior算法
来源:百度文库 编辑:神马文学网 时间:2024/04/27 16:45:46
2006-09-17 12:26
/********数据挖掘中关联规则求法的第一步:**/
/********求频繁项集的aprior算法******/
/********作者:xiaocui******/
/********时间:2006年9月15日***/
/********版本:v1.0*******/
#include
#include
#include
#include
#include
using namespace std;
const int SUPPORT=2;//最小支持度
//从各个事务的项集中得到数据库的所有单个项并对单项排序
vector unique_item(const vector > & vvchar )
{
vector cvec;
for(int i=0;i{
for(int j=0;j{
//找不到说明前面没有重复的单项
if(find(cvec.begin(),cvec.end(),vvchar[i][j])==cvec.end())
{
cvec.push_back(vvchar[i][j]);
}
}
}
sort(cvec.begin(),cvec.end());
return cvec;
}
//算出项集中每个项(包括单项)在总的事务集合中出现的次数(支持度)
vector count_itemcollection(const vector > & vvchar,
const vector > & transction)
{
vector ivec;
int count=0;
for(int i=0;i{
for(int j=0;j{
for(int k=0;k{
//如果一个项在当前事务中找不到,其它的项也就不用再在当前事务中找
//直接在下一个事务中找
if(find(transction[j].begin(),transction[j].end(),vvchar[i][k])==transction[j].end())
{
break;
}
}
//当前项集的所有项都在当前事务中出现,计数加1
if(k==vvchar[i].size())
{
count++;
}
}
ivec.push_back(count);
count=0;
}
return ivec;
}
//从剪枝后的候选项选出频繁项集
vector > choose_freq(vector > & candidate_cut,
const vector > & transaction)
{
vector > freq;
vector count=count_itemcollection(candidate_cut,transaction);
for(int i=0;i{
if(count[i]>=SUPPORT)
{
freq.push_back(candidate_cut[i]);
}
}
return freq;
}
//把前一代的频繁项集连接生成下一代的候选项集
vector > connect_freq(const vector > & freq1,
const vector > & freq2)
{
vector > candidate;
for(int i=0;i{
for(int j=0;j{
for(int k=0;k{
if(freq1[i][k]!=freq2[j][k])
{
break;
}
}
//第一个项集的前n-1位都等于第二个项集的前n-1位
if (k==freq1[i].size()-1)
{
//同时,第一个项集的最后一项小于第二个项集的最后一项
if(freq1[i][k]{
vector cvec;
//把第一个项集的全部项移入候选项
for(int m=0;m{
cvec.push_back(freq1[i][m]);
}
//把第二个项集的最后一个项移入候选项
cvec.push_back(freq2[j][freq2[j].size()-1]);
//把候选项加入候选项集中
candidate.push_back(cvec);
}
}
}
}
return candidate;
}
void main()
{
//从事务文件中把各个事务写到vvchar中
ifstream input=ifstream("transction.txt");
vector< vector > transaction;
if (input==0) //文件打开失败
{
cout<<"存放事务的文件transction不存在,请先手工建立"<}
else
{
while(input)
{
string str;
getline(input,str,'\n'); //得到一行事务项集
if(str!="")//最后有一空行,所以在此用if消除
{
vector cvec;
for(int i=0;i{
cvec.push_back(str[i]);
}
transaction.push_back(cvec);
}
}
}
//对各个事务项集进行排序
for(int i=0;i{
sort(transaction[i].begin(),transaction[i].end());
}
//取得各个单项并对单项排序
vector cvec =unique_item(transaction);
vector > >freq_results;//保存最后的频繁项集结果
vector< vector > candidate;//各个代的候选项集
//候选项集开始初始化为单项集合
for(int j=0;j{
vector cvec_tmp;
cvec_tmp.push_back(cvec[j]);
candidate.push_back(cvec_tmp);
}
//开始迭代求频繁项集,直到候选项集为空为止
while(candidate.size()>0)
{
vector > freq_tmp=choose_freq(candidate,transaction);
freq_results.push_back(freq_tmp);//这一代的频繁项集加入结果集合中
candidate=connect_freq(freq_tmp,freq_tmp);
}
//输出所有的频繁项集
for(int l=0;l{
cout<<"含"<for(int m=0;m{
for(int n=0;n{
cout<}
cout<}
}
}
/********数据挖掘中关联规则求法的第一步:**/
/********求频繁项集的aprior算法******/
/********作者:xiaocui******/
/********时间:2006年9月15日***/
/********版本:v1.0*******/
#include
#include
#include
#include
#include
using namespace std;
const int SUPPORT=2;//最小支持度
//从各个事务的项集中得到数据库的所有单个项并对单项排序
vector
{
vector
for(int i=0;i
for(int j=0;j
//找不到说明前面没有重复的单项
if(find(cvec.begin(),cvec.end(),vvchar[i][j])==cvec.end())
{
cvec.push_back(vvchar[i][j]);
}
}
}
sort(cvec.begin(),cvec.end());
return cvec;
}
//算出项集中每个项(包括单项)在总的事务集合中出现的次数(支持度)
vector
const vector
{
vector
int count=0;
for(int i=0;i
for(int j=0;j
for(int k=0;k
//如果一个项在当前事务中找不到,其它的项也就不用再在当前事务中找
//直接在下一个事务中找
if(find(transction[j].begin(),transction[j].end(),vvchar[i][k])==transction[j].end())
{
break;
}
}
//当前项集的所有项都在当前事务中出现,计数加1
if(k==vvchar[i].size())
{
count++;
}
}
ivec.push_back(count);
count=0;
}
return ivec;
}
//从剪枝后的候选项选出频繁项集
vector
const vector
{
vector
vector
for(int i=0;i
if(count[i]>=SUPPORT)
{
freq.push_back(candidate_cut[i]);
}
}
return freq;
}
//把前一代的频繁项集连接生成下一代的候选项集
vector
const vector
{
vector
for(int i=0;i
for(int j=0;j
for(int k=0;k
if(freq1[i][k]!=freq2[j][k])
{
break;
}
}
//第一个项集的前n-1位都等于第二个项集的前n-1位
if (k==freq1[i].size()-1)
{
//同时,第一个项集的最后一项小于第二个项集的最后一项
if(freq1[i][k]
vector
//把第一个项集的全部项移入候选项
for(int m=0;m
cvec.push_back(freq1[i][m]);
}
//把第二个项集的最后一个项移入候选项
cvec.push_back(freq2[j][freq2[j].size()-1]);
//把候选项加入候选项集中
candidate.push_back(cvec);
}
}
}
}
return candidate;
}
void main()
{
//从事务文件中把各个事务写到vvchar中
ifstream input=ifstream("transction.txt");
vector< vector
if (input==0) //文件打开失败
{
cout<<"存放事务的文件transction不存在,请先手工建立"<
else
{
while(input)
{
string str;
getline(input,str,'\n'); //得到一行事务项集
if(str!="")//最后有一空行,所以在此用if消除
{
vector
for(int i=0;i
cvec.push_back(str[i]);
}
transaction.push_back(cvec);
}
}
}
//对各个事务项集进行排序
for(int i=0;i
sort(transaction[i].begin(),transaction[i].end());
}
//取得各个单项并对单项排序
vector
vector
vector< vector
//候选项集开始初始化为单项集合
for(int j=0;j
vector
cvec_tmp.push_back(cvec[j]);
candidate.push_back(cvec_tmp);
}
//开始迭代求频繁项集,直到候选项集为空为止
while(candidate.size()>0)
{
vector
freq_results.push_back(freq_tmp);//这一代的频繁项集加入结果集合中
candidate=connect_freq(freq_tmp,freq_tmp);
}
//输出所有的频繁项集
for(int l=0;l
cout<<"含"<
for(int n=0;n
cout<
cout<
}
}
数据挖掘中关联规则中求频繁项集的aprior算法
数据挖掘中关联规则中求频繁项集的aprior算法
【转】关联规则数据挖掘的算法相关_土拨呼
【转】关联规则数据挖掘的算法相关_土拨呼
数据挖掘中分类算法小结
总述频繁模式、关联规则和相关规则的挖掘
数据挖掘中分类算法小结--Focus on BI
关联规则挖掘综述
数据挖掘中数据集资源的收集
十大数据挖掘算法
DMman(数据挖掘青年)--数据挖掘经典算法(转)
数据挖掘领域十大经典算法
数据挖掘十大经典算法 1
怒放的关联数据
Linux中定时器的实现算法
在Excel工作表中关联列表的创建
数据挖掘的数据集资源
数据挖掘的数据集资源
Informix 中求时间间隔的函数
恋爱中男人的“电话规则”
恋爱中男人的“电话规则”
恋爱中男人的“电话规则”
拆迁中博弈规则的思考
Microsoft 关联算法