狠狠干影院/欧美午夜电影在线观看/高黄文/国产精品一区二区在线观看完整版

河北工業大學數據挖掘實驗報告

| 瀏覽次數:

 實驗一

 數據預處理

  一、實驗目得

  1、熟悉 VC++編程工具與完全數據立方體構建、聯機分析處理算法。

 2、瀏覽擬被處理得得數據,發現各維屬性可能得噪聲、缺失值、不一致性等,針對存在得問題擬出采用得數據清理、數據變換、數據集成得具體算法。

 3、用 VC++編程工具編寫程序,實現數據清理、數據變換、數據集成等功能。

 4、調試整個程序獲得清潔得、一致得、集成得數據,選擇適于全局優化 得參數。

 5、寫出實驗報告

 二、實驗原理

 1、 數據預處理現實世界中得數據庫極易受噪音數據、遺漏數據與不一致性數據得侵擾,為提高數據質量進而提高挖掘結果得質量,產生了大量數據預處理技術。數據預處理有多種方法:數據清理,數據集成,數據變換,數據歸約等。這些數據處理技 術在數據挖掘之前使用,大大提高了數據挖掘模式得質量,降低實際挖掘所需要 得時間。

 2、數據清理 數據清理例程通過填寫遺漏得值,平滑噪音數據,識別、刪除離群點,并解 決不一致來“清理”數據。

 3、數據集成 數據集成將數據由多個源合并成一致得數據存儲,如數據倉庫或數據立方 體。

 4、數據變換 通過平滑聚集,數據概化,規范化等方式將數據轉換成適用于數據挖掘得形式。

 5、數據歸約使用數據歸約可以得到數據集得壓縮表示,它小得多,但能產生同樣(或幾乎同樣得)分析結果。常用得數據歸約策略有數據聚集、維歸約、數據壓縮與數 字歸約等。

 三、實驗內容 與步驟

 1 、實驗內容

 1、用 VC++編程工具編寫程序,實現數據清理、數據變換、數據集成等功能,并在實驗報告中寫出主要得預處理過程與采用得方法。

 2、產生清潔得、一致得、集成得數據。

 3、在試驗報告中寫明各主要程序片段得功能與作用。

 2 、實驗步驟

  1)仔細研究與審查數據,找出應當包含在您分析中得屬性或維,發現數據 中得一些錯誤、不尋常得值、與某些事務記錄中得不一致性。

 2)進行數據清理,對遺漏值、噪音數據、不一致得數據進行處理。

 例如: 1、日期中得缺失值可以根據統一得流水號來確定。

 2、購買得數量不能為負值。

 3)進行數據集成與數據變換與數據歸約,將多個數據源中得數據集成起來, 減少或避免結果數據中得數據冗余或不一致性。并將數據轉換成適合挖掘得形 式。

 例如:

 1、進行完數據清理后發現購買數量、銷售價格、總額就是相互關聯得項可

 以 去掉總額。

 2、三個流水表日期得格式不一樣應統一成相同得日期格式。

 3、門號與 pos 機號碼一樣,可以去掉一個。

 4、附加:同一購物籃得商品序號應該就是順序遞增得。

 四 、 實驗結果 源程序: #include <iostream> #include <string> #include <fstream> #include <algorithm> using namespace std; class Sales { public:

 string serial;

 int market;

 int posno;

 string date;

 int sn;

 int id;

 float num;

 float price;

 float total;

 void print

 {

  cout<<serial<<" "<<market<<" "<<posno<<" "<<date<<" "<<sn<<" "

 <<id<<" "<<num<<" "<<price<<" "<<total<<endl;

 } }; int main {

 ofstream outfile("fl、txt",ifstream::app);

 if (!outfile)

 {

  cout<<"open error!"<<endl;

  exit(1);

 }

 char name[50];

 ifstream infile;

 cout<<"輸入要打開得 txt 文件名:1019、txt,1020、txt,1021、txt"<<endl;

 //int N=3;

 //for (int k=0;k<N;k++)

 //{

  //cout<<"輸入要打開得第"<<k+1<<"個文件名"<<endl;

 cin>>name;

  in(name,ios::in);//ifstream infile("1019、txt",ios::in);

  cin、clear;

  /*string contents;*/

  if (in)

  {

 cout<<"error open!"<<endl;

  }

  //ofstream outfile("fl、txt",ofstream::app);

  //ofstream outfile("fl、txt",ios::out);

  //if (!outfile)

  //{

 //cout<<"open error!"<<endl;

 //exit(1);

  //}

  Sales sal[13000];

  int sal_size=0;

  while (!in)

  {

 infile>>sal[sal_size] 、 serial>>sal[sal_size] 、 market>>sal[sal_size] 、posno>>sal[sal_size]、date>>

  sal[sal_size] 、 sn>>sal[sal_size] 、 id>>sal[sal_size] 、num>>sal[sal_size]、price>>sal[sal_size]、total;

 sal_size++;

  }

  cout<<"文檔"<<name<<"得長度就是:"<<sal_size<<endl;

  //char Tc;

  //Tc=getchar;

  //cout<<Tc<<endl;

  int I;

  for (int i=0; i<sal_size;i++)

  {

 //sal[i]、print;

 if (sal[i]、num<0)

 {

  sal[i]、num=sal[i]、num;

 }

 sal[i]、date、assign(sal[i]、serial,0,8);

 outfile<<sal[i] 、 serial<<"\t"<<sal[i] 、 market<<"\t"<<sal[i] 、date<<"\t"<<sal[i]、sn<<"\t"

  <<sal[i]、id<<"\t"<<sal[i]、num<<"\t"<<sal[i]、price<<endl;

 I=i;

  }

  cout<<"文檔 fl、txt 得長度就是:"<<sal_size<<"\t"<<I<<endl;

 char TTc;

  cin>>TTc;//TTc=getchar;

  cout<<TTc<<endl;

  in;

  //}

 out;

 return 0; } 運行結果:

 實驗二

 數據立方體與聯機分析處理構建

 一、實驗目得

 1、熟悉 VC++編程工具與基本數據立方體構建、聯機分析處理算法。

 2、建立一致得高質量得關系型數據庫。

 3、在建立得數據庫基礎上建立基本數據立方體。

 4、寫出實驗報告。

 二、實驗原理

 1、關系型數據庫

 關系數據庫,就是創建在關系模型基礎上得數據庫,借助于集合代數等數學概 念與方法來處理數據庫中得數據。關系模型由關系數據結構、關系操作集合、關 系完整性約束三部分組成。

 2、數據立方體

 一種多維數據模型,允許以多維對數據建模與觀察。它由維與事實定義。

 維就是一個單位想要得透視或實體。每個維可以有一個與人相關聯得表,稱為維表,它進一步描述維,如 item 維得維表包含屬性 Name、time、type 等。

 事實:多維數據模型圍繞諸如銷售這樣得主題組織,主題用事實表示, 事實就

 是數值度量得。

 3、OLAP 操作

 上卷:沿著一個維得概念分層向上攀升或通過維歸約在數據立方體上進行聚集。

 下鉆:上卷得逆操作,可能過沿維得概念分層向下或引入附加得維來實現。

 切片:在給定得數據立方體得一個維上進行選擇,導致一個子立方體。就就是數據立方體得某一層數據。

 切換:在兩個或多個維上選擇,定義子立方體。就就是數據立方體某一層 數據中得某一塊。

 4、數據倉庫得設計

 選取待建模得商務處理:都有哪些商務過程,如訂單、發票、發貨、庫 存、記賬管理、銷售或一般分類賬。

 選取商務處理得粒度:對于商務處理,該粒度就是基本得,在事實表中就是 數據得原子級,如單個事務、一天得快照等。

 選取用于每個事實表記錄得維:典型得維就是時間、商品、顧客、供應商、 倉庫、事務類型與狀態。

 選取將安放在每個事實表記錄中得度量:典型得度量就是可加得數值量, 如 dollars_sold 與 units_sold。

 三、實驗內容與步驟

 1 、實驗內容 (1)、用 VC++編程工具編寫程序,建立關系型數據存儲結構,建立數據立方體,并在實驗報告中寫出主要得過程與采用得方法。

 建立得數據立方體得維度為 3,分別就是商品大類、商店編號與時間。

 具體要求: 1、建立三個存儲表格(txt 文件)分別存儲 1019、1020、1021 得數據;

 2、每個 txt 文件橫向為商品大類(商品 ID 前五位)10010 油、 10020 面制品、10030 米與粉、10088 糧油類贈品;

 3、每個 txt 縱向為日期 1319 這一個星期表中存儲得值為總銷 售額。

 (2)、進行簡單得 OLAP 數據查詢

 具體要求: 能查出 2020 商店 10010 油類商品 13 日總得銷售額;

 能計算出 2020 商店 10030 米與粉總得銷售額;

 能查詢出指定商店指定種類商品得銷售額;(附加題)

 2 、實驗步驟

 (1)仔細研究與審查數據,找出應當包含在您分析中得屬性或維去掉不需要 得數據。

 (2)選擇合適得存儲結構,實現數據得存儲訪問,并實現相應得功能。

 (3)經過數據預處理后得數值已經補充了缺失值,并統一了格式。

 (4)讀取預處理數據得商品 ID、日期、計算出銷售額。

 四、實驗結果 源程序:

 #include<iostream> #include<string> #include<fstream> #include<algorithm> using namespace std; class Sales_n { public:

 string serial;

 int market;

 char date[10];

 int sn;

  int id;

 float num;

 float price; }; int main {

 char name1[50],name2[50];

 ifstream infile;

 cout<<"輸入實驗一中經過預處理得數據文件:fl、txt"<<endl;

 cin>>name1;

 in(name1,ios::in);

 /*string contents;*/

 if(in)

  cout << "error open!" << endl;

  cout<<"輸入實驗二要保存得存有數據立方體得文件名:cube3、txt"<<endl;

 cin>>name2;

 ofstream outfile;

 out(name2,ios::out);

 if(!outfile)

 {

  cout<<"open eror!"<<endl;

  exit(1);

 }

 Sales_n sal[10000];

 int sal_size=0;

 int i=sal_size;

 float total[3][10][5]={0};

 while(!in)

 {

  infile >> sal[sal_size]、serial >> sal[sal_size]、market >> sal[sal_size]、date>> sal[sal_size]、sn>> sal[sal_size]、id>> sal[sal_size]、num>> sal[sal_size]、price;

  cout<<"i: "<<i<<endl;

 for (int k=0;k<3;k++)

  //此 for 循環默認店號就是從 1019 連續增加得 3個整數

  {

 int Km=1019+k;

 //cout<<"Km: "<<Km<<endl;

 if (sal[i]、market==Km)

 {

  char p= sal[i]、date[7];

  if(sal[i]、id/100==10010 )

  {

 switch(p)

 {

 case "3":total[k][0][0]+=sal[i]、num*sal[i]、price;break;

 case "4":total[k][1][0]+=sal[i]、num*sal[i]、price;break;

 case "5":total[k][2][0]+=sal[i]、num*sal[i]、price;break;

 case "6":total[k][3][0]+=sal[i]、num*sal[i]、price;break;

 case "7":total[k][4][0]+=sal[i]、num*sal[i]、price;break;

 case "8":total[k][5][0]+=sal[i]、num*sal[i]、price;break;

 case "9":total[k][6][0]+=sal[i]、num*sal[i]、price;break;

 }

  }

  if(sal[i]、id/100==10020 )

  {

 switch(p)

 {

 case "3":total[k][0][1]+=sal[i]、num*sal[i]、price;break;

 case "4":total[k][1][1]+=sal[i]、num*sal[i]、price;break;

 case "5":total[k][2][1]+=sal[i]、num*sal[i]、price;break;

 case "6":total[k][3][1]+=sal[i]、num*sal[i]、price;break;

 case "7":total[k][4][1]+=sal[i]、num*sal[i]、price;break;

 case "8":total[k][5][1]+=sal[i]、num*sal[i]、price;break;

 case "9":total[k][6][1]+=sal[i]、num*sal[i]、price;break;

 }

  }

  if(sal[i]、id/100==10030)

  {

 switch(p)

 {

 case "3":total[k][0][2]+=sal[i]、num*sal[i]、price;break;

  case "4":total[k][1][2]+=sal[i]、num*sal[i]、price;break;

  case "5":total[k][2][2]+=sal[i]、num*sal[i]、price;break;

  case "6":total[k][3][2]+=sal[i]、num*sal[i]、price;break;

  case "7":total[k][4][2]+=sal[i]、num*sal[i]、price;break;

  case "8":total[k][5][2]+=sal[i]、num*sal[i]、price;break;

 case "9":total[k][6][2]+=sal[i]、num*sal[i]、price;break;

 }

  }

  else if(sal[i]、id/100==10088)

  {

 switch(p)

 {

 case "3":total[k][0][3]+=sal[i]、num*sal[i]、price;break;

  case "4":total[k][1][3]+=sal[i]、num*sal[i]、price;break;

  case "5":total[k][2][3]+=sal[i]、num*sal[i]、price;break;

  case "6":total[k][3][3]+=sal[i]、num*sal[i]、price;break;

  case "7":total[k][4][3]+=sal[i]、num*sal[i]、price;break;

  case "8":total[k][5][3]+=sal[i]、num*sal[i]、price;break;

  case "9":total[k][6][3]+=sal[i]、num*sal[i]、price;break;

 }

  }

 }

  }

  if (sal_size<5000)

  {

 sal_size++;

 i=sal_size;

  }

  else

  {

 sal_size=0;

 i=sal_size;

  }

  //cout<<"sal_size++="<<sal_size<<endl;

 }

 //sal、clear;//?????????????

 if (outfile)

 {

  for (int kk=0;kk<3;kk++)

  {

 cout<<"kk"<<kk<<endl;

 cout<<"銷售日期"<<"\t"<<"10010 油 "<<"10020 面制品 "<<"10030 米與粉 "<<"10088 糧油類贈品 "<<endl;

 int j = 20030413;//?????????

 for (int i=0;i<7;++i)

 {

  outfile<<" "<< total[kk][i][0]<<"\t"<<total[kk][i][1]<<"\t"<<total[kk][i][2]<<"\t"<<total[kk][i][3]<<"\t"<<endl;

 cout<<j<<" "<< total[kk][i][0]<<"\t"<<total[kk][i][1]<<"\t"<<total[kk][i][2]<<"\t"<<total[kk][i][3]<<"\t"<<endl;

  j++;

 }

  }

 }

 //else

 //cerr<<"無法打開文件!"<<endl;

 //ifstream infile2("cube2、txt",ios::in);

  //int m=0;

 //while(!in)

 //{

 //infile >> total[m][0] >> total[m][1] >>total[m][2]>>total[m][3];

 //m++;

 //}

 //if(in)

 //{

 //cout << "error open!" << endl;

 //}

 //float sum=0、0;

 //for(int i=0;i<7;++i)

 //{

 //sum+=total[i][2];

 //}

 //cout<<"2020 號商鋪 10010 油類商品 14 日銷售額為:"<<total[1][0]<<endl;

 //cout<<"2020 號商鋪 10030 米與粉類商品銷售總額為:"<<sum<<endl;

 in;//關閉文件

 out;//關閉文件

 system( "PAUSE "); } 運行結果:

  實 驗三

 應用 Apriori 算法挖掘頻繁項集 一、實驗目得

 (1)熟悉 VC++編程工具與 Apriori 頻繁項集挖掘算法。

 (2)根據管理層得需求,確定數據挖掘得任務,明確數據挖掘得功能,也 就就是明確要挖掘什么。

 (3)由確定得數據挖掘任務,從實驗一處理后得結果中,采用切塊或切片 等聯機分析處理技術,選擇出挖掘任務相關數據。

 (4)用 VC++編程工具編寫 Apriori 算法得程序,對任務相關數據運行 Apriori 算法,挖掘出所有得頻繁項集。

 (5)寫出實驗報告。

  二、實驗原理

 1、Apriori 算法 Apriori 使用一種稱作逐層搜索得迭代方法,k 項集用于探索(k+1)項集。

 首先,通過掃描數據庫,累計每個項得計數,并收集滿足最小支持度得項, 找出頻繁 1 項集得集合。該集合記作 L1。然后,L1 用于找頻繁 2 項集得集合 L2,L2 用于找 L3,如此下去,直到不能再找到頻繁 k 項集。找每個 Lk 需要一次 數據庫全掃描。

 2、提高頻繁項集逐層產生得效率 Apriori 性質:頻繁項集得所有非空子集也必須就是頻繁得。

 三、實驗內容與步驟

 1 、實驗內容

 在給定得數據中提取統一購物籃購買得商品信息,由這些數據構成事務數據 庫 D,挖掘其中得頻繁項集 L。

 挖掘頻繁項集得算法描述如下: Apriori 算法:使用逐層迭代找出頻繁項集 輸入:事務數據庫 D;最小支持度閾值。

 輸出:D 中得頻繁項集 L。

 (1) L1 = find_frequent_1itemsets(D); // 挖掘頻繁 1 項集,比較容易

 (2) for (k=2;Lk1 ≠Φ ;k++) {

 (3)

  Ck = apriori_gen(Lk1 ,min_sup); // 調用 apriori_gen 方法生成候選頻繁 k 項集分為兩步:合并、減枝

 (4)

 for each transaction t ∈ D {

 // 掃描事務數據庫 D

 (5)

 Ct = subset(Ck,t);

 (6)

 for each candidate c ∈ Ct

 (7)

  c、count++; //

  統計候選頻繁 k 項集得計數

 (8)

  }

 (9)

  Lk ={c ∈ Ck|c、count≥min_sup} // 滿足最小支持度得 k 項集即為頻 繁 k 項集

 (10) }

 (11) return L= ∪ k Lk; // 合并頻繁 k 項集(k>0) 算法在根據頻繁 k1 項集生成頻繁 K 項集過程中要計算頻繁 K 項集中每個 元素得支持度,并計算 K 項集中每個 k1 項子集就是否在 Fk1 中,上述兩條任何一 條不滿足,則刪去這個 K 項集中得元素 2 、實驗步驟

  (1)打開試驗用數據,讀取出同一流水號得商品 ID 并取前 5 位,生成以行為 單位生成事務數據集 transitions;

 (2)ind_frequent_1itemsets 生成頻繁一項集

 for(each transaction in transitions){

 for(each

 item

 in transaction){

  oneItemSet;

 oneItemSet、count++;//對 1 項集進行計數

  }

  }

  3、apriorigen (Lk1) 候選集產生算法

 For

 all itemset p∈Lk1

 do

 For

 all itemset q∈Lk1

 do

 If

 p、item1=q、item1, p、item2=q、item2, „,p、itemk2=q、itemk2,

 p、itemk1!=q、itemk1

  then

 begin c=p∞q//p、q 合并后任意得 Lk1 子集

 if has_infrequent_subset(c, Lk1)

 then delete c //存在 c 不屬于 Lk1 剪枝

  else add c to Ck

 End

 Return Ck

  4、has_infrequent_subset(c, Lk1)判斷候選集得元素

  For

 all (k1)subsets of

 c

 do

 If Not(S∈Lk1)

 THEN return TRUE;

 Return FALSE; 四 、 實驗結果 源程序: #include<iostream> #include<string> #include<fstream> #include<algorithm> using namespace std; class Sales_n { public: string serial; int market; 16 char date[10]; int sn; int id; float num; float price; }; int main { //////////打開并創建txt 文件////////////////////////////////// char name1[50],name2[50]; ifstream infile; cout<<"選擇要打開得文件:1019n、txt 1020n、txt 1021n、txt"<<endl; cin>>name1; in(name1,ios::in); /*string contents;*/ if(in) { cout << "error open!" << endl;

 } cout<<"要保存得文件名:"<<endl; cin>>name2; ofstream out); if(!outfile) { cout<<"open eror!"<<endl; exit(1); } ////////////////////// 訪 問 預 處 理 文 件///////////////////////////////////////////// Sales_n sal[10000]; int sal_size=0; int ser_size=0; int m = 0,n = 1; int new1[3400][20]={0}; //暫時儲存商品ID while(!in) { infile >> sal[sal_size]、serial >> sal[sal_size]、market >> sal[sal_size]、date>> sal[sal_size]、sn>> sal[sal_size]、id>> sal[sal_size]、num>> sal[sal_size]、price; sal_size++; } ///////////////取統一流水得商品 ID 前三位按升序無重復得保存起來///////////////////////// new1[0][0]=sal[0]、id/10000; for (int i =1;i<sal_size;i++) { if (sal[i]、serial==sal[i1]、serial) { new1[m][n]=sal[i]、id/10000; //////流水號相同 n++; //outfile<<sal[i]、id/100<<"\t"; } else { ///////排序////////// for(int k = 0;k<n;k++) { for(int j = 0;j < nk1;j++) { if(new1[m][j] > new1[m][j+1]) { int t = new1[m][j];

 new1[m][j] = new1[m][j+1]; new1[m][j+1] = t; } } } for(int l= 0;l< n;l++) { if(new1[m][l1]!=new1[m][l]) outfile<<new1[m][l]<<"\t"; } outfile<<endl; m++; n = 0; new1[m][n]=sal[i]、id/10000; n++; } } in;//關閉文件 out;//關閉文件 system( "PAUSE "); } Apriori 算法挖掘頻繁項集 support = 2

 #include <iostream> 18 #include <fstream> #include <string> #include <vector> #include <map> #include <cmath> #include <bitset> #include <algorithm> #include <iomanip> using namespace std; const int minsup=2; //設置最小支持度 map<string,int> items_count; //統計各個項集得數目 vector<string> mergeItem(vector<string> vect1,vector<string> vect2,int round); //合并生成新得候選 項集 int isExist(vector<string> item,vector<vector<string> >items); //判斷項集item 就是否已經存在候 選項集集合items 中,存在則返回 vector<string> mergeItem(vector<string> vect1,vector<string> vect2,int round) //判斷兩個項 集就是否可以合并(要求只有一項不同)成一個新得項集(做為候選集)

 { ////////////////////////////////////////////剪枝工作//// int count=0; //統計兩個vector 中相同得項得數目 vector<string> vect; map<string,int> tempMap; //輔助判斷兩個vector 中重復得項 for(vector<string>::size_type st=0;st<vect1、size;st++) { tempMap[vect1[st]]++; vect、push_back(vect1[st]); } for(int st=0;st<vect2、size;st++) { tempMap[vect2[st]]++; if(tempMap[vect2[st]]==2) //表示這兩項相同 { count++; } else { vect、push_back(vect2[st]); } } if((count+1)!=round) //要求兩個項目集只有一個項目不相同,其她都相同 { vect、clear; } return vect; 19 } int isExist(vector<string> item,vector<vector<string> >items) //判斷項集item 就是否已經存在候選項集集 合items 中,存在則返回 { int count; //統計相同得項得數目 if(!items、empty) { for(vector<vector<string> >::size_type ix=0;ix!=items、size;ix++) { count=0; for(vector<string>::size_type iy=0;iy!=items[ix]、size;iy++) { for(vector<string>::size_type iz=0;iz!=item、size;iz++) { if(item[iz]==items[ix]、at(iy))

 { count++; } } } if(count==item、size) //表示存在 { return 1; } } } return 0; } int main { vector<vector<string> > datavec; //原始數據項集 vector<vector<string> > candidatevec; //候選項集 vector<vector<string> > frequentvec; //頻繁項集 vector<map<string,int> > bitmap; //判斷某個項目在某一個事務中就是否存在,存在則值為1,反之 為0 long trancount=0; //原始事務總數 char name1[50]; ifstream file; cout<<"選擇要打開得文件:new1、txt new2、txt new3、txt"<<endl; cin>>name1; (name1,ios::in); //打開數據文件 if(!file) //檢查文件就是否打開成功 { cout<<"Fail to open data file!"<<endl; 20 return 1; } else { string temp; vector<string> item; //項集得臨時vector int begin,end; while(getline) //一行一行讀入數據 { trancount++; begin=0; temp、erase(0,temp、find_first_not_of("\r\t\n ")); //去除字符串首部得空格

 temp、erase(temp、find_last_not_of("\r\t\n")+1); while((end=temp、find("\t",begin))!=string::npos) //每一個事務中得項就是以"\t"為分隔符得 { item、push_back(temp、substr(begin,endbegin)); //將每一個項插入item 中 begin=end+1; } item、push_back(temp、substr(begin)); //一個事務中得最后一項 datavec、push_back(item); //將一個事務中得所有項當成一個整體插入另一個大得vector 中 item、clear; //清空item } cout<<"Press Enter to continue the processing"; //pause getchar; map<string,int> item_map; for(vector<vector<string> >::size_type ix=0;ix!=datavec、size;++ix) { for(vector<string>::size_type iy=0;iy!=datavec[ix]、size;++iy) { items_count[datavec[ix]、at(iy)]++; //該項集得計數加 item_map[datavec[ix]、at(iy)]=1; //表示該項目在該事務中存在,值為1,否則默認為0 } bitmap、push_back(item_map); item_map、clear; //這里一定要清空一下 } map<string,int>::const_iterator map_it=items_count、begin; cout<<"候選項集1:"<<endl; while(map_it!=items_count、end) //輸出候選1 項集 { cout<<"{"<<map_it>first<<"}"<<endl; map_it++; } cout<<"Press Enter to continue the processing"; //pause 21 getchar; map_it=items_count、begin; cout<<"頻繁1 項集(minsup=2):"<<endl; while(map_it!=items_count、end) //頻繁1 項集 { if(map_it>second>minsup) //支持度大于2 { cout、setf(ios::fixed);

 cout<<"{"<<map_it>first<<"}"<<" 支持度:"<<setprecision(6)<<map_it>second<<endl; item、push_back(map_it>first); frequentvec、push_back(item); //插入候選項集得vector 中 item、clear; } map_it++; } if(!frequentvec、empty) //判斷頻繁項集就是否為空,為空則退出 { cout<<"Press Enter to continue the processing"; //pause getchar; int round=1; //生成候選項集輪次 int found; //就是否包含有非頻繁得子集,為表示含有,有得話進行剪枝 string tempstr; vector<string> tempvec; do { //生成下一輪得候選項集 vector<vector<string> >::size_type st=frequentvec、size; candidatevec、clear; //清除上一輪得候選項集 for(vector<vector<string> >::size_type st1=0;st1<st;st1++) { for(vector<vector<string> >::size_type st2=st1+1;st2<st;st2++) { found=0; item=mergeItem(frequentvec[st1],frequentvec[st2],round); //調用函數合并生成 下一輪得候選項集 if(!item、empty&&!isExist(item,candidatevec)) //若經過判斷處理后返回得 vector 不為空且還不存在該項集,則作為候選項集加入候選vector 中 { ////////實現剪枝////////////////////////// string teststr; int testint; tempvec=item; sort(tempvec、begin,tempvec、end); while(next_permutation(tempvec、begin,tempvec、end)) //遍歷所有得組 22 合 { for(vector<string>::size_type tempst=0;tempst!=tempvec、size;tempst++) // 拼接出該字符串組合

 { tempstr+=tempvec[tempst]; } for(map<string,int>::const_iterator tempit=items_count、begin;tempit!=items_count、end;tempit++) { if(tempit>second<minsup) //非頻繁項集 { if(tempstr、find(tempit>first)!=string::npos) //表示包含有非 頻繁子項集 { found=1; teststr=tempit>first; testint=tempit>second; break; } } } tempstr、erase; if(found) //包含非頻繁子項集 { break; } } if(!found) //只有不包含有非頻繁子項集才加入候選項集中,否則剪枝 掉 candidatevec、push_back(item); found=0; //重置 } } } frequentvec、clear; //清除上一輪得頻繁項集 round++; cout<<"候選"<<round<<"項集:"<<endl; for(vector<vector<string> >::size_type ix=0;ix!=candidatevec、size;++ix) //輸出候選 項集 { 23 cout<<"{"; for(vector<string>::size_type iy=0;iy!=candidatevec[ix]、size;++iy) { cout<<candidatevec[ix]、at(iy)<<" "; }

 cout<<"}"<<endl; } if(candidatevec、empty) //候選項集為空 { cout<<"候選"<<round<<"項集為空!"<<endl; } int flag; //標記某個項集在某條事務中就是否出現,出現為1,不出現為0 int count; //統計某個想集在整個交易得事務集中出現得次數 string tempstr; //臨時string,用于串接各個項成一個字符串 int mark; //為避免執行多余得字符串串接工作 for(vector<vector<string> >::size_type sx=0;sx!=candidatevec、size;++sx) //構造下一 輪得頻繁項集 { mark=1; count=0; for(vector<map<string,int> >::size_type sy=0;sy!=bitmap、size;++sy) { flag=1; //初始化為1,表出現 for(vector<string>::size_type sz=0;sz!=candidatevec[sx]、size;++sz) { if(bitmap[sy][candidatevec[sx]、at(sz)]==0) //存在某一個子項不存在,則沒 出現項集 { flag=0; } if(mark==1) //只串接一次 { tempstr+=candidatevec[sx]、at(sz); //串接字符串 } } if(flag) //flag 仍然為,表示該項集在該條事務中出現了,計數加 { count++; } mark++; } if(count>minsup) //支持度大于2 24 { frequentvec、push_back(candidatevec[sx]); //插入頻繁項集 } items_count[tempstr]=count; //對應該項集得計數值

 sort(candidatevec[sx]、begin,candidatevec[sx]、end); //排序 string tempstr2; while(next_permutation(candidatevec[sx]、begin,candidatevec[sx]、end)) //取下一排 列組合 { for(vector<string>::size_type tempst=0;tempst!=candidatevec[sx]、size;tempst++) //拼接出該字符串組合 { tempstr2+=candidatevec[sx][tempst]; } items_count[tempstr2]=count; //對應該項集得計數值 tempstr2、erase; } tempstr、erase; } cout<<"Press Enter to continue the processing"; //pause getchar; if(!frequentvec、empty) //頻繁項集不為空 { cout<<"頻繁"<<round<<"項集(minsup=2):"<<endl; for(int sx=0;sx!=frequentvec、size;++sx) //輸出頻繁項集 { cout、setf(ios::fixed); cout<<"{"; for(vector<string>::size_type sz=0;sz!=frequentvec[sx]、size;++sz) { cout<<frequentvec[sx]、at(sz)<<" "; tempstr+=frequentvec[sx]、at(sz); //串接字符串 } cout<<"}"; cout<<endl; tempstr、erase; } cout<<"Press Enter to continue the processing"; //pause getchar; } else { cout<<"沒有"<<round<<"頻繁項集,Apriori 算法結束!"<<endl; 25 } }

 while(!frequentvec、empty); //頻繁項集不為空,則循環繼續 ; return 0; } else { return 0; } //end of if(!frequentvec、empty) }//end of if(!file) } 運行結果:

  實驗四

 貝葉斯決策分類算法

 一、實驗目得

 (1)熟悉 VC++編程工具與樸素貝葉斯決策算法。

 (2)對 AllElectronics 顧客數據庫查詢得到先驗概率與類條件概率。

 (3)在樣本集上用 VC++編程工具編寫用樸素貝葉斯算法分類得程序,對任 務相關數據運行樸素貝葉斯分類算法,調試實驗。

 (4)寫出實驗報告。

 二、實驗原理

 1 、先驗概率與類條件概率

 先驗概率:先驗概率定義為訓練樣本集中屬于 Ci 類得樣本(元組)數 Ni 與 總樣本數 N 之比,記為 P (Ci) =N i /N 。

 類條件概率:類條件概率定義為訓練樣本集中屬于 Ci 類中得具有特征 X 得 樣本(元組)得個數 ni 與屬于 Ci 類得樣本(元組)數 Ni 之比,記為 P (X|Ci) = ni / Ni 2 、貝葉斯決策

 貝葉斯決策(分類)法將樣本(元組)分到 Ci 類,當且僅當

 P (X|Ci) P (Ci)> P (X|Cj) P (Cj),對 1≤j≤m,j≠i

 其中,訓練樣本集中得樣本(元組)可被分為 m 類。

 三、實驗內容與步驟

 1 、實驗內容

 用貝葉斯分類器對已知得特征向量 X 分類:

 1) 由 AllElectronics 顧客數據庫類標記得訓練樣本集(元組)編程計算先驗 概率 P(Ci)與類條件概率 P(X|Ci),并在實驗報告中指出關鍵代碼得功能與實現方 法;

 2) 應用貝葉斯分類法編程對特征向量 X 分類,并在實驗報告中指出關鍵程 序片段得功能與實現方法;

 3) 用檢驗樣本估計分類錯誤率;

 4) 在實驗報告中畫出程序或例程得程序框圖。

 2 、實驗步驟

 由于該分類問題就是決定顧客就是否傾向于購買計算機,即 C1 對應于 buys_puter=yes,C2 對應于 buys_puter=no,就是兩類得分類問題。實驗 步驟如下:

 1) 確定特征屬性及劃分:瀏覽所給得數據庫,找出劃分得特征屬性;

 2) 獲取訓練樣本:即給定得 AllElectronics 顧客數據庫類標記得訓練樣本集 (元組);

 3) 計算訓練樣本中每個類別得先驗概率:P(Ci),i=1,2;

 4) 計算訓練樣本中類條件概率:設特征(屬性)向量為 X,編程計算類條 件概率 P(X|Ci),i=1,2;

 5) 使用分類器進行分類; 四、實驗結果 源程序: #include<iostream> #include<string> #include<fstream> #include<algorithm> using namespacestd;

 ////////////////////定義存儲結構//////////////////////////////

 classDate

 {

 public:

 string age;

 string ine;

 string student;

 string credit;

 string buy;

 voidprint

 {

  cout << age<< " "<< ine << " "<< student << " "<< credit << " "<<buy<<endl;

 }

 };

 intmain

 {

 //////////////////////////讀取數據并保存////////////////////////

 charname1[50];

 ifstream infile;

 29 cout<<"輸入要打開得文件:*、txt"<<endl;

 cin>>name1;

 in(name1,ios::in);

 if(in)

 {

  cout << "error open!"<< endl;

 }

 Date date[100];

 intdatesize=0;

 string iage, iine,istudent,icredit,ibuy;

 //輸入得條件 inty = 0,n = 0,agey = 0,agen = 0;

 intiney = 0,inen =0,studenty = 0,studentn = 0,credity = 0,creditn = 0;

 //統計出現得 次數 floatp1,p2,p3,p4,p5,p6,p7,p8,p9,p10,px1,px2,px3,px4;

 //條件概率與類條件概率 while(!in)

 {

  infile >> date[datesize]、age >> date[datesize]、ine >> date[datesize]、student>> date[datesize]、credit>> date[datesize]、buy;

 datesize++;

 }

 cout<<"the date are:"<<endl;

 cout << "age "<<"ine "<<"student "<<"credit "<<"buy "<<endl;

 for(inti=0;i<datesize;i++)

 //輸出要處理得數據 {

  date[i]、print;

  }

 ////////////////////////////條件概率///////////////////////////

 for(intj = 0;j<datesize;j++)

 {

 if(date[j]、buy=="yes")

 {

  y++;

 }

 else if(date[j]、buy=="no")

 {

  n++;

 }

 }

 p1 = (float)y/(float)datesize;

 p2 = (float)n/(float)datesize;

 cout<<"P(buys_puter = yes) = "<<y<<"/"<<datesize<<"="<<p1<<endl;

 cout<<"P(buys_puter = no) = "<<n<<"/"<<datesize<<"="<<p2<<endl;

 ///////////////////類條件概率////////////////////////////

 30 cout<<"age:"<<endl;

 cin>>iage;

 cout<<"ine:"<<endl;

 cin>>iine;

 cout<<"student:"<<endl;

 cin>>istudent;

 cout<<"credit:"<<endl;

 cin>>icredit;

 for(intk = 0;k<datesize;k++)

 {

 if(date[k]、age==iage&&date[k]、buy=="yes")

 {

 agey++;

 }

 if(date[k]、age==iage&&date[k]、buy=="no")

 {

 agen++;

 }

 if(date[k]、ine==iine&&date[k]、buy=="yes")

 {

 iney++;

 }

 if(date[k]、ine==iine&&date[k]、buy=="no")

 {

 inen++;

 }

 if(date[k]、student==istudent&&date[k]、buy=="yes")

 {

 studenty++;

 }

 if(date[k]、student==istudent&&date[k]、buy=="no")

 {

 studentn++;

 }

 if(date[k]、credit==icredit&&date[k]、buy=="yes")

 {

 credity++;

 }

 if(date[k]、credit==icredit&&date[k]、buy=="yes")

 {

 creditn++;

 }

  }

 p3=(float)agey/(float)y;

 31 p4=(float)agen/(float)n;

 p5=(float)iney/(float)y;

 p6=(float)inen/(float)n;

 p7=(float)studenty/(float)y;

 p8=(float)studentn/(float)n;

 p9=(float)credity/(float)y;

 p10=(float)creditn/(float)n;

 px1=p3*p5*p7*p9;

 px2=p4*p6*p8*p10;

 px3=px1*p1;

 px4=px2*p2;

 cout<<"P(age = "<<iage<<"|buy = yes = "<<agey<<"/"<<y<<"="<<p3<<endl;

 cout<<"P(age = "<<iage<<"|buy = no = "<<agen<<"/"<<n<<"="<<p4<<endl;

 cout<<"P(ine = "<<iine<<"|buy = yes = "<<iney<<"/"<<y<<"="<<p5<<endl;

 cout<<"P(ine = "<<iine<<"|buy = no = "<<inen<<"/"<<n<<"="<<p6<<endl;

 cout<<"P(student = "<<istudent<<"|buy = yes = "<<studenty<<"/"<<y<<"="<<p7<<endl;

 cout<<"P(student = "<<istudent<<"|buy = no = "<<studentn<<"/"<<n<<"="<<p8<<endl;

 cout<<"P(credit = "<<icredit<<"|buy = yes = "<<credity<<"/"<<y<<"="<<p9<<endl;

 cout<<"P(ctedit = "<<icredit<<"|buy = no = "<<creditn<<"/"<<n<<"="<<p10<<endl;

 cout<<"P(X|buy = yes) = "<<px1<<endl;

 cout<<"P(X|buy = no) = "<<px2<<endl;

 cout<<"P(X|buy = yes)P(buy = yes) = "<<px3<<endl;

 cout<<"P(X|buy = no)P(buy = no) = "<<px4<<endl;

 ////////////////預測/////////////////////////////////////

 if(px3>px4)

 {

 cout<<"樸素貝葉斯預測 buy = yes"<<endl;

 }

 else cout<<"樸素貝葉斯預測 buy =no"<<endl;

 in;//關閉文件 system( "PAUSE ");

 } 運行結果:

  實驗五

 k k 均值聚類算法

 一、實驗目得

 (1) 熟悉 VC++編程工具與 k 均值聚類算法。

 (2) 在訓練樣本集上用 VC++編程工具編寫用于 k 均值聚類得程序,對任務

 相關數據運行 k 均值聚類算法,調試實驗。

 (3) 掌握距離計算方法與聚類得評價準則。

 (4) 寫出實驗報告。

 二、實驗原理

 1 1 、k k 均值聚類

 k 均值聚類就是一種基于形心得劃分技術,具體迭代得計算步驟如下: 1) 在屬性向量空間隨機產生 k 個形心坐標。

 2) 分別計算數據集 D 中得每個數據對象 Ti (1≤i≤n)到所有 k 個形心得距離度 量 Dist(i,j) (1≤i≤n, 1≤j≤k),并將數據對象 Ti 聚到最小距離度量得那一簇中。即 Ti∈CJ,表示數據對象 Ti 被聚到第 J 簇中。其中 J=argmin(Dist(i,j)),表示 J 為可 使得 Dist(i,j)取最小值得那個 j。

 3) 按照形心得定義計算每一簇得形心坐標,形成下一代得 k 個形心坐標。

 4) 如果不滿足終結條件,轉到 2)繼續迭代;否則結束。

 其中,簇得形心可以有不同得得定義,例如可以就是簇內數據對象屬性向量得 均值(也就就是重心),也可以就是中心點等;距離度量也可以有不同得定義,常用 得有歐氏距離、曼哈頓(或城市塊、街區)距離、閔可夫斯基距離等;終結條件 可采用當對象得重新分配不再發生時,程序迭代結束。

 2 2 、終止條件

 終止條件可以就是以下任何一個:

 1)沒有(或最小數目)對象被重新分配給不同得聚類。

 2)沒有(或最小數目)聚類中心再發生變化。

 3)誤差平方與局部最小。

 三、實驗內容與步驟

 1 1 、實驗內容

 1) 根據 k 均值聚類算法得計算步驟,畫出 k=3 時得程序流程圖;

 2) 由 k 均值程序流程圖編程實現 k 均值聚類算法;

 3) 在實驗報告中顯示 k 均值聚類過程得一系列截圖,指明各個簇得逐漸演 化過程;

 4) 在報告中指出實驗代碼中得初始質心得選擇,終止條件得選擇,以及距 離度量得選擇并予以說明

 2 2 、實驗步驟

 編程實現如下功能:

 1) 首先將數據集 D={D1,D2,D3}中得屬性向量作為實驗數據輸入;

 2) 由 k 均值程序流程圖編程實現 k 均值聚類算法,并用實驗數據運行; 3) 運行過程中在適當得迭代代數暫停并顯示實時迭代得結果,如簇心得位 置、按距離最近鄰聚類得結果等; 四 、 實驗結果

 源程序: :

 #include<iostream> #include<string> #include<fstream> #include<algorithm> #include <math、h> using namespace std; #define k 3 //聚類數 #define n 2 //數據維數

 #define size 30 //數據大小 ////////////////////定義存儲結構////////////////////////////// typedef struct { double d[n]; double distance[k]; }Data; typedef struct { Data center[k]; // 即簇類中心 int cluster[k][size]; //簇數組 int cluster_num[k];// 簇類中一組數據得編號 Data old_center[k]; int isend[k][n]; //各簇類中心就是否相等標示值 int is; }Tdata; ////////聲明函數////////////////////////////// void input_data; void Init_center; void calculate_distance; double Euclid(int x, int y); void new_cluster; void new_center; void output_info; void p; Data data[size]; Tdata td; ///////////////讀入數據//////////////////////// void Init { char name1[50]; ifstream infile; cout<<"輸入要打開得文件:*、txt"<<endl; cin>>name1; in(name1,ios::in); if(in) { cout << "error open!" << endl; } for(int i = 0;i < size;i++) for(int j = 0;j<n;j++) { infile>>data[i]、d[j]; } cout<<"the data are:"<<endl; for(int i=0;i<size;i++) { //輸出要處理得數據

 for(int j = 0;j<n;j++) { cout<<data[i]、d[j]<<" "; } cout<<endl; } in;//關閉文件 } //////////////初始化質心////////////////////////////// void Init_center { for(int i = 0;i<k;i++){ cout<<"初始質心"<<i+1<<":"<<endl; for(int j = 0;j<n;j++) { td、center[i]、d[j] = data[i]、d[j]; cout<<td、center[i]、d[j]<<" "; } cout<<endl; } } ///////計算數據到K 個質心得歐幾里德距離////////// void calculate_distance { int i, j; for(i = 0; i < size; i++) for(j = 0; j < k; j++){ data[i]、distance[j] = Euclid(i, j); //i 表示第幾個數組j 表示距離第幾個質心 } } //////////計算一組數組到質心得歐幾里得距離////////////// double Euclid(int x, int y) { double distance = 0; for(int i = 0; i < n; i++){ distance += pow((data[x]、d[i]

 td、center[y]、d[i]), 2); } distance = sqrt(distance); return distance; } //////////將數據進行簇歸類/////////////////// void new_cluster { int i, j;

 double min; for(i = 0; i < k; i++) //初始化編號 td、cluster_num[i] = 0; for(i = 0; i < size; i++){ int index = 0; //找出最小得歐幾里德距離編號 min = data[i]、distance[0]; for(j = 1; j < k; j++){ // 篩選到簇心歐幾里德最小得值 if(data[i]、distance[j] < min){ min = data[i]、distance[j]; index = j; } } //劃分簇集 td、cluster[index][td、cluster_num[index]++] = i; } } ///////////更新質心/////////////////////////////// void new_center { int i, j, m; double sum; for(i = 0; i < k; i++) for(j = 0; j < n; j++){ sum = 0; td、old_center[i]、d[j] = td、center[i]、d[j]; for(m = 0; m < td、cluster_num[i]; m++){ // 第i 個簇得第j 維數得所有數據與 sum += data[td、cluster[i][m]]、d[j]; } // 取平均數得到新得簇中心 td、center[i]、d[j] = sum / td、cluster_num[i]; } } ////////比較質心////...

推薦訪問: 河北 工業大學 數據挖掘

【河北工業大學數據挖掘實驗報告】相關推薦

工作總結最新推薦

NEW