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

📄 zhong.cpp

📁 系统聚类算法K-means 属于聚类分析中一种基本的划分方法
💻 CPP
字号:
#include<iostream.h>
#include<math.h>
#include<iomanip.h>



void main()
{	
	void standardization(float a[16][16]);
	void distance(float a[16][16],float b[16][16]);   
	void ChangeMatrix(float b[16][16],int c[16]);
	void out(float a[16][16]);
	int i,j;		//矩阵的行列坐标
	int	x=0;		//记数变量
	int count=10;	//记数变量,统计矩阵变换后有效的类数
	int judge[16]={1,1,1,1,1,1,1,1,1,1};  //判断数组,开始时置初始化的10个类均为有效
	float array[16][16]={{250,1.5,1,1},{350,5,3,3},{200,2,2,1},{500,4,2,3},{100,1,2,1},{400,4,2,2},{380,4.5,3,2},{430,3.5,2,3},{230,1,1,1},{210,1.5,2,2}};
	float dis[16][16]={0};		//保存每次计算后两两样本之间的距离  
	cout<<"将指标按权重量化后得到矩阵:"<<endl;
	out(array);
	standardization(array);
	cout<<"标准化得到矩阵:"<<endl;
	out(array);
	cout<<"计算两两样本的距离,得到距离矩阵D0如下:"<<endl;
	distance(array,dis);	
	while(count>4)      //矩阵中只剩下四个有效类时,聚类完毕
	{
		x++;
		count=0;
		ChangeMatrix(dis,judge);
		cout<<"经过一次变换,新的距离矩阵D"<<x<<"如下:"<<endl;
		for(i=0;i<=15;i++)       //统计经过计算后矩阵中有效的类数
		{
			if(judge[i]==1) count++;
		}
	
		for(i=0;i<=15;i++)   
		{	
			for(j=0;j<=15;j++)
			{
				if(judge[i]==1&&judge[j]==1)	//行列均为有效,对应值才有效
					cout<<setiosflags(ios::right)<<setw(7)<<dis[i][j];
			}
			cout<<endl;
		}
	}  
}  




/*  将聚阵指标按权重量化   */
void standardization(float a[16][16])
{
	int i,j;
	float min[4],max[4];    //保存每列各元的最大值,最小值
	//最大值,最小值数组初始化为每列第一个元素
	for(j=0;j<=3;j++)   
	{	
		min[j]=a[0][j];
		max[j]=a[0][j];
	}
	// 求每列各元的最大值,最小值
	for(j=0;j<=3;j++)
		for(i=0;i<=9;i++)
		{
			if(a[i][j]>max[j]) max[j]=a[i][j];
			if(a[i][j]<min[j]) min[j]=a[i][j];
		}
	// 由公式标准化矩阵
	for(j=0;j<=3;j++)    
		for(i=0;i<=9;i++)
		{
			a[i][j]=(a[i][j]-min[j])/(max[j]-min[j]);
		}	
}



/* 计算两两样本的距离,得到距离矩阵D0   */
void distance(float a[16][16],float b[16][16])   
{
	int i,j,k;
	for(i=0;i<=9;i++)	
		for(j=0;j<=9;j++)
		{
			for(k=0;k<=3;k++)
				b[i][j]+=(float)(fabs(a[i][k]-a[j][k]));
		}
	for(i=0;i<=9;i++)
	{
		for(j=0;j<=9;j++)
		{
			cout<<setiosflags(ios::right)<<setw(7)<<b[i][j]<<" ";
		}
		cout<<endl;
	}		
	cout<<endl;
}



/* 求出距离矩阵中的最小值,将最小值对应行列坐标的类并为
	一个新类,并计算新类与其他类之间的距离				*/
void ChangeMatrix(float b[16][16],int c[16])
{
	static	int a=9;	//记录新产生的类在矩阵中对应的行列数
	int *p=c;
	float min;		//距离矩阵中的最小值
	int i,j;		//矩阵的行列坐标
	int	m,n;		//对应最小值的行列坐标
	int l=1;		//表示矩阵最小值尚未初始化 
	for(i=0;i<=15;i++)
		for(j=0;j<=15;j++)
		{
			if(c[i]==1&&c[j]==1&&b[i][j]>0)
			{
				if(l==1) 
				{
					min=b[i][j];
					m=i;
					n=j;
					l=0;
				}
				else if(b[i][j]<min) 
					{
						min=b[i][j];
						m=i;
						n=j;
					}
			}
		}
	c[m]=0;   //最小值对应的行坐标置为无效 
	c[n]=0;   //最小值对应的列坐标置为无效 
	a++;	
	*(p+a)=1;	//将新聚合的类对应的矩阵行列坐标置为有效
	cout<<"因为最小值为的d("<<m+1<<","<<n+1<<")"<<"="<<min<<endl;
	cout<<"所以将"<<"G"<<m+1<<" "<<"G"<<n+1<<"合并为一个新类为G"<<a+1<<endl;
	for(i=0;i<=15;i++)
	{
		if(c[i]==1)
			{
				if(a==i) b[a][a]=0;     //类和自身的距离为0
				else if(b[i][m]<b[i][n]) 
					{
					b[a][i]=b[i][m];
					b[i][a]=b[i][m];
					}
					else 
					{
						b[a][i]=b[i][n];
						b[i][a]=b[i][n];
					}
			}
	}
}



/*   输出函数  */
void out(float a[16][16])
{
	for(int i=0;i<=9;i++)
	{
		for(int j=0;j<=3;j++)
		{
			cout<<setiosflags(ios::right)<<setw(8)<<a[i][j];
		}
		cout<<endl;
	}		
	cout<<endl;
}



⌨️ 快捷键说明

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