資源簡介
包括兩個(gè)文件,kmeans聚類算法cpp文件,和用于測試的鳶尾花數(shù)據(jù)集txt文件,代碼帶詳細(xì)注釋,簡潔明了,下載之后馬上可以進(jìn)行測試

代碼片段和文件信息
#include???
#include???
#include???
#include???
#include???
#include???
#include?
using?namespace?std;
#define K 3 //簇的數(shù)目??
#define DIM_NUM 5
#define DATA_NUM 140
//存放元組的屬性信息??
typedef?vector?Tuple;//存儲一條數(shù)據(jù)記錄??
//輸入兩個(gè)元組,計(jì)算兩個(gè)元組間的歐幾里距離??
double?getDistXY(const?Tuple&?t1?const?Tuple&?t2)
{
double?sum?=?0;
for?(int?i?=?1;?i?<=?DIM_NUM;?++i)
{
sum?+=?(t1[i]?-?t2[i])?*?(t1[i]?-?t2[i]);
}
return?sqrt(sum);
}
//輸入k個(gè)質(zhì)心和1個(gè)元組,根據(jù)質(zhì)心,決定當(dāng)前元組屬于哪個(gè)簇??
int?clusterOfTuple(const?Tuple?means[]?const?Tuple&?tuple){
double?dist?=?getDistXY(means[0]?tuple);
double?tmp;
int?label?=?0; //標(biāo)示屬于哪一個(gè)簇??
for?(int?i?=?1;?i {
tmp?=?getDistXY(means[i]?tuple);
if?(tmp {?
dist?=?tmp;?
label?=?i;?
}
}
return?label;
}
//輸入簇集和質(zhì)心,獲得給定簇集的平方誤差??
double?getVar(vector?clusters[]?Tuple?means[])
{
double?var?=?0;
for?(int?i?=?0;?i? {
vector?t?=?clusters[i];
for?(unsigned?int?j?=?0;?j {
var?+=?getDistXY(t[j]?means[i]); //簇集中所有元組到質(zhì)心的距離之和
}
}
//cout<<“sum:“< return?var;
}
//輸入簇,獲得當(dāng)前簇的均值(質(zhì)心)??
Tuple?getMeans(const?vector&?cluster)
{
int?num?=?cluster.size();
Tuple?t(DIM_NUM?+?1?0); //初始化dimNum?+?1個(gè)0填充數(shù)組
//第一個(gè)位置存放記錄編號,第2到dimNum+1個(gè)位置存放實(shí)際元素??
for?(int?i?=?0;?i? {
for?(int?j?=?1;?j?<=?DIM_NUM;?++j)
{
t[j]?+=?cluster[i][j];
}
}
for?(int?j?=?1;?j?<=?DIM_NUM;?++j)
{
t[j]?/=?num;
}
return?t; //返回簇集中所有元組平均值作為質(zhì)心
//cout<<“sum:“< }
void?print_Means(const?vector?clusters[])
{
for?(int?lable?=?0;?lable? {
cout?< Tuple?temp?=?getMeans(clusters[lable]);
cout?<“(“;
for?(int?j?=?0;?j?<=?DIM_NUM;?++j)
{
cout?< }
cout?<“)\n“;
}
}
void?print(const?vector?clusters[])
{
for?(int?lable?=?0;?lable {
cout?<“第“?<
vector?t?=?clusters[lable];
for?(unsigned?int?i?=?0;?i {
cout?< for?(int?j?=?0;?j?<=?DIM_NUM;?++j)
{
cout?< }
cout?<“)\n“;
}
}
}
vector*?KMeans(vector&?tuples)
{
vector?clusters[K]; //k個(gè)簇??
Tuple?means[K]; //k個(gè)質(zhì)心??
int?i?=?0;
//一開始隨機(jī)選取k條記錄的值作為k個(gè)簇的質(zhì)心(均值)??
srand((unsigned?int)time(NULL)); //隨機(jī)數(shù)發(fā)生器的初始化
for?(i?=?0;?i {
int?iToSelect?=?rand()?%?tuples.size();
if?(means[iToSelect].size()?==?0)
{
for?(int?j?=?0;?j?<=?DIM_NUM;?++j)
{
means[i].push_back(tuples[iToSelect][j]); //初始化個(gè)質(zhì)心
}
++i;
}
}
int?lable?=?0;
//根據(jù)默認(rèn)的質(zhì)心,將輸入的tuples分配給各個(gè)簇??
for?(i?=?0;?i?!=?tuples.size();?++i)
{
lable?=?clusterOfTuple(means?tuples[i]);
clusters[lable].push_back(tuples[i]);
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件???????2660??2016-06-16?22:44??iris_train.txt
?????文件???????4872??2017-08-23?11:20??Source.cpp
-----------?---------??----------?-----??----
?????????????????7532????????????????????2
評論
共有 條評論