常见的聚类算法

分类方法概述

KMeans

基本概念

其他

层次聚类

基本概念

  • 参考链接
  • 层次聚类是自下而上的聚类方法,首先将每个样本归为一个单独的类。每次将样本中最近的两个样本合并为一个簇,将原来的两个样本从需要继续聚类的样本中删除,将这个簇作为一个新的样本,投入到样本中继续进行合并,相当于每次聚类之后都会减少一类。具体的步骤为
    1. 将每个样本归为一类,计算每两个类之间的距离,即样本与样本之间的相似度;
    2. 寻找距离最近的两个类,把它们归为一类(类的总数少了一个)
    3. 重新计算新生成的这个类与各个旧类之间的距离,即相似度;
    4. 重复2和3,直到所有样本都归为一类,结束。
  • 整个过程相当于建立了一棵树, 可以通过设置距离阈值或者聚类的个数来提前结束迭代。
  • 最重要的是第3步中的距离计算
    • 对于两个类,如果他们都只有一个样本,则他们之间的距离就是类之间的距离,如果超过一个样本,则可以通过SingleLinkageCompleteLinkageAverage-linkage方法来计算类之间的距离
      • SingleLinkage:两个类中样本距离的最小值
      • CompleteLinkage:两个类中样本距离的最大值
      • Average-linkage:把两个类之间所有样本的两两距离计算出来,取平均值,最常用

其他

  • matlab实现层次聚类分析

    %% 层次聚类
    clc,clear,close all
    data1 = rand( 50, 2 );
    data2 = rand( 50, 2 ) + ones(50,2);
    data = cat(1, data1, data2);
    
    dists = pdist(data);
    dists = squareform( dists );
    % 可视化聚类数
    trees = linkage( dists, 'average' );
    dendrogram( trees );
    % 可视化聚类结果,这里分成了2类
    res = cluster(trees,'maxclust',2);
    scatter(data(:,1), data(:,2), 50, res)
    

谱聚类

基本概念

  • 将每个样本视为网络中的一个节点。在复杂网络簇结构中存在着同簇节点之间连接密集,不同簇节点之间连接稀疏的特征,希望根据这样的特征,实现对节点的分割。
  • 定义了函数的概念,当一个网络被划分为2个子网络时,指的是子网间的连接密度。谱聚类的目的就是要找到一个合理的分割,使得分割后形成若干子图,连接不同的子图的边的权重尽可能低,即最小,同子图内的边的权值尽可能高。

截的具体表现形式

  • 表示子网络之间的密度,即边比较少,以二分为例,将一个图聚类为 S T这2类,则目标函数为
    mincut(S,T)=iS,jTeij=W(S,T)

    其中 W(S,T) 表示的是类别 S T之间的权重。对于 k 个不同的类别,优化目标为
    mincut(A1,A2,...,Ak)=12i=1kW(Ai,Ai¯¯¯¯)

    这种情况比较容易出现二分割的问题,其将图分为1个点和其余 n1 个点。

其他的截函数的形式

  • 为了能让每个类都有合理的大小,目标函数中应该让各个分类结果中的样本都够大,提出了 RatioCut(A1,A2,...,Ak) 或者 NCut(A1,A2,...,Ak)

Ratiocut(A1,A2,...,Ak)=12i=1kW(Ai,Ai¯¯¯¯)|Ai|

Ncut(A1,A2,...,Ak)=12i=1kW(Ai,Ai¯¯¯¯)vol(Ai)

其中 |A| 表示 A 中顶点的个数

