程序实现:

上面的公式看似复杂,其实我们关心的就是最后的5个计算步骤,这里说明一下,有的书上以隶属度矩阵的某一范数小于一定值作为收敛的条件,这也可,不过计算量稍微要大一点了。

程序采用VB6.0编制,完全按照以上的步骤进行。

'程序实现功能:模糊聚类和硬聚类
'作    者: laviewpbt
'联系方式: laviewpbt@sina.com
'QQ:33184777
'版本:Version 2.3.1
'说明:复制请保留源作者信息,转载请说明,欢迎大家提出意见和建议

Private Declare Function GetTickCount Lib "kernel32" () As Long

Private Enum IniCenterMethod    '初始中心的方法
    CreateRandom                '随机的中心点
    CreateByHcm                 '由HCM创建的中心点
    CreateByRandomZadeh         '先随机创建隶属矩阵,然后计算得到的中心点

CreateByHand                '手工确定初始中心点

End Enum

Private Enum AntiFuzzyMethod    '反模糊的方法
    Max                         '最大隶属度法
    Middle                      '中位数法
    Mean                        '加权均值法
End Enum

Private Type FcmInfo
     Center() As Double         '聚类中心
     Degree() As Double         '隶属度,为Double类型
     Class() As Byte            '记录数据属于那一类
     TimeUse As Long            '所用时间
     Iterations  As Long        '迭带次数
     ErrMsg As String           '错误信息
End Type

Private Type HcmInfo
    Center() As Double          '聚类中心
    Class() As Byte             '记录数据属于那一类
    TimeUse As Long             '所用时间
    Iterations  As Long         '迭带次数
    ErrMsg As String            '错误信息
End Type

'*************************************************************************************
'*    作    者 :    laviewpbt
'*    函 数 名 :    Fcm
'*    参    数 :    Data     -   待分类的样本,第一维的大小表示样本的个数,
'*                                第二维的大小表示样本的维数
'*                   Cluster  -   分类数
'*                   CreateIniCenter - 初始聚类中心的创建方法
'*                   AntiFuzzy -  反模糊化的方法
'*                   Exponent  -  一个控制聚类效果的参数,一般取2
'*                   Maxiterations  - 最大的迭代次数
'*                   MinImprovement - 最小的改进参数(两次迭代间聚类中心的距离)
'*    返回值 :      FcmInfo结构,记录了相关的参数
'*    功能描述 :    利用模糊理论的聚类方法把数据分类
'*    日    期 :    2004-10-27 10.25.32
'*    修 改 人 :    laviewpbt
'*    日    期 :    2006-11-7 19.25.31
'*    版    本 :    Version 2.3.1
'**************************************************************************************

