實驗一
數據預處理
一、實驗目得
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]; } } ////////比較質心////...
推薦訪問: 河北 工業大學 數據挖掘在偉大祖國73華誕之際,我參加了單位組織的“光影鑄魂”主題黨日活動,集中觀看了抗美援朝題材影片《長津湖》,再一次重溫這段悲壯歷史,再一次深刻感悟偉大抗美援朝精神。1950年10月,新中國剛剛成立一年,
根據省局黨組《關于舉辦習近平談治國理政(第四卷)讀書班的通知》要求,我中心通過專題學習、專題研討以及交流分享等形式,系統的對《習近平談治國理政》(第四卷)進行了深入的學習與交流,下面我就來談一談我個人
《習近平談治國理政》(第四卷)是在百年變局和世紀疫情相互疊加的大背景下,對以習近平同志為核心的黨中央治國理政重大戰略部署、重大理論創造、重大思想引領的系統呈現。它生動記錄了新一代黨中央領導集體統籌兩個
《真抓實干做好新發展階段“三農工作”》是《習近平談治國理政》第四卷中的文章,這是習近平總書記在2020年12月28日中央農村工作會議上的集體學習時的講話。文章指出,我常講,領導干部要胸懷黨和國家工作大
在《習近平談治國理政》第四卷中,習近平總書記強調,江山就是人民,人民就是江山,打江山、守江山,守的是人民的心。從嘉興南湖中駛出的小小紅船,到世界上最大的執政黨,在中國共產黨的字典里,“人民”一詞從來都
黨的十八大以來,習近平總書記以馬克思主義戰略家的博大胸襟和深謀遠慮,在治國理政和推動全球治理中牢固樹立戰略意識,在不同場合多次圍繞戰略策略的重要性,戰略和策略的關系,提高戰略思維、堅定戰略自信、強化戰
《習近平談治國理政》第四卷集中展示了以習近平同志為核心的黨中央在百年變局和世紀疫情相互疊加背景下,如何更好地堅持和發展中國特色社會主義而進行的生動實踐與理論探索;對于新時代堅持和發展什么樣的中國特色社
在黨組織的關懷下,我有幸參加了區委組織部組織的入黨積極分子培訓班。為期一周的學習,學習形式多樣,課程內容豐富,各位專家的講解細致精彩,對于我加深對黨的創新理論的認識、對黨的歷史的深入了解、對中共黨員的
《習近平談治國理政》第四卷《共建網上美好精神家園》一文中指出:網絡玩命是新形勢下社會文明的重要內容,是建設網絡強國的重要領域。截至2021年12月,我國網民規模達10 32億,較2020年12月增長4
剛剛召開的中國共產黨第十九屆中央委員會第七次全體會議上討論并通過了黨的十九屆中央委員會向中國共產黨第二十次全國代表大會的報告、黨的十九屆中央紀律檢查委員會向中國共產黨第二十次全國代表大會的工作報告和《