摘要:

  针对于单一核在处理多数据源和异构数据源方面的不足,多核方法应运而生。本文是将多核方法应用于FCM算法,并对算法做以详细介绍,进而采用MATLAB实现。

  在这之前,我们已成功将核方法应用于FCM算法,在很大程度上解决了样本线性不可分的情况。但是这种单一核局限于对数据的某一特征进行有效提取,若一个样本含有多个特征,且遵循不同的核分布,单一核学习就不适用,所以说单一核在处理多数据源以及异构数据源的不足是越发明显。

  针对于单一核学习不足,我们可以同时结合多个核函数对数据的多种特征进行同步描述,并且自适应的调整核函数权重对多个核函数进行凸组合,这在一定程度上可以避免了最佳核函数的选择,将这种方法我们称之为多核。

一 多核模糊C均值聚类算法概述

  多核方法的本质是用组合后的核函数代替之前的单一核函数。本文主要是将多核方法应用到FCM算法当中,我们暂且将其命名为多核模糊C均值聚类算法(MKFCM),算法的目的是找到最佳的隶属度以及核之间的最优结合方式。MKFC通过将特征的权重嵌入到算法进程中,自动调节权重进行核之间的合并,减轻了无关核对算法的影响,同时充分发挥对学习效果有利核函数对最终聚类结果的作用,反之亦然,这也使得核之间的结合变得合理有效,同时也使得核函数达到最大化利用。接下来对算法进行详细的描述:

1. 目标函数

  核方法通过非线性映射将原始数据通过特征映射嵌入到新的特征空间从而发现数据之间的非线性关系。假定在MKFC中,含有M个特征映射,分别记为:,每一个映射都将原L维数据重新编码为特征空间上的维数为Lk的向量。考虑到核方法的应用,可将这些映射分别对应的Mercer核记为,根据核的定义则有:    

为了使得到的基础核相互结合并且确保构造的的核依旧满足Mercer定理,可假定为这些特征映射的非负结合,且遵循线性结合:    

  根据之前的分析,核方法是通过特征映射在特征空间上发现数据之间的线性关系,那么采用不同的特征映射重新编码得到数据的维数将不尽相同,上述核之间的线性结合很难实现。因此可根据,构造一个新的独立的特征映射集,可假定:    

新构造出来的特征映射集的每一个映射分别将原数据X转换为一个L维的向量,其中:

上述分析我们提到,特征空间中数据间的维数不尽相同,考虑到聚类划分依据的是输入空间的数据点,那么可以交互特征间的维数使得数据依旧遵循正交基础。综上分析,新构造的独立特征映射集确保了特征空间上的映射具有相同的维数,因此,采用上述方法进行核之间的线性结合合情合理。同时,这些映射必须遵循一定的正交基础:      

其中:    

    

这些正交基础在一定程度上阻止了无关联特征映射之间的交互,同样,这些映射之间存在线性非负关系,因此我们需找到一个关于的线性非负关系,即找到函数的最优解。那么,对应的目标函数可转化为:

其中:

约束条件分别为:

其中, Vc指的是特征空间上的第c个聚类中心;代表权重向量;Uic是隶属度矩阵U中的元素;V是一个的矩阵,其中矩阵的列分别对应于聚类中心。

 2. 最优化隶属度

MKFC的目的是同时找到目标函数最优化的权重W,隶属度U以及聚类中心V。聚类中心处于不同的特征空间中,直接计算聚类中心是不可能的,但聚类中心是可以用核进行转换的。可以通过给定权重和聚类中心发现最优的隶属度函数,用来表示数据和聚类中心之间的距离:

        

相应的目标函数为:

该目标函数同样含有约束条件,可引入拉格朗日因子构造新的目标函数:

对于隶属度,得到目标函数求极值的最优化条件:

解得:

根据约束条件:,消除拉格朗日因子从而得到闭合解:

       

3.  最优化权重

由以上公式可得:权重和聚类中心已知时,可得到最优的隶属度矩阵U。与上述分析方法类似,假定隶属度已知,找寻最优的聚类中心和权重,得到聚类中心关于目标函数求极值的最优化条件:    

当U给定时,最优的聚类中心可利用权重加以转换:

其中指的是标准化隶属度:

结合之前的讨论,聚类中心处于不同的特征空间,相应的维数不尽相同,比较分析聚类中心是不可能的。据上述公式,聚类中心可以通过转换得到,而在没有聚类中心的情况下可以得到隶属度矩阵和权重的,故只需着力找到最优权重从而得到隶属度矩阵即可,而聚类中心处于闭合解。根据聚类中心的计算公式进行转换:

        

