📄 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 + -