Laplacian矩阵

  • 定义
    • Laplacian矩阵也成为基尔霍夫矩阵,对于一个有n个顶点的图G={V,E},其laplacian矩阵定义为
      L=DA

      其中D是图的度矩阵,A是图的邻接矩阵
      • 度矩阵的定义
        • 对于上述的图,邻接矩阵为
          A=w11wn1w1nwnn

          度矩阵为对角矩阵
          D=diag{d1,d2,...,dn}

          其中
          di=j=1ndij
      • 性质
        • Laplacian矩阵L是半正定矩阵
        • L的最小特征值是0,相应的特征向量是I(全部为1)
        • L有n个非负特征值,对于任何一个实向量,都有
          fLf=12i,j=1nwij(fifj)2
      • 规范化的Laplacian矩阵形式为
        L=D12(DA)D12
      • 目标函数的化简

        对于2个类别的聚类问题,优化的目标函数为

        minRatioCut(A1,A¯)

        定义向量 f=(f1,f2,...fn) ,且有
        fi=A¯A,ifviAAA¯,ifviA
        \
        则可以推导出
        fLf=|V|RatioCut(A,A¯)

        其中 |V| 是顶点的数目,对于特定的图来说是常数,因此可以利用Laplacian矩阵求解这个优化问题,即新的目标函数为
        minfRnfLf,st.fI,f=n

        假设 λ 是L的特征值,f是其对应的特征向量,则有
        Lf=λf

        fLf=λff

        fLf=λn

        因此只需要求最小特征值 λ ,又其最小特征值为0,由Rayleigh-Ritz理论,可以取次小特征值。
        * 对于求解出来的特征向量,可以通过分量的值判断对应的点所属的类别
        {viA,iffi0viA¯,iffi<0

        多聚类的问题

        • 对于多聚类的问题,可以对求出来的前k个特征值的特征向量,利用Kmeans聚类方法对齐进行聚类

        利用相似度构造Laplacian矩阵

        • 相似度矩阵由权值矩阵得到
          S=s11sn1s1nsnn

          其中
          sij=ew2ij2σ2

          再利用相似度矩阵构造Laplacian矩阵
          L=D12SD12

          其中D为相似度S构造的度矩阵。
        • 注意第一种方法中,取得是前k个最小特征值对应的特征向量,在相似度矩阵的方法中,求解的是前k个最大特征值对应的特征向量

        谱聚类的基本过程

        • 基于给定的图 G=(V,E) ,求图的度矩阵和邻接矩阵A;
        • 计算图的Laplacian矩阵( L=DA 或者利用相似度矩阵计算)
        • 对Laplacian矩阵进行特征值分解,取前k个特征值对应的特征向量,构成 n×k 的特征向量矩阵
        • 利用Kmeans聚类算法对上述特征向量矩阵进行聚类,每一行代表一个样本点,最后可以得到每个样本的分类

        其他

        代码

        • main

          clc,clear,close all
          data1 = rand( 50, 2 );
          data2 = rand( 50, 2 ) + ones(50,2);
          data = cat(1, data1, data2);
          % 对图像进行分割
          % a = imread('1.png');
          % a = imresize( a, 0.3 );
          % a = double(a)/ 255;
          % data = reshape( a, [size(a,1)*size(a,2), size(a,3)] );
          dists = pdist(data);
          
          dists = squareform( dists );
          [cluster_labels, evd_time, kmeans_time, total_time] = SpectrumCluster(dists, 2, 2);
          scatter(data(:,1), data(:,2), 50, cluster_labels)
          
        • SpectrumCluster

          function [cluster_labels, evd_time, kmeans_time, total_time] = SpectrumCluster(A, sigma, num_clusters)
          %SC Spectral clustering using a sparse similarity matrix (t-nearest-neighbor).
          %
          %   Input  : A              : N-by-N sparse distance matrix, where
          %                             N is the number of data
          %            sigma          : sigma value used in computing similarity,
          %                             if 0, apply self-tunning technique
          %            num_clusters   : number of clusters
          %
          %   Output : cluster_labels : N-by-1 vector containing cluster labels
          %            evd_time       : running time for eigendecomposition
          %            kmeans_time    : running time for k-means
          %            total_time     : total running time
          
          %
          % Convert the sparse distance matrix to a sparse similarity matrix,
          % where S = exp^(-(A^2 / 2*sigma^2)).
          % Note: This step can be ignored if A is sparse similarity matrix.
          %
          disp('Converting distance matrix to similarity matrix...');
          tic;
          n = size(A, 1);
          
          if (sigma == 0) % Selftuning spectral clustering
            % Find the count of nonzero for each column
            disp('Selftuning spectral clustering...');
            col_count = sum(A~=0, 1)';
            col_sum = sum(A, 1)';
            col_mean = col_sum ./ col_count;
            [x y val] = find(A);
            A = sparse(x, y, -val.*val./col_mean(x)./col_mean(y)./2);
            clear col_count col_sum col_mean x y val;
          else % Fixed-sigma spectral clustering
            disp('Fixed-sigma spectral clustering...');
            A = A.*A;
            A = -A/(2*sigma*sigma);
          end
          
          % Do exp function sequentially because of memory limitation
          num = 2000;
          num_iter = ceil(n/num);
          S = sparse([]);
          for i = 1:num_iter
            start_index = 1 + (i-1)*num;
            end_index = min(i*num, n);
            S1 = spfun(@exp, A(:,start_index:end_index)); % sparse exponential func
            S = [S S1];
            clear S1;
          end
          clear A;
          toc;
          
          %
          % Do laplacian, L = D^(-1/2) * S * D^(-1/2)
          %
          disp('Doing Laplacian...');
          D = sum(S, 2) + (1e-10);
          D = sqrt(1./D); % D^(-1/2)
          D = spdiags(D, 0, n, n);
          L = D * S * D;
          clear D S;
          time1 = toc;
          
          %
          % Do eigendecomposition, if L =
          %   D^(-1/2) * S * D(-1/2)    : set 'LM' (Largest Magnitude), or
          %   I - D^(-1/2) * S * D(-1/2): set 'SM' (Smallest Magnitude).
          %
          disp('Performing eigendecomposition...');
          OPTS.disp = 0;
          [V, val] = eigs(L, num_clusters, 'LM', OPTS);
          time2 = toc;
          
          %
          % Do k-means
          %
          disp('Performing kmeans...');
          % Normalize each row to be of unit length
          sq_sum = sqrt(sum(V.*V, 2)) + 1e-20;
          U = V ./ repmat(sq_sum, 1, num_clusters);
          clear sq_sum V;
          cluster_labels = kmeans(U, num_clusters);
          total_time = toc;
          
          %
          % Calculate and show time statistics
          %
          evd_time = time2 - time1
          kmeans_time = total_time - time2
          total_time
          disp('Finished!');
          

        KNN分类

        基本概念

        • KNN(k-nearest neighbour)是一个常用的监督学习方法,它不对训练数据做任何操作,只是将数据和对应的label保存起来,在对特定测试样本进行分类时,找出距离该测试样本最近的k个训练样本,它们中最多的种类就是该测试样本的类别(比如说2分类问题的,k=3,2个最近邻类别是2,1个是1,则这个测试样本的类别是2。)

        matlab代码

        %% KNN聚类
        clc,clear,close all
        data1 = rand( 50, 2 );
        data2 = rand( 50, 2 ) + ones(50,2);
        data = cat(1, data1, data2);
        train_lb = [ones(50,1); 2*ones(50,1)];
        
        test_data = [1.1 0.5;0.3 0.2; 0.3 2.3];
        idx = knnsearch( data, test_data, 'k', 7 );
        test_lb = mode(train_lb(idx), 2);
        rgb = zeros(length(test_lb), 3);
        rgb(test_lb == 1, 1) = 1;
        rgb(test_lb == 2, 2) = 1;
        figure,
        hold on
        scatter(data(:,1), data(:,2), 50, train_lb)
        scatter(test_data(:,1), test_data(:,2), 50, rgb, 'd', 'filled');
        

        朴素贝叶斯分类器(Naive Bayesian classification)

        基本概念

        • 贝叶斯分类算法是统计分类算法的一种,他是一类利用概率统计知识进行的一种分类算法。而朴素贝叶斯算法就是里面贝叶斯算法中最简单的一个算法。
        • 核心公式

          P(B|A)=P(A|B)P(B)P(A)

        • 对于给出的待分类项,求解出在此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪一类。

        正式流程定义

        • x={a1,a2,...,am} 为一个待分类项,其中每一个 ai 都是 x 的一个特征属性。
        • 总共有类别集合x={y1,y2,...,yn}
        • 计算 P(y1|x),P(y2|x),...,P(yn|x) ,即当出现测试样本这种特征时,属于各个类别的概率。
        • P(yk|x)=max{P(y1|x),P(y2|x),...,P(yn|x)} ,则 xyk

        现在的主要目标就是计算样本属于各类的条件概率。由之前的条件概率公式可以,每种类别的条件概率为

        P(yi|x)=P(x|yi)P(yi)P(x)

        对于某个特定的样本, P(x) 是定值,因此我们只需要使得分子最大化即可。再 假设各个特征属性是条件独立的,因此有
        P(x|yi)P(yi)=P(yi)j=1mP(aj|yi)

        上述情况是特征属性为离散的情况,可以很方便地计算出 P(ak,yi) 的值,对于特征属性 ak 为连续的情况,我们假设其值符合高斯分布,即
        g(x,η,σ)=12πσe(xη)22σ2

        P(ak|yi)=g(ak,ηyi,σyi) ,因此我们只需要计算出训练样本中各个类别中此特征项的均值和标准差,代入公式即可。

        在计算的过程中,可能会出现 P(a|y)=0 的情况,即某个分类下的所有样本没有某种特征,这会大大降低分类器的质量。我们对每个类别下所有的划分的计数加1,从而可以避免上述问题。

        其他

        SVM

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

littletomatodonkey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值