当隶属度函数已知时,即可得出相应的核函数。为了方便计算,可引入系数,将Dic转化为:      

相应的,系数可以表示为:

从而目标函数可以转化为:                             

约束条件为:

                                                        

当隶属度函数已知时,为了方便计算,引入相应的系数:

系数为:

                                      

忽略权重非负的约束,引进拉格朗日因子:                                       

根据目标函数求极值的最优化条件,有:            

得到:

                         

同时:

       
                                              

 4.  算法步骤

给定一个由N个L维向量组成的数据集、所要分得的类别个数C、自定义一个核函数集、自定义隶属度矩阵以及核权重集。具体的MKFC算法步骤如下:

①初始化隶属度矩阵并满足归一化条件;

②根据公式标准化隶属度;

③根据公式计算系数α;

④根据公式计算系数β;

⑤根据公式更新权重;

⑥根据公式计算距离Dic

⑦根据公式不断更新隶属度;

⑧利用矩阵范数比较迭代的隶属度矩阵,如果

停止迭代,否则,返回②。

二  MATLAB实现

  在此,我们选取UCI数据库中的数据,结合NMI准则,对算法进行验证和测试,采用MATLAB编程,首先建立MKFCM.m文件,代码如下:

%% 多核模糊C均值聚类
clear all
clc;

%% load and define
load wine.txt
data = wine;
data(:,) = [];

data_n = size(data,);
M = size(data,);

cluster_n = ;
minr = 0.005;%在计算高斯核时的参数

default_options = [1.08;    % 隶属度函数的幂次方
        ;    % 最大迭代次数
        0.0001;    %步长
        ];    % 判定条件

options = default_options;
expo = options();        % Exponent for U 隶属度函数的幂次方
max_iter = options();        % Max. iteration 最大迭代次数
min_impro = options();        % Min. improvement  最小进化步长
display = options();

Uv = zeros(data_n,cluster_n);
membership = zeros(data_n,cluster_n);
obj_fcn  = zeros(max_iter,);
K = zeros(M,data_n,data_n);
A = zeros(M,data_n,cluster_n);
B = zeros(M,);
W = zeros(M,);
D = zeros(data_n,cluster_n);

%% 初始化隶属度矩阵并归一
U = rand(data_n,cluster_n);
S = sum(U,);
:data_n
    :cluster_n
        U(i,j) = U(i,j) / S(i,);
    end
end

%% 计算核函数
opeo = zeros(M,);
:M
    oper = zeros(data_n,data_n);
    :data_n
        :data_n
        oper(j,p) = (- * ((data(j,i) - data(p,i)).^) / log(minr));
        end
    end
    oprt = reshape(oper,,data_n * data_n);
    oprt(oprt==) = inf;
    opeo(i,) = min(oprt);
end

:M
    :data_n
        :data_n
        K(i,p,q) = exp((- *(data(p,i) - data(q,i)).^)/ opeo(i,));
        end
    end
end

%% 开始迭代
:max_iter
    tic
    %% 标准化隶属度矩阵
    sum = ;
    :data_n
        :cluster_n
            sum = sum + U(i,j).^expo;
        end
    end
    :data_n
        :cluster_n
            Uv(i,j) = U(i,j).^expo / sum;
        end
    end

    %% 求参数a
    tmp = zeros(M,data_n,cluster_n);
    :data_n
        :cluster_n
            :M
                :data_n
                    tmp(k,i,c) = tmp(k,i,c) + Uv(j,c) * K(k,i,j);
                end
            end
        end
    end

    :data_n
        :cluster_n
            :M
                tp = ;
                :data_n
                    for q = data_n
                        tp = tp + Uv(j,c)* Uv(q,c) * K(k,j,q);
                    end
                end
                A(k,i,c) = K(k,i,i) -  * tmp(k,i,c) + tp;
            end
        end
    end

    %% 求系数B
    :M
        for i = data_n
            :cluster_n
               B(k,) = B(k,) + U(i,j).^expo * A(k,i,j);
            end
        end
    end

    %% 求权重w
    sum = ;
    :M
        sum = sum + B(k,).^(-);
    end
    :M
        W(k,) = B(k,).^(-) / sum;
    end

    %% 求欧式距离
    :data_n
        :cluster_n
            :M
                D(i,c) = D(i,c) + A(k,i,c) * W(k,).^;
            end
        end
    end

    %% 更新隶属度矩阵
    :data_n
        :cluster_n
            sum = ;
            :cluster_n
                sum = sum + (D(i,c) / D(i,q)).^( / (expo - ));
            end
            membership(i,c) =  / sum;
        end
    end

    sum = zeros(data_n,);
    :data_n
        :cluster_n
            sum(i,) = sum(i,) + membership(i,j);
        end
    end

    :data
        :cluster_n
            membership(i,j) = membership(i,j) / sum(i,);
        end
    end    

    %% 得到目标函数
    temp = ;
    :data_n
        :cluster_n
            temp = temp + membership(i,c).^expo;
            trmp = ;
            :M
                trmp = trmp + A(k,i,c) * W(k,).^ ;
            end
        end
    end
    obj_fcn(o) = temp * trmp;

    if display,
        fprintf('Iteration count = %d, obj_fcn = %f\n', o, obj_fcn(o));
    end

        if max(abs(membership - U)) < min_impro;
            break
        else
            U  = membership;
        end
    end
    toc

end

%% 计算NMI值
B = ones(data_n,);
:data_n
    :cluster_n
        )) < membership(i,j)
            B(i,) = j;
        end
    end
end
B = reshape(B,,data_n);
A = wine(:,);
A = reshape(A,,data_n);

t = nmi(A,B);
%% 输出
plot(membership(:,),'-ro');
grid on
hold on
plot(membership(:,),'-g*');
plot(membership(:,),'-b+');

ylabel('Membership degrees')
legend('MKFC1','MKFC2','MKFC3','location','northeast');

接下来采用NMI准则对算法进行评估,在此需要对NMI准则进行介绍:

  标准化互信息(NMI)用来评价聚类结果的相似程度,求出MI的值,进而用熵做分母,对MI值进行标准化。可以采用NMI将各个算法的聚类结果与标准结果进行比较,值越接近1,表明聚类效果越好;若值趋近于0,则表明聚类效果很差,假定需要评价的是含N个数据的数据集X的两个聚类结果R和Q,且R和Q分别含有I和J个类别。

  用P(i)表示将数据划分到R中的类别Ri的概率,其中:P(i) = |Ri|/N,同理可定义:P(j) = |Rj|/N,表示数据划分到Qj的概率;用P(i,j)表示将一个数据划分到R和Q各类别的联合分布率,有:,据此可求出MI值,而标准化互聚类信息就是用熵做分母,将MI的值调整到[0,1]之间。

关于R的熵定义为:

      

同理,可定义Q的熵为

      

从而关于两个聚类算法R和Q的NMI准则被定义为:    

据此,采用MATLAB编程代码如下: 

function [NMI] = nmi(A,B)

