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

📄 c-均值算法.cpp

📁 程序中包含了C均值算法和固定增量法,两方法为聚类的很好的方法.
💻 CPP
字号:
#include<iostream.h>
#include<math.h>
#include<stdio.h>
void main()
{
	int c,m,n,i,j,a,d,w,k,flag=1;
	float t;
	float s[10],num[10];
    float x[10][10];
	float z[2][10][10];
	float f[10][10][10];
	cout<<"输入群心的个数:"<<endl;
	cin>>c;
    cout<<endl<<"输入类的个数:"<<endl;
	cin>>m;
	cout<<endl<<"输入类的维数:"<<endl;
    cin>>n;
	cout<<endl;
    for(i=0;i<c;i++)
	{
		s[i]=0;    //用于存储f各群中的元素的个数
	}
	//输入样本
	cout<<"输入样本:"<<endl;
	for(i=0;i<m;i++)
	{
		cout<<"输入第";
		cout<<i+1<<"个样本:"<<endl;
		for(j=0;j<n;j++)
		{
			cin>>x[i][j];
		}
	}
	cout<<"输入已经完全完毕"<<endl;

	//初始化群心
	for(i=0;i<c;i++)
	{
		for(j=0;j<n;j++)
			z[0][i][j]=x[i][j];
	}
	cout<<"初始化群心成功!"<<endl;
	
	//输出初始群心
	for(i=0;i<c;i++)
	{
		for(j=0;j<n;j++)
			cout<<z[0][i][j]<<" ";
		cout<<"\n";
	}
	while(flag)
	{
		for(i=0;i<c;i++)
		{
			s[i]=0;    //s[i]用于存储f各群中的元素的个数
		}
		flag=0;
		for(i=0;i<m;i++)
		{
			for(a=0;a<c;a++)
			{
				num[a]=0;
				for(j=0;j<n;j++)
				{
                    t=(x[i][j]-z[0][a][j])*(x[i][j]-z[0][a][j]);
					num[a]=num[a]+t;                              //各个类与群心之间的欧氏距离
				}
				//cout<<num[a]<<"\n";
			}
			for(k=0,d=1;d<c;d++)
				if(num[k]>num[d])    //根据欧氏距离的比较,将最小距离那个类归入第K类群中
					k=d;
		    //cout<<endl<<"归入哪一个群?:"<<k;
			//cout<<"\n";

			//统计归入k类群中的元素个数s[k]
			for(j=0;j<n;j++)         
			{
				w=s[k];
				f[k][w][j]=x[i][j];
			}
			s[k]++;
		}
        
		//每次循环都将新群心各元素置0
		for(i=0;i<c;i++)
			for(j=0;j<n;j++)
				z[1][i][j]=0;
		
		//计算新群心
		for(i=0;i<c;i++)
		{
			for(w=0;w<s[i];w++)
			{
				for(j=0;j<n;j++)
				{

					z[1][i][j]=z[1][i][j]+(1/s[i])*f[i][w][j];     //1代表新的群心,0代表上一个群心
				}
			}				
			//for(j=0;j<n;j++)
			//cout<<endl<<"xianshi"<<z[1][i][j]<<endl;
		}

        //判断新群心与旧群心是否完全相同,如不相同,则将标志flag置为1
		for(i=0;i<c;i++)
			for(j=0;j<n;j++)
				if(z[1][i][j]!=z[0][i][j])
				{
					flag=1;
					break;
				}

		//将计算所得的新群心传到旧群心中
		for(i=0;i<c;i++)
			for(j=0;j<n;j++)
				z[0][i][j]=z[1][i][j];
	}

	//输出最后的分群结果
	for(i=0;i<c;i++)
	{
		cout<<"输出第";
			cout<<i+1<<"个群:"<<endl;
		for(w=0;w<s[i];w++)
		{
			for(j=0;j<n;j++)
			cout<<f[i][w][j]<<"  ";
			cout<<"      ";
		}
		cout<<endl;
	}
}

⌨️ 快捷键说明

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