常见的聚类算法

来源:互联网 发布:淘宝骗术大全 编辑:程序博客网 时间:2024/06/04 17:00

分类方法概述

KMeans

基本概念

  • 将N个数据点按照质心分为K个簇,即分类个数为K,为无监督分类
  • 首先初始化K个聚类的质心点,然后重新计算每个数据点的分类(按照距离),重复迭代过程,直到达到收敛条件
  • 参考链接:http://www.cnblogs.com/jerrylead/archive/2011/04/06/2006910.html

其他

  • matlab中有对应的函数,可以直接实现:http://blog.csdn.net/u012526003/article/details/50492404

层次聚类

基本概念

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

其他

  • matlab实现层次聚类分析

    %% 层次聚类clc,clear,close alldata1 = 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个子网络时,指的是子网间的连接密度。谱聚类的目的就是要找到一个合理的分割,使得分割后形成若干子图,连接不同的子图的边的权重尽可能低,即最小,同子图内的边的权值尽可能高。

截的具体表现形式

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

    其中W(S,T)表示的是类别ST之间的权重。对于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聚类算法对上述特征向量矩阵进行聚类,每一行代表一个样本点,最后可以得到每个样本的分类

其他

  • 参考链接:
    • http://blog.csdn.net/google19890102/article/details/45697695
  • 这种方法可以实现对高维数据的降维,再对数据在低维空间中利用聚类方法进行聚类,可以用于数据分类、图像分割等领域。

代码

  • main

    clc,clear,close alldata1 = 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 limitationnum = 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;endclear 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 lengthsq_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 - time1kmeans_time = total_time - time2total_timedisp('Finished!');

KNN分类

基本概念

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

matlab代码

%% KNN聚类clc,clear,close alldata1 = 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 onscatter(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,从而可以避免上述问题。

其他

  • 贝叶斯分类被广泛应用,主要有
    • 对新闻的类别进行分类,比如科技、政治、运动
    • 判断文本表达的感情是积极的还是消极的
    • 人脸识别
  • 参考文献
    • http://www.cnblogs.com/leoo2sk/archive/2010/09/17/naive-bayesian-classifier.html
    • https://mp.weixin.qq.com/s/VE1n8WMkmVWxXBtxkWsTjA

SVM

  • 参考链接:http://blog.csdn.net/u012526003/article/details/50243311
原创粉丝点击