资源简介
模式识别课程中,动态聚类算法中比较容易的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){
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语言程序设计期末考试试卷
评论
共有 条评论