gusucode.com > 一个相对很完善的数据挖掘系统源码程序 > 一个相对很完善的数据挖掘系统源码程序/Discover/AprioriDM.cpp

    // AprioriDM.cpp : implementation file
//

#include "stdafx.h"
#include "discover.h"
#include "MainFrm.h"
#include "AprioriDM.h"
#include "ColleDoc.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAprioriDM

IMPLEMENT_DYNCREATE(CAprioriDM, CFormView)

CAprioriDM::CAprioriDM()
	: CFormView(CAprioriDM::IDD)
{
	//{{AFX_DATA_INIT(CAprioriDM)
	m_Ce = 0.0f;
	m_Confidence = 0.0f;
	m_Lift = 0.0f;
	m_Support = 0.0f;
	//}}AFX_DATA_INIT
}

CAprioriDM::~CAprioriDM()
{
}

void CAprioriDM::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAprioriDM)
	DDX_Text(pDX, IDC_EDIT_CE, m_Ce);
	DDV_MinMaxFloat(pDX, m_Ce, 0.f, 1.f);
	DDX_Text(pDX, IDC_EDIT_CONFIDENCE, m_Confidence);
	DDV_MinMaxFloat(pDX, m_Confidence, 0.f, 1.f);
	DDX_Text(pDX, IDC_EDIT_LIFT, m_Lift);
	DDV_MinMaxFloat(pDX, m_Lift, 0.f, 10.f);
	DDX_Text(pDX, IDC_EDIT_SUPPORT, m_Support);
	DDV_MinMaxFloat(pDX, m_Support, 0.f, 1.f);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CAprioriDM, CFormView)
	//{{AFX_MSG_MAP(CAprioriDM)
	ON_BN_CLICKED(IDC_BTN_CACU, OnBtnCaculate)
	ON_BN_CLICKED(IDC_BTN_EXTEND, OnBtnExtend)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CAprioriDM diagnostics

#ifdef _DEBUG
void CAprioriDM::AssertValid() const
{
	CFormView::AssertValid();
}

void CAprioriDM::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CAprioriDM message handlers

void CAprioriDM::OnBtnCaculate() 
{
	UpdateData(true);
	CListBox* pApriorilistBox1 =(CListBox *)GetDlgItem(IDC_LIST1);
	CListBox* pApriorilistBox2 =(CListBox *)GetDlgItem(IDC_LIST2);
	CListBox* pApriorilistBox3 =(CListBox *)GetDlgItem(IDC_LIST3);
	
	POSITION DCPpos=AfxGetApp()->GetFirstDocTemplatePosition( ) ;//获得第一个文档模板位置
	CDocTemplate *pDCP=AfxGetApp()->GetNextDocTemplate(DCPpos ) ;//获得第一个文档模板的指针
	POSITION DOCpos=pDCP->GetFirstDocPosition( ) ;				 //获得第一个文档模板指向的第一个文档的位置
	CCollectDoc *m_pDoc=(CCollectDoc *)pDCP->GetNextDoc(DOCpos) ;//获得第一个文档模板指向的第一个文档的指针

	CAprioriStruct *pAprioriStruct=new CAprioriStruct;
	POSITION pos;
	char buffer[20];
	long nRecordCount;//记录个数
	long nSupportCount;//存放 记录个数*支持度后的数值
	theApp.m_pRecordset->get_RecordCount(&nRecordCount);
	CString strSupport,strConfidence,strCe,strLift;//支持度,可信度,期望可信度,作用度
	float fSupport,fConfidence,fCe,fLift;//支持度,可信度,期望可信度,作用度
	CString sAssociationRule;//关联规则文字,


	//GetDlgItemText(IDC_EDIT_SUPPORT,strSupport);
	//nSupportCount=(long)nRecordCount*atof(strSupport);
	nSupportCount=(long)nRecordCount*(m_Support);


		//将三个存放频繁项集的ListBox控件清空
		int nApriorilistBoxCount=pApriorilistBox1->GetCount(),i;
		for(i=0;i<nApriorilistBoxCount;i++)
			pApriorilistBox1->DeleteString(pApriorilistBox1->GetCount()-1);
		
		nApriorilistBoxCount=pApriorilistBox2->GetCount();
		for(i=0;i<nApriorilistBoxCount;i++)
			pApriorilistBox2->DeleteString(pApriorilistBox2->GetCount()-1);
		
		nApriorilistBoxCount=pApriorilistBox3->GetCount();
		for(i=0;i<nApriorilistBoxCount;i++)
			pApriorilistBox3->DeleteString(pApriorilistBox3->GetCount()-1);

		//将三个存放频繁项集的ListBox控件清空
		//将满足一定支持度support的频繁项集插入到ListBox中
		pos = m_pDoc->m_AprioristructList1.GetHeadPosition();
		while (pos != NULL)
		{
			pAprioriStruct=m_pDoc->m_AprioristructList1.GetNext(pos);
			if(pAprioriStruct->m_nFrequentItemCount>nSupportCount)
			pApriorilistBox1->AddString(pAprioriStruct->m_strFrequentItem+"->"+ltoa(pAprioriStruct->m_nFrequentItemCount,buffer,10));
		}
		
		pos = m_pDoc->m_AprioristructList2.GetHeadPosition();
		while (pos != NULL)
		{
			pAprioriStruct=m_pDoc->m_AprioristructList2.GetNext(pos);
			if(pAprioriStruct->m_nFrequentItemCount>nSupportCount)
			pApriorilistBox2->AddString(pAprioriStruct->m_strFrequentItem+"->"+ltoa(pAprioriStruct->m_nFrequentItemCount,buffer,10));
		}

		pos = m_pDoc->m_AprioristructList3.GetHeadPosition();
		while (pos != NULL)
		{
			pAprioriStruct=m_pDoc->m_AprioristructList3.GetNext(pos);
			if(pAprioriStruct->m_nFrequentItemCount>nSupportCount)
			pApriorilistBox3->AddString(pAprioriStruct->m_strFrequentItem+"->"+ltoa(pAprioriStruct->m_nFrequentItemCount,buffer,10));
		}

		CListCtrl* lc =(CListCtrl*)GetDlgItem(IDC_LIST_ASSO);
		int nCount = lc->GetHeaderCtrl()->GetItemCount();
		for (int it=0;it < nCount;it++)
		{
			lc->DeleteColumn(0);
  		}

		lc->InsertColumn(0,"Association Rule",LVCFMT_LEFT,90);
		lc->InsertColumn(1,"Support",LVCFMT_LEFT,90);
		lc->InsertColumn(2,"Confidence",LVCFMT_LEFT,90);
		lc->InsertColumn(3,"Ce",LVCFMT_LEFT,90);
 		lc->InsertColumn(4,"Lift",LVCFMT_LEFT,90);

		lc->DeleteAllItems();

		//int kk=(pApriorilistBox2->FindString( -1, "I2,I3" )) ;
		//int GetText( int nIndex, LPTSTR lpszBuffer ) const;

		CString ListBox1Item,ListBox2Item,ListBox3Item;//存放每个ListBox控件的某项
		CStringArray* AssoStringArray;//存放所有关联规则的字符串
		int AssoRuleCount;//基于三项集的规则个数(6)
		int ItemcountLeft,ItemcountRight;//关联规则左项(条件项)频繁项集的个数,关联规则右项(结果项)频繁项集的个数
		int nStrPosition1,nStrPosition2;//定位字符'-'的位置,定位字符'>'的位置(字符'-':频繁项集ListBox中频繁项集内容->频繁项集个数)
		nApriorilistBoxCount=pApriorilistBox3->GetCount();//频繁三项集listBox中的个数
		for(i=0;i<nApriorilistBoxCount;i++)
		{
			pApriorilistBox3->GetText(i,ListBox3Item);//对频繁三项集中的各个三项内容逐一处理
			nStrPosition1=ListBox3Item.Find("->",0);//定位字符'-'的位置
			nStrPosition2=nStrPosition1+1;//定位字符'>'的位置

			int TriCount=atoi(ListBox3Item.Right(ListBox3Item.GetLength()-nStrPosition2-1));//得到三项集的个数

			AssoStringArray=m_pDoc->GenAssoRuleStr(ListBox3Item.Left(nStrPosition1),',');//生成基于三项集的6种规则
			AssoRuleCount=AssoStringArray->GetSize();//返回值是6
			int ListBoxIndex=0;//List Box列表存入的有效的频繁项集的序号,防止填写度量值时错位
			for (int j=0;j<AssoRuleCount;j++)//循环处理6种关联规则,对ListBox中已经显示出来的频繁项集及其个数进行计算
			{
				sAssociationRule=AssoStringArray->GetAt(j);
				if ((sAssociationRule.Left (sAssociationRule.Find("=",0))).Find(',')>=0)
					//如果在关联规则左侧部件字符串中发现',',说明左侧部件为两项集,否则说明左侧部件为单项集
					//pApriorilistBox1中存放频繁单项集,pApriorilistBox2中存放频繁两项集
				{
					int xxxLeft=pApriorilistBox2->FindString(0,sAssociationRule.Left (sAssociationRule.Find("=",0)));
					pApriorilistBox2->GetText(xxxLeft,ListBox2Item);
					nStrPosition1=ListBox2Item.Find("->",0);//定位字符'-'的位置(字符'-':频繁项集ListBox中频繁项集内容->频繁项集个数)
					nStrPosition2=nStrPosition1+1;//定位字符'>'的位置(字符'>':频繁项集ListBox中频繁项集内容->频繁项集个数)
					ItemcountLeft=atoi(ListBox2Item.Right(ListBox2Item.GetLength()-nStrPosition2-1));//得到左侧两项集的个数
					
					int xxxRight=pApriorilistBox1->FindString(0,sAssociationRule.Right (sAssociationRule.GetLength()-sAssociationRule.Find(">",0)-1));
					pApriorilistBox1->GetText(xxxRight,ListBox1Item);
					nStrPosition1=ListBox1Item.Find("->",0);//定位字符'-'的位置
					nStrPosition2=nStrPosition1+1;//定位字符'>'的位置
					ItemcountRight=atoi(ListBox1Item.Right(ListBox1Item.GetLength()-nStrPosition2-1));//得到右侧单项集的个数
				}
				else//在关联规则左侧部件字符串中没有发现',',说明左侧部件为单项集
				{
					int xxxLeft=pApriorilistBox1->FindString(0,sAssociationRule.Left (sAssociationRule.Find("=",0)));
					pApriorilistBox1->GetText(xxxLeft,ListBox1Item);
					nStrPosition1=ListBox1Item.Find("->",0);//定位字符'-'的位置
					nStrPosition2=nStrPosition1+1;//定位字符'>'的位置
					ItemcountLeft=atoi(ListBox1Item.Right(ListBox1Item.GetLength()-nStrPosition2-1));//得到左侧单项集的个数
										
					int xxxRight=pApriorilistBox2->FindString(0,sAssociationRule.Right (sAssociationRule.GetLength()-sAssociationRule.Find(">",0)-1));
					pApriorilistBox2->GetText(xxxRight,ListBox2Item);
					nStrPosition1=ListBox2Item.Find("->",0);//定位字符'-'的位置
					nStrPosition2=nStrPosition1+1;//定位字符'>'的位置
					ItemcountRight=atoi(ListBox2Item.Right(ListBox2Item.GetLength()-nStrPosition2-1));//得到右侧两项集的个数
				}
				//float fSupport,fConfidence,fCe,fLift;//支持度,可信度,期望可信度,作用度
				fSupport=(float)TriCount/(float)nRecordCount;
				fConfidence=(float)TriCount/(float)ItemcountLeft;
				fCe=(float)ItemcountRight/(float)nRecordCount;
				fLift=fConfidence/fCe;

				if (fSupport>=m_Support && fConfidence>=m_Confidence && fCe>=m_Ce && fLift>=m_Lift )
					//如果满足各个度量值的要求
				{	
					strSupport=m_pDoc->FloatToString(fSupport, 3);
					strConfidence=m_pDoc->FloatToString(fConfidence, 3);
					strCe=m_pDoc->FloatToString(fCe, 3);
					strLift=m_pDoc->FloatToString(fLift,3);
					//插入到关联规则ListCtrl控件中
					lc->InsertItem(ListBoxIndex,sAssociationRule);//关联规则文字内容
					lc->SetItemText(ListBoxIndex,1,strSupport);//支持度
					lc->SetItemText(ListBoxIndex,2,strConfidence);//可信度
					lc->SetItemText(ListBoxIndex,3,strCe);//期望可信度
					lc->SetItemText(ListBoxIndex,4,strLift);//作用度
					ListBoxIndex++;
				}
			}
		}
}

void CAprioriDM::OnBtnExtend() 
{
	//CRect* pWinPos=new CRect;
	//GetClientRect( pWinPos );
	//MoveWindow(pWinPos->left,pWinPos->top,pWinPos->right,(pWinPos->bottom)-300);
	//SetWindowPos(this,pWinPos->left,pWinPos->top,pWinPos->right,(pWinPos->bottom)-100,SWP_NOMOVE   );
	CMainFrame* appMainWnd=(CMainFrame*)AfxGetMainWnd();//得到主框架指针
	int cyCur,cyMin ;
	appMainWnd->m_wndSplitter2.GetRowInfo(0,cyCur,cyMin);
	appMainWnd->m_wndSplitter2.GetRowInfo(1,cyCur,cyMin);

	appMainWnd->m_wndSplitter2.SetRowInfo(0,130, 0 );
	appMainWnd->m_wndSplitter2.SetRowInfo(1,900,0 );
	appMainWnd->m_wndSplitter2.RecalcLayout();
}