模式识别“k-means”C语言程序,就是关于坐标点的划分问题,C语言高手请进!
来源:百度知道 编辑:UC知道 时间:2024/05/21 15:09:15
由于本人初学C语言不久,请用基本语句,并注明每一步的作用,详细!谢谢!有追加分数!
下面的这个看不懂,呵呵,再给总结下程序步骤:
1.在已知15个点中任意找出3点
2.比较12个点与3点距离并划分成3类
3.求3个类的中心值
4.比较所有15点与3个中心值距离并重新划分成3类
5.再求新中心、比较距离并划分...
6.当新中心值不再变化,即第n与n-1次中心值相同则输出结果。
简单点的改改!
写了一个,参考一下,有什么问题请说。
#include<stdio.h>
#include<math.h>
int x[15][3]={{3,1,0},{3,2,0},{2,2,0},{3,3,0},{2,3,0},{8,8,0},{8,9,0},{9,8,0},{9,7,0},{9,9,0},{16,5,0},{16,4,0},{15,5,0},{15,6,0},{16,6,0}};
double oldcentral[3][3];//旧的中心点的坐标
double newcentral[3][3];//计算距离,分类后求平均值得到的新的中心点的坐标
int clas[15];//15个点各属于哪个类,类的编号从0开始
int clsno;
int minDist(double x,double y,double z) //计算三个数的最小值,返回其序号。
{
if(x<=y&&x<=z)
return 0;
if(y<x&&y<=z)
return 1;
if(z<x&&z<y)
return 2;
}
double distA(int i,int j)//计算两个点的距离,i和j分别是数组x和newcentral中的序号
{
double distx,disty,distz,dist;
distx=(double)x[i][0]-(double)newcentral[j][0];
disty=(double)x[i][1]-(double)newcentral[j][1];
distz=(double)x[i][2]-(double)newcentral[j][2];
dist=sqrt(distx*distx+disty*disty+distz*distz);
return dist;
}
<