資源簡介
這是模式識別中經典的ISODATA算法,用戶交互輸入進行分類,C語言實現,效果很好

代碼片段和文件信息
//?ISODATA.cpp?:?Defines?the?entry?point?for?the?console?application.
//
#include?“stdafx.h“
#include?“stdio.h“
#include?“math.h“
#define??N?10
#define??eps???0.00001
struct?Pointf
{
int?sequence;
float?x;
float?y;
};
struct?PointZ
{
float?x;
float?y;
};
float?CalDistancef(Pointf?x1Pointf?x2)
{
return?sqrtf((x1.x-x2.x)*(x1.x-x2.x)+(x1.y-x2.y)*(x1.y-x2.y));
}
float?CalDistanceZ(PointZ?x1PointZ?x2)
{
return?sqrtf((x1.x-x2.x)*(x1.x-x2.x)+(x1.y-x2.y)*(x1.y-x2.y));
}
float?CalDistancefZ(Pointf?x1PointZ?x2)
{
return?sqrtf((x1.x-x2.x)*(x1.x-x2.x)+(x1.y-x2.y)*(x1.y-x2.y));
}
int?main(int?argc?char*?argv[])
{
Pointf?pts[N]={
{00.00.0}{13.08.0}{22.02.0}{31.01.0}{45.03.0}
{54.08.0}{66.03.0}{75.04.0}{86.04.0}{97.05.0}
};
int?ijm;
printf(“樣本集為:\n“);
for(i=0;i {
printf(“X%d(%.1f%.1f)??“ipts[i].xpts[i].y);
if((i+1)%5==0)
{
printf(“\n“);
}
}
printf(“\n“);
printf(“\n“);
int?Nc=0;
printf(“please?input?初始聚類中心數:Nc(0-10):?“);
scanf(“%d“&Nc);
int?Z[N];
for(i=0;i {
printf(“輸入初始第%d聚類中心的序號(0-9):“i);
scanf(“%d“&Z[i]);
}
????int????Nj[N];?//記錄每個類中元素的個數
PointZ?ZArray[N];
Pointf?SAArray[N][N];
float??DjAv[N];
float??Deltaj[N][2];
float??Deltajmax[N];
int??DeltajmaxCor[N];
float??DAv;
int????Nreal=N;
int????count=0;
float??Dij[N*N/2];
int????Diji[N];
int????Dijj[N];
int????q=0;
int????p=0;
????float?ft;
int???it;
int???jt;
int???flag;
int?ss=0;
PointZ?Ztp;
PointZ?ZArraytp[N];
int????Nctp;
char?ch;
int?cur=0;
for(i=0;i {
Nj[i]=0;?
}
//聚類中心的特征值
for(i=0;i {
int?ihere=Z[i];
ZArray[i].x=pts[ihere].x;
ZArray[i].y=pts[ihere].y;
}
int?KThetaN;
float?ThetaSThetaC;
int?LI;
Step1:
printf(“輸入預期聚類中心數目?K?:“);
scanf(“%d“&K);
printf(“輸入每個聚類域中最少的樣本數ThetaN:?“);
scanf(“%d“&ThetaN);
printf(“輸入同一聚類域中樣本標準差的最大值:?“);
scanf(“%f“&ThetaS);
printf(“輸入不同聚類域距離最小值:?“);
scanf(“%f“&ThetaC);
printf(“輸入一次可以合并的聚類中心的最多對數:?“);
scanf(“%d“&L);
printf(“輸入最大迭代次數:?“);
scanf(“%d“&I);
Step2:
for(i=0;i {
Nj[i]=0;
}
printf(“\n“);
printf(“這是第%d次歸類\n“count+1);
for(i=0;i {
if(pts[i].sequence==-1)continue;??????//若該點的序號為-1則說明它是被剔除的
float?dis=1.0e+10;
int?xx=0;
float?ftemp;
for(j=0;j {
ftemp=CalDistancefZ(pts[i]ZArray[j]);
if(ftemp {
xx=j;
dis=ftemp;
}
}
SAArray[xx][Nj[xx]].x=pts[i].x;
SAArray[xx][Nj[xx]].y=pts[i].y;
SAArray[xx][Nj[xx]].sequence=pts[i].sequence;
Nj[xx]=Nj[xx]+1;
}
???for(i=0;i ???{
???printf(“第%d個聚類中心是:(%.2f%.2f)???“iZArray[i].xZArray[i].y);
???printf(“包含的元素有:“i);
???for(j=0;j ???{
???printf(“?X%d?“SAArray[i][j].s
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件?????221243??2007-12-04?18:49??ISODATA\Debug\ISODATA.exe
?????文件??????16464??2007-12-04?18:24??ISODATA\Debug\ISODATA.obj
?????文件?????484352??2007-10-24?21:13??ISODATA\Debug\ISODATA.pdb
?????文件??????53248??2007-10-24?21:13??ISODATA\Debug\vc60.pdb
?????文件???????6756??2007-10-24?21:13??ISODATA\ISODATA.cpp
?????文件???????3413??2007-10-24?21:45??ISODATA\ISODATA.dsp
?????文件????????522??2007-10-24?21:54??ISODATA\ISODATA.dsw
?????文件??????58368??2008-03-09?21:29??ISODATA\ISODATA.ncb
?????文件??????53760??2008-03-09?21:29??ISODATA\ISODATA.opt
?????文件????????745??2007-12-04?18:49??ISODATA\ISODATA.plg
?????文件???????1214??2004-10-04?18:17??ISODATA\ReadMe.txt
?????文件????????294??2004-10-04?18:17??ISODATA\StdAfx.cpp
?????文件????????667??2004-10-04?18:17??ISODATA\StdAfx.h
?????目錄??????????0??2009-07-08?17:42??ISODATA\Debug
?????目錄??????????0??2008-12-29?20:33??ISODATA
-----------?---------??----------?-----??----
???????????????901046????????????????????15
- 上一篇:C語言課程設計案例精編
- 下一篇:單鏈表的C++實現。。
評論
共有 條評論