CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  数据库(包含打印,安装,报表)

关于利用k均值算法解决分类的问题!

楼主cathyli()2005-04-03 12:48:08 在 VB / 数据库(包含打印,安装,报表) 提问

不知道那位大侠曾经编过这个程序,希望能够共同探讨一下.这几天我编了一个正在调试,我也可以共享我的,希望能得到大家的帮助.thank   you1 问题点数:50、回复次数:8Top

1 楼laviewpbt(人一定要靠自己)回复于 2005-04-03 12:58:45 得分 40

以前写过模糊K均值,FCM,HCM以及降维对分法对图象进行分割,可以研究研究。Top

2 楼cathyli()回复于 2005-04-03 14:46:48 得分 0

谢谢这位朋友的回复,目前还有一点问题,那我就把自己编的代码传上去,麻烦你给我看看.可能还有一些功能不够完善,我希望把分类的结果用直方图或者饼图显示出来,我会继续做改进的,thank   you!  
  Dim   tp(1000)   As   Integer  
  Const   k   =   3  
  Dim   t   As   Integer  
  Dim   s   As   Integer  
  Dim   test   As   Integer  
  Private   Sub   Form_Load()  
  Dim   i   As   Integer  
  Dim   strSQL   As   String  
  Dim   RecordDate   As   Recordset                         '保存SQL语句搜索结果的记录集  
    Set   g_Conn   =   New   Connection  
      '连接到数据库  
      With   g_Conn  
            .CursorLocation   =   adUseClient  
            .CommandTimeout   =   10  
            '   连接到ACCESS数据库  
            .ConnectionString   =   "Provider=Microsoft.Jet.OLEDB.4.0;Password='';"   &   _  
            "Data   Source="   &   App.Path   &   "\"   &   "ana\db2.mdb"  
            .Open  
      End   With  
          Adoana.ConnectionString   =   g_Conn.ConnectionString  
           
          strSQL   =   "select   id   ,SCO   from   score"  
          Set   RecordDate   =   g_Conn.Execute(strSQL)  
           
          Dim   px(1000)   As   Integer  
          Dim   py(1000)   As   Single  
          Dim   zx(3)   As   Integer  
          Dim   zy(3)   As   Single  
          Dim   z0x(3)   As   Integer  
          Dim   z0y(3)   As   Single  
          Dim   dx(1000)   As   Integer  
          Dim   dy(1000)   As   Single  
          Dim   d(1000)   As   Single  
           
          px(i)   =   RecordDate("id").Value  
          py(i)   =   RecordDate("sco").Value  
   
  '选k个初始聚类中心     z[i]  
    For   i   =   0   To   2  
      z0x(i)   =   px(i)  
      z0y(i)   =   py(i)  
  Next   i  
  For   i   =   1   To   total  
  tp(i)   =   0  
  Next   i  
   
  '进行迭代,对total个样本根据聚类中心进行分类  
   
  Dim   t   As   Integer  
  t   =   0   '记录point[i]暂时在哪个类中  
  For   i   =   1   To   total  
  For   j   =   1   To   k  
  dx(i)   =   px(i)   -   z0x(j)  
  dy(i)   =   py(i)   -   z0y(j)  
  dx(t)   =   px(i)   -   z0x(t)  
  dy(t)   =   py(i)   -   z0y(t)  
   
   
   
  If   (distance(dx(t),   dy(t)))   >   (distance(dx(i),   dy(i)))   Then  
  t   =   j  
    End   If  
  Next   j  
  tp(i)   =   t  
  Print   "经比较后,点(px(i),py(i))属于   t   类"  
  Next   i  
   
  For   i   =   1   To   k     '计算新的聚类中心  
  Call   newcentre(i)  
  Print   "初始时第{i}类中心为   zx(i),zy(i)"  
   
  If   (zx(i)   Eqv   z0x(i)   And   zy(i)   Eqv   z0y(i))   Then   '对前后两次的聚类中心进行比较  
    test   =   test   +   1  
  Else:   z0x(i)   =   zx(i)  
              z0y(i)   =   zy(i)  
  Next   i  
   
   
  While   (test   <>   k)       '进行迭代  
    For   i   =   1   To   total  
    For   j   =   1   To   k  
  dx(i)   =   px(i)   -   z0x(j)  
  dy(i)   =   py(i)   -   z0y(j)  
  dx(t)   =   px(i)   -   z0x(t)  
  dy(t)   =   py(i)   -   z0y(t)  
  Call   distance(dx(i),   dy(t))  
   
  If   (distance(dx(t),   dy(t)))   >   (distance(dx(i),   dy(i)))   Then  
  t   =   j  
    End   If  
  Next   j  
  tp(i)   =   t  
  Print   "经比较后,点(px(i),py(i))属于   t   类"  
   
  Next   i  
   
   
  For   i   =   1   To   k  
  Call   newcentre(i)  
  Print   "第{i}类中心为   zx(i),zy(i)"  
   
   
  If   (zx(i)   Eqv   z0x(i)   And   zy(i)   Eqv   z0y(i))   Then  
    test   =   test   +   1  
  Else:   z0x(i)   =   zx(i)  
              z0y(i)   =   zy(i)  
  Next   i  
  Wend  
   
  s   =   s   +   1  
  Print   "第s次迭代后,点(px(i),py(i))属于   t   类"  
  End   Sub  
   
  Sub   distance(dx(),   dy())  
  d(i)   =   dx()   *   dx()   +   dy()   *   dy()  
  End   Sub  
   
  '计算新的聚类中心  
  Sub   newcentre(i)  
  Dim   m   As   Integer  
  Dim   sumx   As   Single  
  Dim   sumy   As   Single  
  Const   n   =   0  
  For   i   =   1   To   total  
    If   tp(i)   =   i   Then  
    sumx   =   px(i)   +   sumx  
    sumy   =   py(i)   +   sumy  
  n   =   n   +   1  
  Next   i  
  zx(i)   =   sumx   /   n  
  zy(i)   =   sumy   /   n  
  Print   "zx(i)   is:";   zx(i)  
  Print   "zy(i)   is:";   zy(i)  
   
  End   Sub  
   
   
  此外数据库我只设置了两个字段,一个是客户的"id",还有一个是客户的评分值"sco".再此谢过了Top

