基于关联规则Apriori算法的事务数据挖掘论文.docx
- 文档编号:9249911
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:29
- 大小:74.18KB
基于关联规则Apriori算法的事务数据挖掘论文.docx
《基于关联规则Apriori算法的事务数据挖掘论文.docx》由会员分享,可在线阅读,更多相关《基于关联规则Apriori算法的事务数据挖掘论文.docx(29页珍藏版)》请在冰点文库上搜索。
基于关联规则Apriori算法的事务数据挖掘论文
《数据挖掘》课程作业
题目基于关联规则Apriori算法的事务数据挖掘
目录
一、引言2
二、正文2
1.背景2
2.算法思想2
3.数据集3
4.源代码3
5.算法流程16
6.运行结果……………………………………………………………………16
三、结论17
四、参考文献18
一、引言
随着网络、数据库技术的迅速发展以及数据库管理系统的广泛应用,人们积累的数据越来越多。
由此,数据挖掘技术应运而生。
数据挖掘(DataMining)就是从大量的、不完全的、有噪声的、模糊的、随机的实际应用数据中,提取隐含在其中的、人们事先不知道的、但又是潜在有用的信息和知识的过程。
它是一种新的商业信息处理技术,其主要特点是对商业数据库中的大量业务数据进行抽取、转换、分析和其他模型化处理,从中提取辅助商业决策的关键性数据。
简而言之,数据挖掘其实是一类深层次的数据分析方法。
从这个角度数据挖掘也可以描述为:
按企业制定的业务目标,对大量的企业数据进行探索和分析,揭示隐藏的、未知的或验证已知的规律性,并进一步将其模型化的先进有效的方法。
其中关联规则的算法的研究在数据挖掘算法的研究中占有相当重要的地位,关联规则算法的核心是Apriori算法,但随着对关联规则研究的深入,它的缺点也暴露出来了。
本文将对数据挖掘的一种经典算法Apriori算法对于事务项目数据的挖掘应用。
二、正文
1、背景
自1994年由Agrawal等人提出的关联规则挖掘Apriori的算法从其产生到现在,对关联规则挖掘方面的研究有着很大的影响。
Apriori算法是一种最有影响的挖掘布尔关联规则频繁项集的算法。
算法基于这样的事实:
算法使用频繁项集性质的先验知识。
Apriori使用一种称作逐层搜索的迭代方法,k-项集用于探索(k+1)-项集。
首先,找出频繁1-项集的集合。
该集合记作L1。
L1用于找频繁2-项集的集合L2,而L2用于找L3,如此下去,直到不能找到频繁k-项集。
找每个Lk 需要一次数据库扫描。
为提高频繁项集逐层产生的效率,一种称作Apriori性质的重要性质用于压缩搜索空间。
为了提高频繁项目集逐层产生的效率,Apriori算法利用了两个重要的性质用于压缩搜索空间:
(l)若X是频繁项集,则x的所有子集都是频繁项集。
(2)若x是非频繁项集,则X的所有超集都是非频繁项集。
2、算法思想
算法:
Apriori算法,使用逐层迭代找出频繁项集。
输入:
事务数据库D;最小支持度阈值min_sup。
输出:
D中的频繁项集L。
1)L1=find_frequent_1_itemsets(D);
2)for(k=2;Lk-1 ≠;k++){
3)Ck =aproiri_gen(Lk-1,min_sup);
4)foreachtransactiontD{//scanDforcount
5)Ct =subset(Ck,t);//getsubsetsoftthatarecandidates
6)foreachcandidatecCt
7)c.count++;
8)}
9)Lk={cCk |c.count≥min_sup}
10)}
11)returnL=∪kLk;
3、数据集
我用的的是一个事务数据集,数据集存在一个transaction数据库中,数据库中有三个表:
customer、tranDB、transactionDB,存有事务和项目的数据
Transactiondb:
tranDB:
Customer:
4、源代码
//AprioriView.cpp:
implementationoftheCAprioriViewclass
//
#include"stdafx.h"
#include"Apriori.h"
#include"time.h"
#include"AprioriSet.h"
#include"AprioriDoc.h"
#include"AprioriView.h"
#include"SetPara.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CAprioriView
IMPLEMENT_DYNCREATE(CAprioriView,CRecordView)
BEGIN_MESSAGE_MAP(CAprioriView,CRecordView)
//{{AFX_MSG_MAP(CAprioriView)
ON_BN_CLICKED(IDC_Bn_FreqItem,OnBnFreqItem)
ON_COMMAND(ID_Parameter,OnParameter)
//}}AFX_MSG_MAP
//Standardprintingcommands
ON_COMMAND(ID_FILE_PRINT,CRecordView:
:
OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT,CRecordView:
:
OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW,CRecordView:
:
OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CAprioriViewconstruction/destruction
CAprioriView:
:
CAprioriView()
:
CRecordView(CAprioriView:
:
IDD)
{
//{{AFX_DATA_INIT(CAprioriView)
m_pSet=NULL;
nAllFreqItem=0;
//}}AFX_DATA_INIT
//TODO:
addconstructioncodehere
}
CAprioriView:
:
~CAprioriView()
{
}
voidCAprioriView:
:
DoDataExchange(CDataExchange*pDX)
{
CRecordView:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAprioriView)
DDX_Control(pDX,IDC_List_FreqItem,m_List_FreqItem);
//}}AFX_DATA_MAP
}
BOOLCAprioriView:
:
PreCreateWindow(CREATESTRUCT&cs)
{
//TODO:
ModifytheWindowclassorstylesherebymodifying
//theCREATESTRUCTcs
returnCRecordView:
:
PreCreateWindow(cs);
}
voidCAprioriView:
:
OnInitialUpdate()
{
m_pSet=&GetDocument()->m_aprioriSet;
CRecordView:
:
OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
}
/////////////////////////////////////////////////////////////////////////////
//CAprioriViewprinting
BOOLCAprioriView:
:
OnPreparePrinting(CPrintInfo*pInfo)
{
//defaultpreparation
returnDoPreparePrinting(pInfo);
}
voidCAprioriView:
:
OnBeginPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)
{
//TODO:
addextrainitializationbeforeprinting
}
voidCAprioriView:
:
OnEndPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)
{
//TODO:
addcleanupafterprinting
}
/////////////////////////////////////////////////////////////////////////////
//CAprioriViewdiagnostics
#ifdef_DEBUG
voidCAprioriView:
:
AssertValid()const
{
CRecordView:
:
AssertValid();
}
voidCAprioriView:
:
Dump(CDumpContext&dc)const
{
CRecordView:
:
Dump(dc);
}
CAprioriDoc*CAprioriView:
:
GetDocument()//non-debugversionisinline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CAprioriDoc)));
return(CAprioriDoc*)m_pDocument;
}
#endif//_DEBUG
/////////////////////////////////////////////////////////////////////////////
//CAprioriViewdatabasesupport
CRecordset*CAprioriView:
:
OnGetRecordset()
{
returnm_pSet;
}
/////////////////////////////////////////////////////////////////////////////
//CAprioriViewmessagehandlers
voidCAprioriView:
:
OnBnFreqItem()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
intnFieldCount=m_pSet->GetODBCFieldCount();
intnDbCount;
CStringstrValue;
CStringstrIntToString="";
clock_tstart,stop,tick;
doubletimeused;
intnLargeCount=0;
intnListFreqItemCount=0;
start=clock();
ClearItem();
m_List_FreqItem.InsertColumn(0,"Item",LVCFMT_LEFT,100);
m_List_FreqItem.InsertColumn(1,"Count",LVCFMT_LEFT,100);
if(nItemCount<=0)
{
MessageBox("请先进行参数设置",NULL,MB_OK);
return;
}
FindLargeItem();
for(intk=1;LargeItemCount[k-1]!
=0;k++)
{
AprioriGen(k,1);
//初始化数组
for(intmm=0;mm { nCountCand[mm]=0; } m_pSet->MoveFirst(); nDbCount=0; while(! m_pSet->IsEOF()) { TransGenCand(k,nDbCount); //统计计数 for(intjj=0;jj for(intjj1=0;jj1 { if(TransGenCandFreq[jj].Find(CandLargeItem[k][jj1])! =-1) { nCountCand[jj1]++; break; } } nDbCount++; m_pSet->MoveNext(); } ShowFreqItem(k); } stop=clock(); tick=stop-start; timeused=(double)tick/CLK_TCK; strIntToString=""; strIntToString.Format("%s%f",strIntToString,timeused); MessageBox(strIntToString,NULL,MB_OK); } voidCAprioriView: : ClearItem() { //清除列表显示的内容 m_List_FreqItem.DeleteAllItems(); while(m_List_FreqItem.DeleteColumn(0)); UpdateWindow(); for(intkk=0;kk LargeItemCount[kk]=0; for(intkk1=0;kk1 for(intkk2=0;kk2 LargeItem[kk1][kk2]=""; } voidCAprioriView: : AprioriGen(intnCandFreqItem,intnMinSupp) { //由L(k-1)生成C(k) CStringstrTemp1,strTemp2,strRightTemp1,strRightTemp2; CStringstrTemp,strLeftTemp1,strLeftTemp2; intnstrTemp1,nstrTemp2; intnCandFreqItemCount=0; strTemp1=""; strTemp2=""; strRightTemp1=""; strRightTemp2=""; strTemp=""; strLeftTemp1=""; strLeftTemp2=""; nstrTemp1=0; nstrTemp2=0; nAllFreqItem=nAllFreqItem+LargeItemCount[nCandFreqItem-1]; for(inti1=0;i1 { //strTemp1=strCandFreqItem[i1]; strTemp1=LargeItem[nCandFreqItem-1][i1]; nstrTemp1=strTemp1.ReverseFind(','); strRightTemp1=strTemp1.Right(strTemp1.GetLength()-nstrTemp1-1); strLeftTemp1=strTemp1.Left(nstrTemp1); for(intj1=i1+1;j1 { //strTemp2=strCandFreqItem[j1]; strTemp2=LargeItem[nCandFreqItem-1][j1]; nstrTemp2=strTemp2.ReverseFind(','); strRightTemp2=strTemp2.Right(strTemp2.GetLength()-nstrTemp2-1); strLeftTemp2=strTemp2.Left(nstrTemp2); if((strLeftTemp1==strLeftTemp2)&&(strRightTemp1 { strTemp=strTemp1+','+strRightTemp2; if(Prune(nCandFreqItem,strTemp)) {CandLargeItem[nCandFreqItem][nCandFreqItemCount++]=strTemp; j1++; } else { j1++; } } else break; } } CandLargeItemCount[nCandFreqItem]=nCandFreqItemCount; } voidCAprioriView: : SubItemGen(intstrSubItemCount,CStringstrSubItem) {//对每个事务分解成单个项目 CStringstrTemp1; CStringstrTempSubItem[10]; CStringstrReverse; intnSubItemCount; intnstrRightTemp1; intnTempCount; strTemp1=strSubItem; nSubItemCount=0; while((nstrRightTemp1=strTemp1.ReverseFind(','))! =-1) { nTempCount=strTemp1.GetLength()-nstrRightTemp1-1; strTempSubItem[nSubItemCount++]=strTemp1.Right(nTempCount); strTemp1=strTemp1.Left(nstrRightTemp1); } strTempSubItem[nSubItemCount++]=strTemp1; for(inti2=0;i2 { strReverse=strTempSubItem[nSubItemCount-i2-1]; strTempSubItem[nSubItemCount-i2-1]=strTempSubItem[i2]; strTempSubItem[i2]=strReverse; } for(inti1=0;i1 { DbItem[strSubItemCount][i1]=strTempSubItem[i1]; } DbItemCount[strSubItemCount]=nSubItemCount; } voidCAprioriView: : FindLargeItem() { //显示1-频繁项目集 intnFieldCount=m_pSet->GetODBCFieldCount(); intnCount=0; intnFreqItem[100]; intnDbCount=0; CStringstrInit; CStringstrValue; CStringstrIntToString; //初始化候选项目集 for(intnInitCount=0;nInitCount { strInit=""; strInit.Format("%s%d",strInit,nInitCount+1); CandLargeItem[0][nInitCount]='I'+strInit; } //初始化数组 for(intii=0;ii nFreqItem[ii]=0; m_pSet->MoveFirst(); while(! m_pSet->IsEOF()) { for(intj=1;j m_pSet->GetFieldValue(j,strValue); SubItemGen(nDbCount++,strValue); for(inti=0;i if(strValue.Find(CandLargeItem[0][i])! =-1) nFreqItem[i]++; } m_pSet->MoveNext(); } nDbItemCount=nDbCount; for(inti1=0;i1 {strIntToString=""; if(double(nFreqItem[i1])/double(nDbItemCount)>=dItemSupp) { LargeItem[0][nCount]=CandLargeItem[0][i1]; m_List_FreqItem.InsertItem(nCount,strIntToString); m_List_FreqItem.SetItemText(nCount,0,LargeItem[0][nCount]); strIntToString=""; strIntToString.Format("%s%d",strIntToString,nFreqItem[i1]); m_List_FreqItem.SetItemText(nCount,1,strIntToString);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 关联 规则 Apriori 算法 事务 数据 挖掘 论文