#include
<
stdio.h
>
#include
<
math.h
>
#define
true 1
#define
false 0
intn;
//資料個數
intk;
//集合個數
int*
centerindex;
//初始化質心陣列的索引
double
*center;
//質心集合
double
*centercopy;
//質心集合副本
double
*alldata;
//資料集合
double
**cluster;
//簇的集合
int*
top;
//集合中元素的個數,也會用作棧處理
//隨機生成k個數x(0<=x<=n-1)作為起始的質心集合
void
createrandomarray(
intn,
intk,
int*
center)}if
(j>=
i)//
如果不重複,加入
else
} }//
返回距離最小的質心的序號
intgetindex(
double
value,
double
*center)
}return
index;}//
拷貝質心陣列到副本
void
copycenter()}//
初始化質心,隨機生成法
void
initcenter()
copycenter();
//拷貝到質心副本}//
加入乙個資料到乙個cluster[index]集合
void
addtocluster(
intindex,
double
value) //
重新計算簇集合
void
updatecluster()
for(i=0
;i<
n;i++)}
//重新計算質心集合,對每一簇集合中的元素加總求平均即可
void
updatecenter()
if(top[i]
>0)
//如果該簇元素不為空}}
//判斷2陣列元素是否相等
intisequal(
double
*center1 ,
double
*center2)
}return
true;}//
列印聚合結果
void
print()
} }//
初始化聚類的各種資料
void
initdata()
center=(
double
*)malloc(
sizeof
(double)*
k);//
為質心集合申請空間
centerindex=(
int*
)malloc(
sizeof
(int)*
k);//
為質心集合索引申請空間
centercopy=(
double
*)malloc(
sizeof
(double)*
k);//
為質心集合副本申請空間
top=
(int
*)malloc(
sizeof
(int)*
k);
alldata=(
double
*)malloc(
sizeof
(double)*
n);//
為資料集合申請空間
cluster=(
double
**)malloc(
sizeof
(double*)
*k);
//為簇集合申請空間
//初始化k個簇集合
for(i=0
;i<
k;i++
)printf(
"輸入%d資料:
",n);
for(i=0
;i<
n;i++
)initcenter();
//初始化質心集合
updatecluster();
//初始化k個簇集合}/*
演算法描述:
k均值演算法:
給定類的個數k,將n個物件分到k個類中去,
使得類內物件之間的相似性最大,而類之間的相似性最小。
*/main()
else
//否則將質心副本置為本次迭代得到的的質心集合
}print();
//輸出結果
getchar();
getchar();
k 均值聚類演算法c語言版
k 均值聚類演算法c語言版 include stdio.h include math.h define true 1 define false 0 intn 資料個數 intk 集合個數 int centerindex 初始化質心陣列的索引 double center 質心集合 double cen...
k 均值聚類演算法c語言版
include stdio.h include math.h define true 1 define false 0 intn 資料個數 intk 集合個數 int centerindex 初始化質心陣列的索引 double center 質心集合 double centercopy 質心集合副本...
k 均值聚類演算法c語言版
檢視文章 k 均值聚類演算法c語言版 2009 08 03 13 44 include include define true 1 define false 0 int n 資料個數 int k 集合個數 int centerindex 初始化質心陣列的索引 double center 質心集合 d...