| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1410 人关注过本帖
标题:关于K均值算法的问题,有错误但不知如何改正,新手求解!
只看楼主 加入收藏
mzn
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2015-12-22
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:10 
关于K均值算法的问题,有错误但不知如何改正,新手求解!
k均值算法.rar (1.95 KB)
搜索更多相关主题的帖子: 如何 
2016-10-03 17:11
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:3 
void find(point *p,int *center)    //寻找新聚类中心函数:现在有三类,在每一类中寻找新的聚类中心,每一类中有N【k】个点,新的聚类中心点centre【K+1】向量坐标求和除上这类点的个数,再将十个样本点重新分类,迭代运算
{  int k,i;
 for(k=0;k<3;k++)
    for(i=0;i<K;i++)
    {  
     if(sample[i].label==center[k])
     (sample[center[K+1]].grid)+=(1\(N[k]))*sample[i].grid; //这一行改为sample[center[K+1]].grid+=(1/N[k])*sample[i].grid;,另外数组N没定义
     //错误
     //找到一个新的聚类中心center【K+1】
     center[k+1]=K+1;
    }
2016-10-03 17:21
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:4 
编译是没通过,所以看了几行代码。
point[K*2]={0,0,3,8,2,2,1,1,5,3,4,8,6,3,5,4,6,4,7,5};
        for(i=0;i<K;i++)
        for(j=0;j<DIM;j++)
        for(k=0;k<K;k++)
        {   
                 sample[i].grid[j]=point[k];
              
        }
估计你是想把point里的数两两赋值给sample[n].grid吧,但是这样写的结果就是将point[9]这个数赋值给sample[n].grid。
2016-10-03 20:02
mzn
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2015-12-22
收藏
得分:0 
回复 2楼 ehszt
作了修改后出现了这个错误error C2297: '*' : illegal, right operand has type 'float [2]',哪里还有问题呢?
2016-10-03 22:31
mzn
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2015-12-22
收藏
得分:0 
回复 3楼 linlulu001
请问具体应该怎么改呢
2016-10-03 22:32
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:0 
回复 5楼 mzn
你还是上代码
2016-10-04 09:35
mzn
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2015-12-22
收藏
得分:0 
回复 6楼 linlulu001
k均值算法.rar (2.04 KB)
2016-10-04 17:34
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:0 
你写的应该是K-均值聚类算法,我是有看没有懂。
http://wenku.baidu.com/view/79d7ae0102020740be1e9bf3.html?re=view
借鉴下别人的思路,或许对你有帮助。

顺便说下,上代码的意思是让你将代码复制到贴子上,而不是用一个压缩文件上传上来。
2016-10-04 23:47
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:3 
原则上,代码长度不超过文本框限制的话,复制粘贴会比较和谐友好。。。下载解压缩打开,,步骤太多。更何况有些问题是可以直接用肉眼看出来的。我们甚至不用运行调试。。。复制代码如下,未做任何修改。
程序代码:
//k均值算法:
//第一步:选K个初始聚类中心,z1(1),z2(1),…,zK(1),其中括号内的序号为寻找聚类中心的迭代运算的次序号。聚类中心的向量值可任意设定,例如可选开始的K个模式样本的向量值作为初始聚类中心。
//第二步:逐个将需分类的模式样本{x}按最小距离准则分配给K个聚类中心中的某一个zj(1)。
//假设i=j时,,则,其中k为迭代运算的次序号,第一次迭代k=1,Sj表示第j个聚类,其聚类中心为zj。
//第三步:计算各个聚类的新的中心zj(k+1),j=1,2,…,K

//其中Nj为第j个聚类域Sj中所包含的样本个数。以均值向量作为新的聚类中心,可使如下聚类准则函数最小:

//在这一步中要分别计算K个聚类中的样本均值向量,所以称之为K-均值算法。
//第四步:若,j=1,2,…,K,则返回第二步,将模式样本逐个重新分类,重复迭代运算;
//若,j=1,2,…,K,则算法收敛,计算结束。

//define
#define MAX 1000000
#define K 10
#define DIM 2

#include <stdio.h>
#include <math.h>
typedef struct{

    float grid[2];//erwei shuzu chucun dian de zuo biao
    int label; //shi juleizhongxin zhi wei 1

}point;
point sample[100];
//hanshu
//聚类准则函数
//最小距离准则函数min()
void min(float*a,float*b);//各点按最小距离分类
void find(point *p,int *center);//寻找新聚类中心函数

void classify(point *p,int *center);//归类
float distance(float*a,float*b);

void main()
{//将样本点坐标存入结构体
int i,j,k=0;
    float point[K*2]={0,0,3,8,2,2,1,1,5,3,4,8,6,3,5,4,6,4,7,5};
        for(i=0;i<K;i++)
        for(j=0;j<DIM;j++)
        for(k=0;k<K;k++)
        {   

                 sample[i].grid[j]=point[k];
             

        }
    int center[100]={0};
    center[0]=0;
    center[1]=1;
    center[2]=2;//给定初始三类聚类中心
   

    //jilu juleizhongxingeshu ,前面是聚类中心点xiabiao,后面新聚类中心
    //将样本点坐标存入结构体
        find(sample,center);
        classify(sample,center);

  printf("共有%d个聚类中心\n",center[K]);

  for(i=0;i<K;i++)
        if(sample[i].label==1)
            printf("  点%d为聚类中心\n",i+1);

        for(i=0;i<K;i++)
       

            if(sample[i].label!=1)
           

                printf("点%d属于聚类中心%d\n",i+1,sample[i].label);                  //改!!!!!!!!!!!!!!!!!
}
float distance(float *a,float *b)
{

    int i;
    float  distance=0;
    for(i=0;i<DIM;i++)
    {
        distance+=(a[i]-b[i])*(a[i]-b[i]);
    }
    return distance;
}
void min(float*a,float*b)//最小距离准则分类
{   int i,j,k;
float dis=MAX;
float dis1[1000000];//存储距离数组
float point[K*2]={0,0,3,8,2,2,1,1,5,3,4,8,6,3,5,4,6,4,7,5};
        for(i=0;i<K;i++)
    for(j=0;j<DIM;j++)
        for(k=0;k<K;k++)
    {   

             sample[i].grid[j]=point[k];
           

    }
   

int    center[100];
int    N[3]={0,0,0};//记录每一类中有几个点
    for(i=0;i<K;i++)
        for(k=0;k<3;k++)//选了三个初始聚类中心,依次和每个聚类中心在每个聚类中心内距离找最小值
    {  dis1[k]=distance(sample[i].grid,sample[center[k]].grid);
        if(dis1[k]<dis)
   

        { 

   

            dis=dis1[k];
      

            sample[i].label=center[k];
            N[k]++;
        }
    }


}
void find(point *p,int *center)    //寻找新聚类中心函数:现在有三类,在每一类中寻找新的聚类中心,每一类中有N【k】个点,新的聚类中心点centre【K+1】向量坐标求和除上这类点的个数,再将十个样本点重新分类,迭代运算
{  int k,i;
//修改
   int N[20];
//
 for(k=0;k<3;k++)
    for(i=0;i<K;i++)
    { 

     if(sample[i].label==center[k])
     //改(sample[center[K+1]].grid)+=(1\(N[k]))*sample[i].grid;
     sample[center[K+1]].grid+=(1/N[k])*sample[i].grid;
     //错误
     //找到一个新的聚类中心center【K+1】
     center[k+1]=K+1;
    }




 for(i=0;i<K;i++)
    for(k=0;k<K+1;k++)
        if(sample[center[K+1]].grid!=sample[center[k]].grid)//cuowu
        {   

            min(sample[i].grid,sample[center[k]].grid);
        }


}




/*
void find(point *p,int *center)    //寻找新聚类中心函数:现在有三类,在每一类中寻找新的聚类中心,每一类中有N【k】个点,新的聚类中心点centre【K+1】向量坐标求和除上这类点的个数,再将十个样本点重新分类,迭代运算
{  int k,i;

 for(k=0;k<3;k++)
    for(i=0;i<K;i++)
    { 

     if(sample[i].label==center[k])
     (sample[center[K+1]].grid)+=(1\(N[k]))*sample[i].grid; //这一行改为sample[center[K+1]].grid+=(1/N[k])*sample[i].grid;,另外数组N没定义
     //错误
     //找到一个新的聚类中心center【K+1】
     center[k+1]=K+1;
    }

*/






φ(゜▽゜*)♪
2016-10-05 10:34
mzn
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2015-12-22
收藏
得分:0 
回复 9楼 书生牛犊
谢谢,以后会注意的。
2016-10-06 12:36
快速回复:关于K均值算法的问题,有错误但不知如何改正,新手求解!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.081790 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved