資源簡介
本程序為K均值分類法的代碼實現,可運行.采用C++編寫;模式識別

代碼片段和文件信息
#include?
#include?
using?namespace?std;
#?include?
#?include
typedef?struct?code?
{
float?x1;//x1,x2,x3,x4分別為4個特征
float?x2;
float?x3;
float?x4;
}CodeCodes[150];//元素的結構體
typedef?struct?G_code?
{
int?G[150];//該類中的點
int?count?;//該類中的元素個數
}G_CodeG_Codes[3];
G_Codes?gg;//當前的三個分類
Code?Z[3];//三個類的中心
Code?Z_last[3];//前一次分類的三個類的中心
int?K_count?=?0?;//迭代次數
Codes?cc;//記錄文件中的點
?void?average(?int?G_i?);//求新的聚類中心,G_i表示第i個類
?void?K_Classify(?);//按新的聚類中心分類,用于遞歸
?void?Classify();//分類
?int?div(?int?n?);//將第n個點分類至G_I類,并返回G_I
?bool?test();//判斷Z[3]與Z_last[3]是否相同
void?main()
{
fstream?file;
int?i?=?0??j?=?0?;
file.open(“Iris.txt“ios::in);
if(file.fail())
{
cout<<“文件打開失敗!“< exit(0);
}
//從文件中讀出各點
file>>cc[j].x1>>cc[j].x2>>cc[j].x3>>cc[j].x4;
j++?;
while(!file.eof())
{
file>>cc[j].x1>>cc[j].x2>>cc[j].x3>>cc[j].x4;
j++?;
}
file.close();
Classify();//開始分類
cout<<“循環迭代次數為:“< cout< for(?j?=?0?;?j?3?;?j++?)
{
cout<<“第(“< cout<<“第(“< for(?i?=?0?;?i? {
cout< if(?(i+1)?%?13?==?0?)
cout< }
cout< cout< }
cin.get();
}
?void?Classify()//分類
?{
?int?i?;?
?int?ss[3]?=?{34445};
?for(?i?=?0?;?i3?;?i++??)//選三個點作為聚類中心初始值
?{
?Z_last[i]?=?cc[ss[i]]?;
?gg[i].count?=?0?;
?}
?K_Classify();
?}
?void?K_Classify(?)//按新的聚類中心分類,遞歸調用
?{
?int?i?;
?int?G_I;//該點所屬類別
?K_count++?;//迭代次數增加
?for(?i?=?0?;?i?150?;?i++?)
?{
?G_I?=?div(?i?);//將第i個點分類
?gg[G_I].G[gg[G_I].count]?=?i??;
?gg[G_I].count++?;
?}
?for(?i?=?0?;?i?3?;?i++?)
?average(i);
?if(?test()?==?1?)//若兩次聚類中心相同則返回
?return?;
?else//若兩次聚類中心不相同則記錄本次聚類中心,進行下一輪迭代
?{
?for(?i?=?0?;?i3?;?i++?)
?{
?Z_last[i]?=?Z[i]?;
?gg[i].count?=?0?;
?}
?K_Classify();
?}
?}
int?div(?int?n?)//將第n個點分類至G_I類,并返回G_I
{
?float?dis[3];//該點到個聚類中心的距離的平方
?int?G_I;//該點屬于G_I類
?int??i?=?0?;
?for(??i?=?0?;?i?3?;?i++?)
?dis[i]?=sqrt(?(Z_last[i].x1?-?cc[n].x1)*(Z_last[i].x1?-?cc[n].x1)+(Z_last[i].x2?-?cc[n].x2)*(Z_last[i].x2?-?cc[n].x2)+(Z_last[i].x3?-?cc[n].x3)*(Z_last[i].x3?-?cc[n].x3)+(Z_last[i].x4?-?cc[n].x4)*(Z_last[i].x4?-?cc[n].x4?));
?G_I?=?0?;
?for(?i?=?1?;?i?3?;?i++?)//選取dis的最小值
?if(?dis[G_I]?>?dis?[i])
?G_I?=?i?;
?return?G_I;
}
void?average(?int?G_i?)//求新的聚類中心,G_i表示第i個類
{
int?i?;?
Code?sum?;//坐標和
sum.x1?=?0.0?;
sum.x2?=?0.0?;
sum.x3?=?0.0?;
sum.x4?=?0.0?;
for(?i?=?0?;?i? {
sum.x1?+=?cc[gg[G_i].G[i]].x1?;
sum.x2?+=?cc[gg[G_i].G[i]].x2?;
sum.x3?+=?cc[gg[G_i].G[i]].x3?;
sum.x4?+=?cc[gg[G_i].G[i]].x4?;
}
Z[G_i].x1?=?sum.x1?/?(?float?)gg[G_i].count?;
Z[G_i].x2?=?sum.x2?/?(?float?)gg[G_i].count?;
Z[G_i].x3?=?sum.x3?/?(?float?)gg[G_
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????2548??2012-12-09?19:18??K_均值分類\Iris.txt
?????文件???????4328??2012-12-09?19:03??K_均值分類\K_均值分類.dsp
?????文件????????528??2012-12-09?18:52??K_均值分類\K_均值分類.dsw
?????文件??????50176??2013-10-22?21:05??K_均值分類\K_均值分類.ncb
?????文件??????53760??2013-10-22?21:05??K_均值分類\K_均值分類.opt
?????文件????????254??2013-10-22?21:05??K_均值分類\K_均值分類.plg
?????文件???????3886??2012-12-19?18:51??K_均值分類\mymain.cpp
?????目錄??????????0??2013-10-22?21:05??K_均值分類
-----------?---------??----------?-----??----
???????????????115480????????????????????8
- 上一篇:狄杰斯特拉算法
- 下一篇:基于C++的實時數據庫的設計與實現
評論
共有 條評論