zoukankan      html  css  js  c++  java
  • 模糊聚类分析的实现

    模糊聚类分析的实现(CuteFuzzy V0.5 Released)              

    摘要: 

           在本文中,介绍了基本的模糊聚类分析及模糊聚类图的绘制的算法及其程序。

     

     

    1前言:

           1.1模糊数学简介:

    模糊数学是伴随着上世纪五六十年代兴起的控制论、信息论、系统论(俗称“老三论”)而形成的一种分析统计数据以及给出决策的方法。模糊数学公认的创史人是Lotfi Zadeh教授。

          

    他对该门学科的开山之作是:

    Zadeh, Lotfi A., "Fuzzy Sets ," Information and Control, Vol. 8 (1965), pp. 338-353.

           (该文可以在下面这个网址下载http://www-bisc.cs.berkeley.edu/)

          

    模糊数学对于现实的意义,直观的理解可以主要从以下两个方面进行:

           控制:举个例子来说,比方说:一辆有模糊控制系统的火车,将能理解这样的命令------“比平常的速度加快一点”,这加快,便是一个模糊的概念,以往的控制系统,如果不给出加快多少或者是加快的呈度,是很难完成这样的任务的。

           决策与分析:比方说,眼前有一堆学生的考试成绩资料,如果要做一次针对学生学习能力的分析(虽然未必全能从考试成绩反映出来),要求给出将学习成绩好,较好,一般,较差,很差的学生进行分类,即将各个学生划进相应的“群落”中,以便于教师更好的组织教学工作。这里,就可以用模糊聚类的方法来解决。

          

           在学科分类上,与模糊数学较近的方法主要是软计算方面的一些方法,如人工神经网络、遗传算法、DNA计算等。它们在解决一些常用方法无法或难以解决的问题时,有相当不错的效果。

           模糊数学主要可以解决的问题有:数据的分类,模式识别,模糊决策与控制等。再举一些例子来说明吧:如可以用C-MEAN法来对一幅图片进行分割,提取其中的有效信息(聚类分析);再如,有世界各地的山区的土质的各方面的数据,需要分析哪些地区的土质情况较为接近(聚类分析)。

     

     

           1.2聚类分析:

           聚类分析的概念主要是来自多元统计分析,例如,考虑二维坐标系上有散落的许多点,这时,需要对散点进行合理的分类,就需要聚类方面的知识。

           模糊聚类分析方法主要针对的是这样的问题:对于样本空间P中的元素含有多个属性,要求对其中的元素进行合理的分类。最终可以以聚类图的形式加以呈现,而聚类图可以以手式和自动生成两种方式进行,这里采用自动生成方式,亦是本文的程序实现过程中的一个关键环节。

     

           2模糊聚类的步骤及其关键算法:

           这里所实现的基本的模糊聚类的主要过程是一些成文的方法,在此简述如下:

           对于待分类的一个样本集U={u1,u2,...,un},设其中的每个元素有m项指标,则可以用m维向量描述样本,即:ui={ui1,ui2,...,uim}(i=1,2,...,n)。则其相应的模糊聚类按下列步骤进行:

    1)  标准化处理,将数据压缩至(0-1)区间上,这部分内容相对简单,介绍略。(参[1])

    2)  建立模糊关系:

    这里比较重要的环节之一,首先是根据“距离”或其它进行比较的观点及方法建立模糊

    相似矩阵,主要的“距离”有:

    Hamming 距离: d(i,j)=sum(abs(x(i,k)-x(j,k))) | k from 1 to m

    (| k from 1 to m表示求和式中的系数k由1增至m,下同)

    Euclid  距离:  d(i,j)=sum((x(i,k)-x(j,k))^2)  | k from 1 to m

     

    非距离方法中,最经典的就是一个夹角余弦法:

                                                    

     

     

    最终进行模糊聚类分析的是要求对一个模糊等价矩阵进行聚类分析,而由相似矩阵变换

    到等价矩阵,由于相似矩阵已满足对称性及自反性,并不一定满足传递性,则变换过程主要进行对相似矩阵进行满足传递性的操作。使关系满足传递性的算法中,最出名的,就是Washall算法了,又称传递闭包法(它的思想在最短路的Floyd算法中亦被使用了)。

           算法相当简洁明了,复杂度稍大:O(log2(n)*n^3),其实就是把一个方阵的自乘操作,只不过这里用集合操作的交和并取代了原先矩阵操作中的*和+操作,如下:(matlab代码)

    %--washall enclosure algorithm--%

    unchanged=0;

    while unchanged==0

        unchanged=1;

        %--sigma:i=1:n(combine(conj(cArr(i,k),cArr(k,j))))

           for i=1:cArrSize

                  for j=1:cArrSize

                mergeVal=0;

                         for k=1:cArrSize

                             if(cArr(i,k)<=cArr(k,j)&&cArr(i,k)>mergeVal)          

                                              mergeVal=cArr(i,k);

                                elseif(cArr(i,k)>cArr(k,j)&&cArr(k,j)>mergeVal)

                                              mergeVal=cArr(k,j);

                    end

                         end

                         if(mergeVal>cArr(i,j))

                                copyCArr(i,j)=mergeVal;

                                unchanged=0;

                         else

                                copyCArr(i,j)=cArr(i,j);

                         end

                  end

           end

        %--copy back--%

        for i=1:cArrSize

            for j=1:cArrSize

                cArr(i,j)=copyCArr(i,j);

            end

        end

    end

     

    3)  建立完等价矩阵cArr后,接下来就是聚类的过程了,聚类的方法其实是相当好做的。

    取门限值limitLine,值由1递减至0递减幅度为0.1。在每一轮聚类过程中,凡是至cArr(i,j)>=limitLine的位置在0-1矩阵中均置1,而<limitLine的值都置0。若有相同的两列或多列,即表示这些列彼此之前接近,则列的标号即代表原来的元素,作为一组中的元素加以记录。不断重复上述过程直至最终归为一类。

           聚类算法可以被描述成一个找出等价类的算法,复杂度O(n^2)(仍有改进的余地),描述如下:(matlab code)

     

    %--cluster--%

    limitLine=1;                                   ‘聚类门限起始值

    limitStep=0.1;                                ‘聚类门限步进值

    expectedLimit=0.6;                         ‘聚类下限值

     

    comArr=zeros(1,cArrSize);             ‘将各列的值用一个唯一的二进制数表示,便于比较

    groupIndentifyArr=zeros(1,cArrSize); ’当前该轮聚类分析中各元素所在的组号

    groupDelegateArr=zeros(1,cArrSize); ‘当前该轮聚类分析中各组的代表元素

    groupNum=1;

     

    while(limitLine>=expectedLimit)

                  %----construct Boolean array---

    for i=1:cArrSize

                         for j=1:cArrSize

                                if(cArr(i,j)<limitLine)

                                       cBoolArr(i,j)=0;

                                else

                                       cBoolArr(i,j)=1;

                                end               

                         end

                  end

     

                  %--make the comparation arr--%

                  for j=1:cArrSize

                         tempVal=0;

                         for i=1:cArrSize

                                tempVal=tempVal+cBoolArr(i,j)*2^(i-1);

                         end

                         comArr(j)=tempVal;

                  end 

                 

                  %--core part: pation the equivalence class--%

                 

                  %--initialize part--%

                  groupIndentifyArr(1)=1;

                  groupDelegateArr(1)=1;

                  groupNum=1;

                 

                  %--main part of the algorithm--%

                        for i=2:cArrSize

                           flag=0;

                         for count=1:groupNum  %如果当前的元素属于已分出的组,则并出其所在的组

      ...

  • 相关阅读:
    分布式id生成
    DB主从一致性架构优化4种方法
    Mysql在大型网站的应用架构演变
    win10下iis绑定局域网ip无效的解决方案
    css随笔
    html标签说明
    C# JSON序列化日期格式问题
    使用事件机制相比直接调用函数的优势
    C#绑定事件时使用匿名函数
    C# t4模版引擎笔记 引入外部dll
  • 原文地址:https://www.cnblogs.com/feisky/p/1586311.html
Copyright © 2011-2022 走看看