Private Function Fcm(ByRef Data() As Double, ByVal Cluster As Long, Optional ByVal CreateIniCenter As IniCenterMethod = IniCenterMethod.CreateByHcm, Optional AntiFuzzy As AntiFuzzyMethod = Max, Optional Exponent As Byte = 2, Optional Maxiterations As Long = 400, Optional MinImprovement As Double = 0.01, Optional ByRef CenterByHandle As Variant) As FcmInfo
    If ArrayRange(Data) <> 2 Then
        Fcm.ErrMsg = "数据只能为二维数组"
        Exit Function
    End If
    Dim i As Long, j As Long, k As Long, l As Long, m As Long
    Dim DataNumber As Long, DataSize As Long
    Dim Temp As Double, Sum1 As Double, Sum2 As Double, Sum3 As Double, Index As Integer
    Dim OldCenter() As Double
    Fcm.TimeUse = GetTickCount
    DataNumber = UBound(Data, 1): DataSize = UBound(Data, 2)
    ReDim Fcm.center(1 To Cluster, 1 To DataSize) As Double
    ReDim Fcm.Degree(1 To Cluster, 1 To DataNumber) As Double
    ReDim Fcm.Class(1 To DataNumber) As Byte
    ReDim OldCenter(1 To Cluster, 1 To DataSize) As Double
    On Error GoTo ErrHandle:
    Randomize
    If CreateIniCenter = CreateRandom Then
        For i = 1 To Cluster
            For j = 1 To DataSize
                OldCenter(i, j) = Data(Rnd * DataNumber, j)    '产生随机初始中心点
            Next
        Next
    ElseIf CreateIniCenter = CreateByHcm Then
        Dim HcmCenter As HcmInfo
        HcmCenter = Hcm(Data, Cluster)
        For i = 1 To Cluster
            For j = 1 To DataSize
                OldCenter(i, j) = HcmCenter.center(i, j)   '产生HCM初始中心点
            Next
        Next
    ElseIf CreateIniCenter = CreateByRandomZadeh Then
        ReDim RndDegree(1 To Cluster, 1 To DataNumber) As Double
        Dim RndSum As Double
        For i = 1 To Cluster
            For j = 1 To DataNumber
                RndDegree(i, j) = Rnd           '创建随机的隶属度
            Next
        Next
        For j = 1 To DataNumber
            RndSum = 0
            For i = 1 To Cluster
                RndSum = RndSum + RndDegree(i, j)
            Next
            For i = 1 To Cluster
                RndDegree(i, j) = RndDegree(i, j) / RndSum   '隶属度矩阵每列之后必须为1
            Next
        Next
       
        For i = 1 To Cluster
            For j = 1 To DataSize
                Sum1 = 0: Sum2 = 0
                For k = 1 To DataNumber
                    Temp = Exp(Log(RndDegree(i, k)) * Exponent)  '其实就是RndDegree(i, k)^Exponent
                    Sum1 = Sum1 + Temp * Data(k, j)           '隶属度的平方乘以数值
                    Sum2 = Sum2 + Temp                        '隶属度的和
                Next
                OldCenter(i, j) = Sum1 / Sum2                 '得到聚类中心
            Next
        Next
    ElseIf CreateIniCenter = CreateByHand Then
        If IsMissing(CenterByHandle) Then
            Fcm.ErrMsg = "请提供初始聚类中心。."
            Exit Function
        ElseIf UBound(CenterByHandle, 1) <> Cluster Or UBound(CenterByHandle, 2) <> DataSize Then
            Fcm.ErrMsg = "手工提供的初始聚类中心维数有错误."
            Exit Function
        End If
        For i = 1 To Cluster
            For j = 1 To DataSize
                OldCenter(i, j) = CenterByHandle(i, j)
            Next
        Next
    End If

Do
        Fcm.Iterations = Fcm.Iterations + 1
        For i = 1 To Cluster

本文转自feisky博客园博客,原文链接:http://www.cnblogs.com/feisky/archive/2009/03/14/1586312.html,如需转载请自行联系原作者

