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(); }