資源簡介
本工程文件實現了K-means算法,對輸入的樣本數據實現了聚類分析,其中測試的樣本數據在工程文件下的K-means文件夾下

代碼片段和文件信息
#include?“StdAfx.h“
#include????//輸入輸出流
#include?????//字符串流
#include?????//文件流
#include?????//向量
#include?
#include?
#include?
#define?k?5//簇的數目
using?namespace?std;
//存放元組的屬性信息
typedef?vector?Tuple;//存儲每條數據記錄
int?dataNum;//數據集中數據記錄數目
int?dimNum;//每條記錄的維數
//計算兩個元組間的歐幾里得距離
double?getDistXY(const?Tuple&?t1?const?Tuple&?t2)?
{
double?sum?=?0;
for(int?i=1;?i<=dimNum;?++i)
{
sum?+=?(t1[i]-t2[i])?*?(t1[i]-t2[i]);
}
return?sqrt(sum);
}
//根據質心,決定當前元組屬于哪個簇
int?clusterOfTuple(Tuple?means[]const?Tuple&?tuple){
double?dist=getDistXY(means[0]tuple);????//元組與第0簇的距離
double?tmp;
int?label=0;//標示屬于哪一個簇
for(int?i=1;i tmp=getDistXY(means[i]tuple);???????//元組與第1簇的距離
if(tmp }
return?label;
}
//獲得給定簇集的平方誤差
double?getVar(vector?clusters[]Tuple?means[]){???//給定簇,給定質心
double?var?=?0;
for?(int?i?=?0;?i? {
vector?t?=?clusters[i];
for?(int?j?=?0;?j {
var?+=?getDistXY(t[j]means[i]);??????//實現了誤差的公式
}
}
//cout<<“sum:“< return?var;
}
//獲得當前簇的均值(質心)
Tuple?getMeans(const?vector&?cluster){
int?num?=?cluster.size();
Tuple?t(dimNum+1?0);
for?(int?i?=?0;?i? {
for(int?j=1;?j<=dimNum;?++j)
{
t[j]?+=?cluster[i][j];???//先把簇中第一個樣本點4個維度值全部加上
}
}
for(int?j=1;?j<=dimNum;?++j)
t[j]?/=?num;
return?t;
//cout<<“sum:“< }
void?print(const?vector?clusters[])???//輸出各個簇的樣本
{
for(int?lable=0;?lable {
cout<<“第“< vector?t?=?clusters[lable];
for(int?i=0;?i {
cout< for(int?j=0;?j<=dimNum;?++j)
{
cout< }
cout<<“)\n“;
}
}
}
void?KMeans(vector&?tuples){
vector?clusters[k];//k個簇
Tuple?means[k];//k個中心點
int?i=0;
//一開始隨機選取k條記錄的值作為k個簇的質心(均值)
srand((unsigned?int)time(NULL));
for(i=0;i int?iToSelect?=?rand()%tuples.size();???//實現了0~150之間隨機取數
if(means[iToSelect].size()?==?0)
{
for(int?j=0;?j<=dimNum;?++j)
{
means[i].push_back(tuples[iToSelect][j]);
}
++i;
}
}
int?lable=0;
//根據默認的質心給簇賦值
for(i=0;i!=tuples.size();++i){
lable=clusterOfTuple(meanstuples[i]);
clusters[lable].push_back(tuples[i]);
}
double?oldVar=-1;
double?newVar=getVar(clustersmeans);
cout<<“初始的的整體誤差平方和為:“< int?t?=?0;
while(abs(newVar?-?oldVar)?>=?1)?//當新舊函數值相差不到1即準則函數值不發生明顯變化時,算法終止
{
cout<<“第?“<<++t<<“?次迭代開始:“< for?(i?=?0;?i? {
means[i]?=?getMeans(clusters[i]);
}
oldVar?=?newVar;
newVar?=?getVar(clustersmeans);?//計算新的準則函數值
for?(i?=?0;?i? {
clusters[i].clear();
}
//根據新的質心獲得新的簇
for(i=0;?i!=tuples.size();?++i){
lable=clusterOfTuple(meanstuples[i]);
clusters[lable].push_back(tupl
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件?????151040??2016-04-24?09:48??k-means\Debug\k-means.exe
?????文件????1080228??2016-04-24?09:48??k-means\Debug\k-means.ilk
?????文件????1502208??2016-04-24?09:48??k-means\Debug\k-means.pdb
?????文件????2359296??2016-05-08?10:49??k-means\ipch\k-means-ca3ed5be\k-means-c0adf4d8.ipch
?????文件???????1562??2016-04-24?09:48??k-means\k-means\Debug\cl.command.1.tlog
?????文件???????7610??2016-04-24?09:48??k-means\k-means\Debug\CL.read.1.tlog
?????文件????????978??2016-04-24?09:48??k-means\k-means\Debug\CL.write.1.tlog
?????文件????????406??2016-04-23?14:31??k-means\k-means\Debug\k-means.exe.em
?????文件????????472??2016-04-23?14:31??k-means\k-means\Debug\k-means.exe.em
?????文件????????381??2016-04-24?09:48??k-means\k-means\Debug\k-means.exe.intermediate.manifest
?????文件?????????78??2016-04-24?09:48??k-means\k-means\Debug\k-means.lastbuildstate
?????文件???????2498??2016-04-24?09:48??k-means\k-means\Debug\k-means.log
?????文件?????562700??2016-04-24?09:48??k-means\k-means\Debug\k-means.obj
?????文件????1179648??2016-04-23?11:48??k-means\k-means\Debug\k-means.pch
?????文件????????204??2016-04-23?14:31??k-means\k-means\Debug\k-means_manifest.rc
?????文件??????????2??2016-04-24?09:48??k-means\k-means\Debug\li
?????文件??????????2??2016-04-24?09:48??k-means\k-means\Debug\li
?????文件??????????2??2016-04-24?09:48??k-means\k-means\Debug\li
?????文件??????????2??2016-04-24?09:48??k-means\k-means\Debug\li
?????文件??????????2??2016-04-24?09:48??k-means\k-means\Debug\li
?????文件??????????2??2016-04-24?09:48??k-means\k-means\Debug\li
?????文件??????????2??2016-04-24?09:48??k-means\k-means\Debug\li
?????文件??????????2??2016-04-24?09:48??k-means\k-means\Debug\li
?????文件??????????2??2016-04-24?09:48??k-means\k-means\Debug\li
?????文件??????????2??2016-04-24?09:48??k-means\k-means\Debug\li
?????文件???????1790??2016-04-24?09:48??k-means\k-means\Debug\li
?????文件???????3068??2016-04-24?09:48??k-means\k-means\Debug\li
?????文件???????1040??2016-04-24?09:48??k-means\k-means\Debug\li
?????文件????????412??2016-04-24?09:48??k-means\k-means\Debug\mt.command.1.tlog
?????文件????????366??2016-04-24?09:48??k-means\k-means\Debug\mt.read.1.tlog
............此處省略30個文件信息
評論
共有 條評論