模糊聚类算法(FCM)和硬聚类算法(HCM)的VB6.0实现及相关推荐

  1. 颜色迁移之四——模糊聚类(FCM)算法

    伴随着模糊集理论的形成.发展和深化,RusPini率先提出模糊划分的概念.以此为起点和基础,模糊聚类理论和方法迅速蓬勃发展起来.针对不同的应用,人们提出了很多模糊聚类算法,比较典型的有基于相似性关系和 ...

  2. 聚类算法及python实现——模糊C均值(FCM)

    聚类算法及python实现--模糊C均值(FCM) 模糊C和K均值的区别 K均值:硬聚类,隶属度只有0和1,基于"类内误差平方和最小化"原则 模糊C:模糊聚类,隶属度取值为[0,1 ...

  3. 两种聚类方法——K均值聚类(K-means)算法和模糊C均值聚类(FCM)算法的简述与在MATLAB中的实现

    目录 1.K-means算法 1.1算法流程 1.2程序实现 1.3实验结果 原始数据集 聚类结果 2.FCM算法 2.1算法流程 2.2程序设计 FCM子函数 主函数 2.3实验结果 原始数据集 聚 ...

  4. 【主色提取】模糊C均值(FCM )聚类算法和彩色图像快速模糊C均值( CIQFCM )聚类算法

    系列文章目录 第一章 主色提取入门之FCM 和 CIQFCM 目录 系列文章目录 前言 一.FCM 聚类算法 1 基本思想 ​编辑 2 FCM 的缺陷 二.CIQFCM 聚类算法 1 集群空间映射 1 ...

  5. 模式识别经典算法——FCM图像聚类分割(最简matlab实现)

    算法的规格 算法的记号及参数 记号 更新公式 算法的流程 数学语言与程序语言 算法的实现matlab 客户端程序 FCM函数 效果演示 敛散性分析 聚类分割效果图 避免出现局部极小值的方法 从kmea ...

  6. 聚类之 FCM 算法原理及应用(Java可视化实现)

    模糊 C 均值(Fuzzy C-means)算法简称 FCM 算法,是一种基于目标函数的模糊聚类算法,主要用于数据的聚类分析. 限于篇幅和数学公式的表达,笔者誊写了一篇文档用于介绍FCM的数学推导,这 ...

  7. 基于模糊C均值聚类(FCM)的图像分割原理

    基于模糊C均值聚类(FCM)的图像分割原理 图像分割概述 图像分割就是把图像细分为构成它的对象或子区域,这些区域是互不相交的,每个区域都满足特定区域的一致性.分割的程度主要取决于人们想要解决的问题,当 ...

  8. 非局部相似性 matlab,基于引导核聚类的非局部均值图像去噪算法

    非局部均值(nonlocal means, NLM)图像去噪算法是根据图像中存在的大量冗余信息,用非局部自相似性原理抑制噪声的算法.最初的NLM算法由文献[ 在NLM改进算法中,文献[[在相似窗结构张 ...

  9. denclue 聚类_密度分布函数的聚类denclue算法步骤.ppt

    数据挖掘原理与应用宝典元昌安主编邓松李文敬刘海涛编著电子工业出版社主要内容聚类分析原理聚类分析常用算法分类划分聚类方法层次聚类方法基于密度的聚类方法基于网格的聚类方法基于模型的聚类方法高维数据的聚类方 ...

最新文章

  1. Handler消息传递机制
  2. 谷歌大脑2017总结下篇:从医疗、机器人等6个领域开始的改变世界之旅
  3. oracle删除无效归档日志,求助:rman无法按照策略删除过期的归档日志
  4. python高级编程技巧
  5. C语言实现AES加密解密
  6. $con=mysql_connect_php连接mysql mysql_connect()与mysqli_connect()的盲点
  7. class matplotlib.figure.Figure
  8. python怎么打开turtle_python的turtle库真好玩
  9. Shell Curses 函数库
  10. 三种短链接生成源码-iApp源码
  11. 基于图书管理系统的需求分析之数据流图
  12. 高考成绩真的可以改了?
  13. ubuntu系统下耳机没声音(已解决)
  14. hashcat的使用及相关
  15. 俄罗斯计算机三进制优缺点,为什么我们没有用上三进制的计算机
  16. Latex + vscode + SumatraPdf配置的一些历程
  17. JDBC简单连接查询MySQL数据库
  18. 面试了一位 阿里出来的46 岁的程序员,思绪万千,最后结局居然...
  19. Redis的内存用完了会发生什么?
  20. 无符号数与有符号数比较大小

热门文章

  1. 利用并查集判断一个无向图是否成树
  2. Codeforces Round #169 (Div. 2)
  3. 结对编程项目的过程记录与收获
  4. (转)open gl 实例 demo ---vs2005 环境
  5. 【转】Burp Suite详细使用教程-Intruder模块详解
  6. FastDfs分片上传文件实战
  7. Hyperledger Fabric 2.2.1 区块链问题汇总(持续更新)
  8. Python学习笔记之列表切片(六)
  9. mysql数据库根目录恢复_MySQL中数据导入恢复的简单教程
  10. ES5(三)——数组新增函数every()、some()、map()、foreach()、filter()和reduce()汇总