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

资源简介

本程序为K均值分类法的代码实现,可运行.采用C++编写;模式识别

资源截图

代码片段和文件信息

#include 
#include 
using namespace std;
# include 
# include
typedef struct code 
{
float x1;//x1,x2,x3,x4分别为4个特征
float x2;
float x3;
float x4;

}CodeCodes[150];//元素的结构体
typedef struct G_code 
{
int G[150];//该类中的点
int count ;//该类中的元素个数

}G_CodeG_Codes[3];
G_Codes gg;//当前的三个分类
Code Z[3];//三个类的中心
Code Z_last[3];//前一次分类的三个类的中心
int K_count = 0 ;//迭代次数
Codes cc;//记录文件中的点
 void average( int G_i );//求新的聚类中心,G_i表示第i个类
 void K_Classify( );//按新的聚类中心分类,用于递归
 void Classify();//分类
 int div( int n );//将第n个点分类至G_I类,并返回G_I
 bool test();//判断Z[3]与Z_last[3]是否相同
void main()
{
fstream file;
int i = 0  j = 0 ;
file.open(“Iris.txt“ios::in);
if(file.fail())
{
cout<<“文件打开失败!“< exit(0);
}
//从文件中读出各点
file>>cc[j].x1>>cc[j].x2>>cc[j].x3>>cc[j].x4;
j++ ;
while(!file.eof())
{
file>>cc[j].x1>>cc[j].x2>>cc[j].x3>>cc[j].x4;
j++ ;
}
file.close();
Classify();//开始分类
cout<<“循环迭代次数为:“< cout< for( j = 0 ; j < 3 ; j++ )
{
cout<<“第(“< cout<<“第(“< for( i = 0 ; i < gg[j].count ; i++ )
{
cout< if( (i+1) % 13 == 0 )
cout< }
cout< cout< }
cin.get();
}
 void Classify()//分类
 {
 int i ; 
 int ss[3] = {34445};
 for( i = 0 ; i< 3 ; i++  )//选三个点作为聚类中心初始值
 {
 Z_last[i] = cc[ss[i]] ;
 gg[i].count = 0 ;
 }
 K_Classify();
 }
 void K_Classify( )//按新的聚类中心分类,递归调用
 {
 int i ;
 int G_I;//该点所属类别
 K_count++ ;//迭代次数增加
 for( i = 0 ; i < 150 ; i++ )
 {
 G_I = div( i );//将第i个点分类
 gg[G_I].G[gg[G_I].count] = i  ;
 gg[G_I].count++ ;
 }
 for( i = 0 ; i < 3 ; i++ )
 average(i);
 if( test() == 1 )//若两次聚类中心相同则返回
 return ;
 else//若两次聚类中心不相同则记录本次聚类中心,进行下一轮迭代
 {
 for( i = 0 ; i< 3 ; i++ )
 {
 Z_last[i] = Z[i] ;
 gg[i].count = 0 ;
 }
 K_Classify();
 }
 }
int div( int n )//将第n个点分类至G_I类,并返回G_I
{
 float dis[3];//该点到个聚类中心的距离的平方
 int G_I;//该点属于G_I类
 int  i = 0 ;
 for(  i = 0 ; i < 3 ; i++ )
 dis[i] =sqrt( (Z_last[i].x1 - cc[n].x1)*(Z_last[i].x1 - cc[n].x1)+(Z_last[i].x2 - cc[n].x2)*(Z_last[i].x2 - cc[n].x2)+(Z_last[i].x3 - cc[n].x3)*(Z_last[i].x3 - cc[n].x3)+(Z_last[i].x4 - cc[n].x4)*(Z_last[i].x4 - cc[n].x4 ));
 G_I = 0 ;
 for( i = 1 ; i < 3 ; i++ )//选取dis的最小值
 if( dis[G_I] > dis [i])
 G_I = i ;
 return G_I;
}
void average( int G_i )//求新的聚类中心,G_i表示第i个类
{
int i ; 
Code sum ;//坐标和
sum.x1 = 0.0 ;
sum.x2 = 0.0 ;
sum.x3 = 0.0 ;
sum.x4 = 0.0 ;
for( i = 0 ; i < gg[G_i].count ; i++ )
{
sum.x1 += cc[gg[G_i].G[i]].x1 ;
sum.x2 += cc[gg[G_i].G[i]].x2 ;
sum.x3 += cc[gg[G_i].G[i]].x3 ;
sum.x4 += cc[gg[G_i].G[i]].x4 ;
}
Z[G_i].x1 = sum.x1 / ( float )gg[G_i].count ;
Z[G_i].x2 = sum.x2 / ( float )gg[G_i].count ;
Z[G_i].x3 = sum.x3 / ( float )gg[G_

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       2548  2012-12-09 19:18  K_均值分类\Iris.txt

     文件       4328  2012-12-09 19:03  K_均值分类\K_均值分类.dsp

     文件        528  2012-12-09 18:52  K_均值分类\K_均值分类.dsw

     文件      50176  2013-10-22 21:05  K_均值分类\K_均值分类.ncb

     文件      53760  2013-10-22 21:05  K_均值分类\K_均值分类.opt

     文件        254  2013-10-22 21:05  K_均值分类\K_均值分类.plg

     文件       3886  2012-12-19 18:51  K_均值分类\mymain.cpp

     目录          0  2013-10-22 21:05  K_均值分类

----------- ---------  ---------- -----  ----

               115480                    8


评论

共有 条评论