total = size(A,);
A_i = unique(A);
A_c = length(A_i);
B_i = unique(B);
B_c = length(B_i);
idA = ) == repmat(A_i',1,total));
idB = ) == repmat(A_i',1,total));
idAB = idA * idB';

Sa = zeros(A_c,);
Sb = zeros(B_c,);
:A_c
     :total

            Sa(i,) = Sa(i,) + ;
        end
    end
end

:B_c
    :total

            Sb(i,) = Sb(i,) + ;
        end
    end
end

Pa = zeros(A_c,);
Pb = zeros(B_c,);

:A_c
    Pa(i,) = Sa(i,) / total;
end

:B_c
    Pb(i,) = Sa(i,) / total;
end

Pab = idAB / total;

Ha = ;
Hb = ;
:A_c
    Ha = Ha + Pa(i,) * log2(Pa(i,));
end

:B_c
    Hb = Hb + Pb(i,) * log2(Pb(i,));
end

MI = ;
:A_c
    :B_c
      MI = MI + Pab(i,j) * log2(Pab(i,j) / (Pa(i,) * Pb(j,)) + eps);
    end
end

NMI = MI / ((Ha * Hb).^(/));
fprintf('NMI = %d\n',NMI);

选取UCI库中的多种数据,分别计算NMI值和之前的算法比较,可以得到MKFCM的优越性,大家可以自行检验。

以上是个人的一些理解与总结,也难免有错,望不吝赐教!

多核模糊C均值聚类的更多相关文章

  1. 基于核方法的模糊C均值聚类

    摘要: 本文主要针对于FCM算法在很大程度上局限于处理球星星团数据的不足,引入了核方法对算法进行优化.  与许多聚类算法一样,FCM选择欧氏距离作为样本点与相应聚类中心之间的非相似性指标,致使算法趋向 ...

  2. 模糊C均值聚类的公式推导

    j=1...n,N个样本 i=1...c,C聚类 一.优化函数 FCM算法的数学模型其实是一个条件极值问题: 把上面的条件极值问题转化为无条件的极值问题,这个在数学分析上经常用到的一种方法就是拉格朗日 ...

  3. 模糊C均值聚类-FCM算法

    FCM(fuzzy c-means) 模糊c均值聚类融合了模糊理论的精髓.相较于k-means的硬聚类,模糊c提供了更加灵活的聚类结果.因为大部分情况下,数据集中的对象不能划分成为明显分离的簇,指派一 ...

  4. 图像模糊C均值聚类分割代码

    转自:直觉模糊C均值聚类与图像阈值分割 - liyuefeilong的专栏 - CSDN博客 https://blog.csdn.net/liyuefeilong/article/details/43 ...

  5. R语言 模糊c均值(FCM)算法程序(转)

    FCM <- function(x, K, mybeta = 2, nstart = 1, iter_max = 100, eps = 1e-06) { ## FCM ## INPUTS ## ...

  6. ML: 聚类算法-K均值聚类

    基于划分方法聚类算法R包: K-均值聚类(K-means)                   stats::kmeans().fpc::kmeansruns() K-中心点聚类(K-Medoids) ...

  7. 【转】算法杂货铺——k均值聚类(K-means)

    k均值聚类(K-means) 4.1.摘要 在前面的文章中,介绍了三种常见的分类算法.分类作为一种监督学习方法,要求必须事先明确知道各个类别的信息,并且断言所有待分类项都有一个类别与之对应.但是很多时 ...

  8. 5-Spark高级数据分析-第五章 基于K均值聚类的网络流量异常检测

    据我们所知,有‘已知的已知’,有些事,我们知道我们知道:我们也知道,有 ‘已知的未知’,也就是说,有些事,我们现在知道我们不知道.但是,同样存在‘不知的不知’——有些事,我们不知道我们不知道. 上一章 ...

  9. 机器学习实战5:k-means聚类:二分k均值聚类+地理位置聚簇实例

    k-均值聚类是非监督学习的一种,输入必须指定聚簇中心个数k.k均值是基于相似度的聚类,为没有标签的一簇实例分为一类. 一 经典的k-均值聚类 思路: 1 随机创建k个质心(k必须指定,二维的很容易确定 ...

随机推荐

  1. 单选项框RadioGroup的综合应用

    大家好,我们今天这一节要介绍的是RadioGroup 的组事件.RadioGroup 可将各自不同的RadioButton ,设限于同一个Radio 按钮组,同一个RadioGroup 组里的按钮,只 ...

  2. JAVA IO 体系

    一.体系结构

  3. 两个奇葩的C/C++问题

    今天为大家介绍几个奇葩的C/C++问题. 1 大家看看下面的输出结果是什么呢? #include <stdio.h> #include <stdlib.h>   void ma ...

  4. hdu 3590 PP and QQ

    知识储备: Anti-SG 游戏和 SJ 定理  [定义](anti-nim 游戏)  桌子上有 N 堆石子,游戏者轮流取石子.  每次只能从一堆中取出任意数目的石子,但不能不取.  取走最后一 ...

  5. web.xml中servlet初始化参数的设置

    <context-param><param-name>param1</param-name><param-value>value1</param- ...

  6. 扩展 delphi 线程 使之传递参数.(给匿名线程增加参数)

    新delphi的线程TThread有了CreateAnonymousThread方法,如果再为它加一个可传递的参数不就更好了吗?代码如下: TAnonymousThreadX<T> = c ...

  7. Phalanx--hdu2859(dp 最大对称子图)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2859 题意就是给你一个n*n的字符矩阵,从中选出一个最大的子矩阵(m*m)满足关于斜对角线(左下角到右 ...

  8. 291. Word Pattern II

    题目: Given a pattern and a string str, find if str follows the same pattern. Here follow means a full ...

  9. 解决COS、FileUpload上传文件时中文文件名乱码问题

    方法: MultipartParser mp = new MultipartParser(request, 10*1024*1024); mp.setEncoding("GBK") ...

  10. JSU 2013 Summer Individual Ranking Contest - 5

    JSU 2013 Summer Individual Ranking Contest - 5 密码:本套题选题权归JSU所有,需要密码请联系(http://blog.csdn.net/yew1eb). ...