3 楼laviewpbt(人一定要靠自己)回复于 2005-04-03 18:18:48 得分 0

呵呵    
  对象不一样啊,我的是图象,不过算法也差不多,可惜现在忙的要死,有空帮你看看  
  我用模糊K均值只是把图象分成2部分的,好象这是模式识别的内容。  
   
  Top

4 楼cathyli()回复于 2005-04-03 18:45:53 得分 0

关于图象方面我也看到过一些,好象思想精髓都差不多,把相似的归到一起.不过还是谢谢你!,希望你尽快有空,好交流一下.Top

5 楼nbamjzhldm()回复于 2005-04-03 19:50:57 得分 10

upTop

6 楼cathyli()回复于 2005-04-04 09:30:43 得分 0

自己顶一下,希望更多的人参与进来Top

7 楼cathyli()回复于 2005-04-04 15:55:23 得分 0

不要沉了呀Top

8 楼cathyli()回复于 2005-04-04 16:00:07 得分 0

昨晚又调试了一下,但是就是运行不出来,还请个位大侠帮帮看看  
  Dim   tp(1000)   As   Integer  
  Const   k   =   3  
  Dim   t   As   Integer  
  Dim   s   As   Integer  
  Dim   test   As   Integer  
  Dim   px(1000)   As   Single  
          Dim   py(1000)   As   Single  
          Dim   zx(3)   As   Double  
          Dim   zy(3)   As   Double  
          Dim   z0x(3)   As   Double  
          Dim   z0y(3)   As   Double  
          Dim   dx(1000)   As   Single  
          Dim   dy(1000)   As   Single  
          Dim   d(1000)   As   Single  
   
  Private   Sub   Form_Load()  
  Dim   i   As   Integer  
  Dim   strSQL   As   String  
  Dim   RecordDate   As   Recordset                         '保存SQL语句搜索结果的记录集  
    Set   g_Conn   =   New   Connection  
      '连接到数据库  
      With   g_Conn  
            .CursorLocation   =   adUseClient  
            .CommandTimeout   =   10  
            '   连接到ACCESS数据库  
            .ConnectionString   =   "Provider=Microsoft.Jet.OLEDB.4.0;Password='';"   &   _  
            "Data   Source="   &   App.Path   &   "\"   &   "db2.mdb"  
            .Open  
      End   With  
          Adoana.ConnectionString   =   g_Conn.ConnectionString  
           
          strSQL   =   "select   id   ,SCO   from   score"  
          Set   RecordDate   =   g_Conn.Execute(strSQL)  
           
           
           
          px(i)   =   RecordDate("id").Value  
          py(i)   =   RecordDate("sco").Value  
   
  '选k个初始聚类中心     z[i]  
    For   i   =   0   To   2  
      z0x(i)   =   px(i)  
      z0y(i)   =   py(i)  
  Next   i  
  For   i   =   1   To   total  
  tp(i)   =   0  
  Next   i  
   
  '进行迭代,对total个样本根据聚类中心进行分类  
   
  Dim   dx(1000)   As   Integer  
  t   =   0   '记录point[i]暂时在哪个类中  
  For   i   =   1   To   total  
  For   j   =   1   To   k  
  dx(i)   =   px(i)   -   z0x(j)  
  dy(i)   =   py(i)   -   z0y(j)  
  dx(t)   =   px(i)   -   z0x(t)  
  dy(t)   =   py(i)   -   z0y(t)  
   
  Dim   r  
  Dim   f  
   
  r   =   distance(dx(t),   dy(t))  
  f   =   distance(dx(i),   dy(i))  
   
  If   (r   >   f)   Then  
  t   =   j  
    End   If  
  Next   j  
  tp(i)   =   t  
  Print   "经比较后,点(px(i)   ,py(i))属于   t   类"  
  Next   i  
   
  For   i   =   1   To   k     '计算新的聚类中心  
   
  Call   newcentre(i)  
  Print   "初始时第{i}类中心为   zx(i),zy(i)"  
   
  If   (zx(i)   Eqv   z0x(i)   And   zy(i)   Eqv   z0y(i))   Then   '对前后两次的聚类中心进行比较  
    test   =   test   +   1  
  Else:   z0x(i)   =   zx(i)  
              z0y(i)   =   zy(i)  
  End   If  
  Next   i  
   
   
  While   (test   <>   k)       '进行迭代  
    For   i   =   1   To   total  
    For   j   =   1   To   k  
  dx(i)   =   px(i)   -   z0x(j)  
  dy(i)   =   py(i)   -   z0y(j)  
  dx(t)   =   px(i)   -   z0x(t)  
  dy(t)   =   py(i)   -   z0y(t)  
  Dim   s  
  Dim   m  
  Dim   n  
   
  r   =   distance(dx(t),   dy(t))  
  f   =   distance(dx(i),   dy(i))  
  If   r   >   f   Then  
  t   =   j  
    End   If  
  Next   j  
  tp(i)   =   t  
  Print   "经比较后,点(px(i),py(i))属于   t   类"  
   
  Next   i  
   
   
  For   i   =   1   To   k  
  Call   newcentre(i)  
  Print   "第{i}类中心为   zx(i),zy(i)"  
   
   
  If   (zx(i)   Eqv   z0x(i)   And   zy(i)   Eqv   z0y(i))   Then  
    test   =   test   +   1  
  Else:   z0x(i)   =   zx(i)  
              z0y(i)   =   zy(i)  
              End   If  
  Next   i  
   
  Wend  
   
  s   =   s   +   1  
  Print   "第s次迭代后,点(px(i),py(i))属于   t   类"  
  End   Sub  
  Function   distance(m,   n)  
  s   =   m   *   m   +   n   *   n  
  End   Function  
   
  '计算新的聚类中心  
  Function   newcentre(i)  
  Dim   m   As   Integer  
  Dim   sumx   As   Double  
  Dim   sumy   As   Double  
  v   =   1         (本来这里应该初始值应该是0的,但是一改为0,下面的除法就会报错)  
   
  For   j   =   1   To   total  
    If   tp(j)   =   i   Then  
    sumx   =   px(j)   +   sumx  
    sumy   =   py(j)   +   sumy  
   
  v   =   v   +   1  
   
  End   If  
  Next   j  
   
  zx(i)   =   sumx   \   v  
  zy(i)   =   sumy   \   v  
   
  Print   "zx(i)   is:";   zx(i)  
  Print   "zy(i)   is:";   zy(i)  
   
  End   FunctionTop

相关问题

  • 均值??
  • 寻找int[k]数组的快速排序算法
  • 请问哪儿有K-L变换的具体算法?
  • 求救啊!谁知道k最短路径搜索算法啊?
  • 搜索引擎可以利用那些算法呢???
  • 注册系统中如何利用md5算法加密?
  • 谁能用C实现参数为给定均值产生符合泊松分布的随机数的函数或算法,至少能处理均值在10^6那么大的数?重奖!
  • 算法
  • 算法
  • 算法!

关键词

  • 数据库
  • 连接
  • z0
  • integerdim
  • zx
  • zy
  • sumy
  • sumx
  • dy
  • py

得分解答快速导航

  • 帖主:cathyli
  • laviewpbt
  • nbamjzhldm

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo