07.K-means聚类

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const double inf=1.0*(0x3f3f3f3f);
const double eps=1e-6;
double solve(double x[][5],int m,int K,int n)//训练样本数 簇数量 样本维数(默认m>K 
{
  double mu[10][5];
  for(int i=1;i<=K;i++)//多次运行避免局部最优时需要随机初始点,这里直接选前K个 
  {
	for(int j=1;j<=n;j++)
	mu[i][j]=1.0*x[i][j];
  }
  int Kind[20];
  int t=10000;
  while(t--)
  {
		
	for(int i=1;i<=m;i++)//遍历训练集 
	{
	  double mi=inf;
	  int kind=0;
	  for(int j=1;j<=K;j++)//遍历簇 
	  {
	  	double tmp=0.0;
		for(int k=1;k<=n;k++)//便于扩展所以这里用循环算距离 
		{
		  tmp=1.0*tmp+(1.0*x[i][k]-1.0*mu[j][k])*(1.0*x[i][k]-1.0*mu[j][k]);
		} 
		if(tmp<mi)
		{
		  mi=1.0*tmp;
		  kind=j;
		}
	  }
	  Kind[i]=kind;
	}
	
	//计算新的簇中心位置 
	int num[20];
	for(int i=1;i<=K;i++)
	{
	  num[i]=0;
	  for(int k=1;k<=n;k++)
	  mu[i][k]=0.0; 
	}
	for(int i=1;i<=m;i++)
	{
	  num[Kind[i]]++;
	  for(int k=1;k<=n;k++)
	  mu[Kind[i]][k]+=(1.0*x[i][k]);			
	}
	for(int i=1;i<=K;i++)
	{
		if(num[i]>0)
		{
		  for(int k=1;k<=n;k++)
	      mu[i][k]=1.0*mu[i][k]/num[i];
		}
	}
	
  }
  for(int i=1;i<=K;i++)
  {
  	for(int k=1;k<=n;k++)
  	cout<<mu[i][k]<<" ";
  	cout<<endl;
  }
}
int main()
{
  double x[20][5];
  x[1][1]=1,x[1][2]=1;
  x[2][1]=1,x[2][2]=2;
  x[3][1]=2,x[3][2]=1;
  x[4][1]=2,x[4][2]=2;
  
  x[5][1]=10,x[5][2]=1;
  x[6][1]=10,x[6][2]=2;
  x[7][1]=9,x[7][2]=1;
  
  x[8][1]=3,x[8][2]=9;
  x[9][1]=4,x[9][2]=9;
  x[10][1]=4,x[10][2]=10;
  int m=10,K=3,n=2;
  solve(x,10,3,2);
  
  return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值