⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shi.cpp

📁 模式识别中c—均值算法
💻 CPP
字号:
#include "shi.h"

//计算欧氏距离
double distance(int a,int b,int aa,int bb);
void main()
{
	int i,j,c,n,k,h;
	int sum=0;
	int data;
	double	xx,yy,x[1][1],y[1][1];
	int a[2][100],z[2][100],w[2][100];
	//给100个样本点的2个特征分别赋值
	for(i=0;i<2;i++)
		for(j=0;j<100;j++)
		{data=rand();		//产生随机数
		data=data%10;		//控制随机数范围:<10
		a[i][j]=data;
		}
	//打印出100个样本点,采用数组形式
	printf("the data is as follows:\n");
		
	for(i=0;i<100;i++)
	{
		printf(" ( ");
		for(j=0;j<2;j++)
		printf(" %d   ",a[j][i]);
		printf("); ");
	}	
	//初始类中心
	c=2;
	x[0][0]=a[0][0];
	x[1][0]=a[1][0];
	y[0][0]=a[0][1];
	y[1][0]=a[1][1];

	do {
		n=0;
		k=0;
		h=0;
		for(i=0;i<100;i++)
		{	//采用欧氏距离
			xx=distance(a[0][i],a[1][i],x[0][0],x[1][0]);
			yy=distance(a[0][i],a[1][i],y[0][0],y[1][0]);
			//欧氏距离小的归于一类
			if(xx<yy)
				{
				z[0][n]=a[0][i];
				z[1][n]=a[1][i];
				n++;}
			else
				{
				w[0][k]=a[0][i];
				w[1][k]=a[1][i];
				k++;
				}
		}
		//建立新的聚类中心
		for(i=0;i<n;i++)
			{
			sum=sum+z[0][i];
			h=h+z[1][i];
			}
		x[0][1]=sum/n;
		x[1][1]=h/n;
		sum=0;
		h=0;
		for(i=0;i<k;i++)
		{
			sum=sum+w[0][i];
			h=h+w[1][i];
		}
		y[0][1]=sum/k;
		y[1][1]=h/k;
		n=0;
		k=0;
		for(i=0;i<100;i++)
		{
			xx=distance(a[0][i],a[1][i],x[0][1],x[1][1]);
			yy=distance(a[0][i],a[1][i],y[0][1],y[1][1]);
			if(xx<yy)
				{
				z[0][n]=a[0][i];
				z[1][n]=a[1][i];
				n++;}
			else
				{w[0][k]=a[0][i];
				w[1][k]=a[1][i];
				k++;}
		}
		sum=0;
		for(i=0;i<n;i++)
		{
			sum=sum+z[0][i];
			h=h+z[1][i];
		}
		x[0][0]=sum/n;
		x[1][0]=h/n;
		sum=0;
		h=0;
		for(i=0;i<k;i++)
		{
			sum=sum+w[0][i];
			h=h+w[1][i];
		}
		y[0][0]=sum/k;
		y[1][0]=h/k;
	}while(x[0][0]==x[0][1]&&x[1][0]==x[1][1]&&y[0][0]==y[0][1]&&y[1][0]==y[1][1]);//新旧中心不等则继续建立新的类中心
	//打印出分类结果,采用数组形式
	printf("\nc=2\n");
	printf("the first kind of data is as follows:\n");
	printf("n=%d\n",n);		//打印出该类包含的样本个数
	for(i=0;i<n;i++)
	{
		printf(" ( ");
		for(j=0;j<2;j++)
			printf(" %d   ",z[j][i]);
		printf("); ");
	}	
	printf("the second kind of data is as follows:\n");
	printf("n=%d\n",k);		//打印出该类包含的样本个数
	for(i=0;i<k;i++)
	{
		printf(" ( ");
		for(j=0;j<2;j++)
			printf(" %d   ",w[j][i]);
		printf("); ");
	}
}

double distance(int a,int b,int aa,int bb)
{
double su;
su=sqrt((a-aa)*(a-aa)+(b-bb)*(b-bb));
return su;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -