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

📄 c均值法聚类分析.cpp

📁 模式识别技术是一门重要技术
💻 CPP
字号:
#include<iostream.h>
#include<math.h>
#include<stdlib.h>
#define number 5                                    //矢量的个数
void main()
{double distance1,distance2,x[2][2],sum=0,a[number][2],s=0,n,q,b[2][2];
 long   i,j,m,cn=0,count=0,w1[100],w2[100],flag=1,set=0,set1=0;
cout<<"请给定初始的两个聚类中心:"<<endl;           //输入初始的两个聚类中心
for(i=0;i<2;i++)
	{for(j=0;j<2;j++)
	 cin>>x[i][j];
	 cout<<";"<<endl;
	}
cout<<"输入初始聚类中心结束!"<<endl;
cout<<endl;
/***************************************************************************/
for(i=0;i<2;i++)                                    //保存新的聚类中心   
	{for(j=0;j<2;j++)
	 b[i][j]=0;
	}
/***************************************************************************/
cout<<"请输入每个矢量的样本值:"<<endl;
for(i=0;i<number;i++)                              //输入每个矢量的样本值
	{
	for(j=0;j<2;j++)
		{
		cin>>a[i][j];
		}
	cout<<";"<<endl;
	cout<<endl;
	if(i<number-1)
	cout<<"please input another date:"<<endl;
	}
cout<<"待分类矢量输入完成!"<<endl;
cout<<endl;
/***************************************************************************/
while(flag)                                        //计算欧式距离
{
for(m=0;m<number;m++)
	{for(j=0;j<2;j++)
	{
	 q=x[0][j]-a[m][j];
     n=x[1][j]-a[m][j];
	 q=q*q;
	 n=n*n;	
	 sum=q+sum;
	 s=s+n;

	}
	distance1=pow(sum,0.5);
	distance2=pow(s,0.5);
	if(distance1<distance2)                         //比较距离的大小,确定此矢量属于哪一模式
	{
	w1[cn]=m;
	cn++;
	}
	else
	{w2[count]=m;
	count++;
	}
	s=0;
	sum=0;
	}
/***************************************************************************/
for(i=0;i<cn;i++)                                    //计算新的聚类中心
	{m=w1[i];
	b[0][0]=a[m][0]+b[0][0];
	b[0][1]=a[m][1]+b[0][1];
	set=1;
	}
if(set==1)
	{b[0][0]=b[0][0]/cn;
	b[0][1]=b[0][1]/cn;
	}
for(i=0;i<count;i++)
	{m=w2[i];
	b[1][0]=a[m][0]+b[1][0];
	b[1][1]=a[m][1]+b[1][1];
	set1=1;
	}
if(set1==1)
	{b[1][0]=b[1][0]/count;
	b[1][1]=b[1][1]/count;
	}
/***************************************************************************/
if(x[0][0]==b[0][0]&&x[0][1]==b[0][1]&&x[1][0]==b[1][0]&&x[1][1]==b[1][1])
	{
	cout<<"输出最后的聚类中心:"<<endl;            //判断是否完成每个矢量的模式分类
	for(i=0;i<2;i++)
		{for(j=0;j<2;j++)
		cout<<b[i][j]<<endl;
		cout<<";"<<endl;
		}
	cout<<endl;
	cout<<"输出最后模式分类的结果:"<<endl;
	cout<<endl;
	cout<<"属于w1的矢量有:"<<endl;
	for(i=0;i<cn;i++)
	{	w1[i]=w1[i]+1;
		cout<<w1[i]<<endl;
	}
	cout<<";"<<endl;
	cout<<"属于w2的矢量有:"<<endl;
	for(i=0;i<count;i++)
	{	w2[i]=w2[i]+1;
		cout<<w2[i]<<endl;
	}
	cout<<";"<<endl;
	flag=0;
	}
else                                             //没有则重新替代聚类中心值,返回重新计算
	{
	x[0][0]=b[0][0];
	x[0][1]=b[0][1];
	x[1][0]=b[1][0];
	x[1][1]=b[1][1];
	flag=1;
	for(i=0;i<2;i++)
	{for(j=0;j<2;j++)
	 b[i][j]=0;
	}
	cn=0;
	count=0;
	}
}
}

⌨️ 快捷键说明

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