• 大小: 128KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-04
  • 语言: C/C++
  • 标签: 模式识别  

资源简介

这是模式识别中经典的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


评论

共有 条评论