• 大小: 659KB
    文件类型: .rar
    金币: 2
    下载: 1 次
    发布日期: 2021-07-22
  • 语言: C/C++
  • 标签: K-Means  聚类分析  

资源简介

模式识别课程中,动态聚类算法中比较容易的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.embed.manifest

     文件        472  2013-04-08 19:16  K-Means\K-Means\Debug\K-Means.exe.embed.manifest.res

     文件        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\link-cvtres.read.1.tlog

     文件          2  2013-04-08 21:20  K-Means\K-Means\Debug\link-cvtres.write.1.tlog

     文件       1804  2013-04-08 21:20  K-Means\K-Means\Debug\link.command.1.tlog

     文件       3072  2013-04-08 21:20  K-Means\K-Means\Debug\link.read.1.tlog

     文件       1128  2013-04-08 21:20  K-Means\K-Means\Debug\link.write.1.tlog

     文件        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个文件信息

评论

共有 条评论