資源簡介
模式識別課程中,動態聚類算法中比較容易的K-Means聚類分析的C語言實現。

代碼片段和文件信息
#include
#include
#include
#define?K?2
#define?MAX?100000
typedef?struct{
double?featureVector[10];
int?classification;
}sampleNode;
int?m?n;
sampleNode?*sn;
sampleNode?z[K+1];
sampleNode?zz[K+1];
int?classAmount[K+1];?//classAmount[k]表示當前類K的樣本數量
int?center[K+1];
void?inputSample(){
int?i?j;
printf(“請輸入樣本的數量和樣本的特征向量的屬性個數(用空格隔開):\n“);
scanf(“%d%d“?&m?&n);
sn?=?(sampleNode*)malloc(sizeof(sampleNode)*(m+1));
for(i=0;?i sn[i].classification?=?0;
}
printf(“\n請依次輸入每個樣本的特征值,特征值用空格隔開,樣本用回車符隔開:\n“);
for(i=1;?i<=m;?i++){
printf(“第%2d個樣本:“?i);
for(j=1;?j<=n;?j++){
scanf(“%lf“?&sn[i].featureVector[j]);
}
}
}
double?getDistance(sampleNode?a?sampleNode?b){
int?i;
double?dis;
dis?=?0.0;
for(i=1;?i<=n;?i++){
dis?+=?pow(a.featureVector[i]-b.featureVector[i]2);
}
return?sqrt(dis);
}
void?classify(){
double?min;
double?temp[K+1];
double?distance;
int?i?j;
int?c;
c?=?1;
for(i=1;?i<=m;?i++){
for(j=1;?j<=K;?j++){
temp[j]?=?getDistance(sn[i]?z[j]);
}
min?=?MAX;
for(j=1;?j<=K;?j++){
if(temp[j]? min?=?temp[j];
c?=?j;
}
}
sn[i].classification?=?c;
}
}
void?getCurrentAmount(){
int?i;
for(i=0;?i<=K;?i++){
classAmount[i]?=?0;
}
for(i=1;?i<=m;?i++){
classAmount[sn[i].classification]++;
}
}
void?reCalCenter(){
int?i;
int?j;
double?value[K+1];
int?k;
getCurrentAmount();
for(i=1;?i<=n;?i++){
for(k=0;?k<=K;?k++){
value[k]?=?0.0;
}
for(j=1;?j<=m;?j++){
value[sn[j].classification]?+=?sn[j].featureVector[i];
}
for(k=1;?k<=K;?k++){
zz[k].featureVector[i]?=?value[k]/classAmount[k];
}
}
}
int?judgeCenterEquality(){
int?i?j;
int?flag;
flag?=?1;
for(i=1;?i<=n;?i++){
for(j=1;?j<=K;?j++){
if(z[j].featureVector[i]?!=?zz[j].featureVector[i]){
flag?=?0;
break;
}
}
if(!flag){
break;
}
}
return?flag;
}
void?centerExchange(){
int?i?j;
for(j=1;?j<=K;?j++){
for(i=1;?i<=n;?i++){
z[j].featureVector[i]?=?zz[j].featureVector[i];
z[j].featureVector[i]?=?zz[j].featureVector[i];
}
}
}
void?printResult(){
int?i?j;
for(i=1;?i<=K;?i++){
printf(“屬于類別%d的樣本如下:\n“?i);
for(j=1;?j<=m;?j++){
if(sn[j].classification?==?i){
printf(“X%d??“?j);
}
}
printf(“\n“);
}
printf(“\n\n“);
}
int?main(){
int?i;
int?center[K+1];
inputSample();
printf(“\n請輸入%d個初始聚類中心,用空格隔開:\n“?K);
for(i=1;?i<=K;?i++){
scanf(“%d“?¢er[i]);
}
for(i=1;?i<=K;?i++){
z[i]?=?sn[center[i]];
}
i?=?1;
classify();
reCalCenter();
while(!judgeCenterEquality()){
centerExchange();
classify();
reCalCenter();
i++;
}
printResult();
printf(“\n迭代次數為:%d\n“?i);
return?0;
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????31744??2013-04-08?21:20??K-Means\Debug\K-Means.exe
?????文件?????393536??2013-04-08?21:20??K-Means\Debug\K-Means.ilk
?????文件?????437248??2013-04-08?21:20??K-Means\Debug\K-Means.pdb
?????文件????1441792??2013-04-08?18:14??K-Means\ipch\k-means-38da6f35\k-means-c0adf4d8.ipch
?????文件????????786??2013-04-08?21:20??K-Means\K-Means\Debug\cl.command.1.tlog
?????文件???????1932??2013-04-08?21:20??K-Means\K-Means\Debug\CL.read.1.tlog
?????文件????????534??2013-04-08?21:20??K-Means\K-Means\Debug\CL.write.1.tlog
?????文件????????406??2013-04-08?19:16??K-Means\K-Means\Debug\K-Means.exe.em
?????文件????????472??2013-04-08?19:16??K-Means\K-Means\Debug\K-Means.exe.em
?????文件????????381??2013-04-08?21:20??K-Means\K-Means\Debug\K-Means.exe.intermediate.manifest
?????文件?????????91??2013-04-08?21:20??K-Means\K-Means\Debug\K-Means.lastbuildstate
?????文件???????1950??2013-04-08?21:20??K-Means\K-Means\Debug\K-Means.log
?????文件??????19863??2013-04-08?21:20??K-Means\K-Means\Debug\K-Means.obj
?????文件????????204??2013-04-08?19:16??K-Means\K-Means\Debug\K-Means_manifest.rc
?????文件??????????2??2013-04-08?21:20??K-Means\K-Means\Debug\li
?????文件??????????2??2013-04-08?21:20??K-Means\K-Means\Debug\li
?????文件???????1804??2013-04-08?21:20??K-Means\K-Means\Debug\li
?????文件???????3072??2013-04-08?21:20??K-Means\K-Means\Debug\li
?????文件???????1128??2013-04-08?21:20??K-Means\K-Means\Debug\li
?????文件????????450??2013-04-08?21:20??K-Means\K-Means\Debug\mt.command.1.tlog
?????文件????????442??2013-04-08?21:20??K-Means\K-Means\Debug\mt.read.1.tlog
?????文件????????442??2013-04-08?21:20??K-Means\K-Means\Debug\mt.write.1.tlog
?????文件????????652??2013-04-08?19:16??K-Means\K-Means\Debug\rc.command.1.tlog
?????文件????????414??2013-04-08?19:16??K-Means\K-Means\Debug\rc.read.1.tlog
?????文件????????422??2013-04-08?19:16??K-Means\K-Means\Debug\rc.write.1.tlog
?????文件??????44032??2013-04-08?21:20??K-Means\K-Means\Debug\vc100.idb
?????文件??????69632??2013-04-08?21:18??K-Means\K-Means\Debug\vc100.pdb
?????文件???????2964??2013-04-08?21:23??K-Means\K-Means\K-Means.cpp
?????文件???????3919??2013-04-08?19:16??K-Means\K-Means\K-Means.vcxproj
?????文件????????956??2013-04-08?19:16??K-Means\K-Means\K-Means.vcxproj.filters
............此處省略13個文件信息
- 上一篇:編譯原理詞法分析程序C語言編寫
- 下一篇:C語言程序設計期末考試試卷
評論
共有 條評論