基于凸集上投影(POCS)的聚类算法

Posted deephub

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于凸集上投影(POCS)的聚类算法相关的知识,希望对你有一定的参考价值。

POCS:Projections onto Convex Sets。在数学中,凸集是指其中任意两点间的线段均在该集合内的集合。而投影则是将某个点映射到另一个空间中的某个子空间上的操作。给定一个凸集合和一个点,可以通过找到该点在该凸集合上的投影来进行操作。该投影是离该点最近的凸集内的点,可以通过最小化该点和凸集内任何其他点之间的距离来计算。既然是投影,那么我们就可以将特征映射到另一个空间中的凸集合上,这样就可以进行聚类或降维等操作。

本文综述了一种基于凸集投影法的聚类算法,即基于POCS的聚类算法。原始论文发布在IWIS2022上。

凸集

凸集定义为一个数据点集合,其中连接集合中任意两点x1和x2的线段完全包含在这个集合中。根据凸集的定义,认为空集∅、单集、线段、超平面、欧氏球都被认为是凸集。数据点也被认为是凸集,因为它是单例集(只有一个元素的集合)。这为 POCS 的概念应用于聚类数据点开辟了一条新路径。

凸集投影(POCS)

POCS方法大致可分为交替式和并行式两种。

1、交替式poc

从数据空间中的任意一点开始,从该点到两个(或多个)相交凸集的交替投影将收敛到集合交点内的一点,例如下图:

当凸集不相交时,交替投影将收敛到依赖于投影阶数的greedy limit cycles。

2、并行式 POCS

与交替形式不同,并行的POCS 是从数据点到所有凸集同时进行投影,并且每个投影都有一个重要性权重。对于两个非空相交凸集,类似于交替式版本,平行投影会收敛到集相交处的一个点。

在凸集不相交的情况下,投影将收敛到一个最小解。基于pocs的聚类算法的主要思想来源于这一特性。

有关POCS的更多细节,可以查看原论文

基于pocs的聚类算法

利用并行POCS方法的收敛性,论文作者提出了一种非常简单但在一定程度上有效的聚类算法。该算法的工作原理与经典的K-Means算法类似,但在处理每个数据点的方式上存在差异:K-Means算法对每个数据点的重要性加权相同,但是基于pocs的聚类算法对每个数据点的重要性加权不同,这与数据点到聚类原型的距离成正比。

算法的伪代码如下所示:

实验结果

作者在一些公共基准数据集上测试了基于pocs的聚类算法的性能。下表总结了这些数据集的描述。

作者比较了基于pocs的聚类算法与其他传统聚类方法的性能,包括k均值和模糊c均值算法。下表总结了执行时间和聚类错误方面的评估。

聚类结果如下图所示:

示例代码

我们在一个非常简单的数据集上使用这个算法。作者已经发布了直接使用的包,对于应用我们可以直接使用:

 pip install pocs-based-clustering

创建一个以10个簇为中心的5000个数据点的简单数据集:

 # Import packages
 importtime
 importmatplotlib.pyplotasplt
 
 fromsklearn.datasetsimportmake_blobs
 frompocs_based_clustering.toolsimportclustering
 
 
 # Generate a simple dataset
 num_clusters=10
 X, y=make_blobs(n_samples=5000, centers=num_clusters, \\
                   cluster_std=0.5, random_state=0)
 
 plt.figure(figsize=(8,8))
 plt.scatter(X[:, 0], X[:, 1], s=50)
 plt.show()

执行聚类并显示结果:

 # POSC-based Clustering Algorithm
 centroids, labels=clustering(X, num_clusters, 100)
 
 # Display results
 plt.figure(figsize=(8,8))
 plt.scatter(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis')
 plt.scatter(centroids[:, 0], centroids[:, 1], s=100, c='red')
 plt.show()

总结

我们简要回顾了一种简单而有效的基于投影到凸集(POCS)方法的聚类技术,称为基于POCS的聚类算法。该算法利用POCS的收敛特性应用于聚类任务,并在一定程度上实现了可行的改进。在一些基准数据集上验证了该算法的有效性。

https://avoid.overfit.cn/post/bd811302f89c47fa8777c9f5bac8c59e

作者:LA Tran

简单易学的机器学习算法——基于密度的聚类算法DBSCAN

一、基于密度的聚类算法的概述

    最近在Science上的一篇基于密度的聚类算法《Clustering by fast search and find of density peaks》引起了大家的关注(在我的博文“论文中的机器学习算法——基于密度峰值的聚类算法”中也进行了中文的描述)。于是我就想了解下基于密度的聚类算法,熟悉下基于密度的聚类算法与基于距离的聚类算法,如K-Means算法之间的区别。
    基于密度的聚类算法主要的目标是寻找被低密度区域分离的高密度区域。与基于距离的聚类算法不同的是,基于距离的聚类算法的聚类结果是球状的簇,而基于密度的聚类算法可以发现任意形状的聚类,这对于带有噪音点的数据起着重要的作用。

二、DBSCAN算法的原理

1、基本概念

    DBSCAN(Density-Based Spatial Clustering of Application with Noise)是一种典型的基于密度的聚类算法,在DBSCAN算法中将数据点分为一下三类:
  • 核心点。在半径Eps内含有超过MinPts数目的点
  • 边界点。在半径Eps内点的数量小于MinPts,但是落在核心点的邻域内
  • 噪音点。既不是核心点也不是边界点的点
在这里有两个量,一个是半径Eps,另一个是指定的数目MinPts。
    一些其他的概念
  1. Eps邻域。简单来讲就是与点技术分享图片的距离小于等于Eps的所有的点的集合,可以表示为技术分享图片
  2. 直接密度可达。如果技术分享图片在核心对象技术分享图片的Eps邻域内,则称对象技术分享图片从对象技术分享图片出发是直接密度可达的。
  3. 密度可达。对于对象链:技术分享图片技术分享图片是从技术分享图片关于Eps和MinPts直接密度可达的,则对象技术分享图片是从对象技术分享图片关于Eps和MinPts密度可达的。

2、算法流程

技术分享图片
(流程)

三、实验仿真

    在实验中使用了两个测试数据集,数据集的原始图像如下:
技术分享图片
(数据集1)
技术分享图片
(数据集2)
数据集1相对比较简单。显然我们可以发现数据集1共有两个类,数据集2有四个类,下面我们通过DBSCAN算法实现数据点的聚类:
 
MATLAB代码
主程序
 
 
[plain] view plain copy
 
  1. %% DBSCAN  
  2. clear all;  
  3. clc;  
  4.   
  5. %% 导入数据集  
  6. % data = load(‘testData.txt‘);  
  7. data = load(‘testData_2.txt‘);  
  8.   
  9. % 定义参数Eps和MinPts  
  10. MinPts = 5;  
  11. Eps = epsilon(data, MinPts);  
  12.   
  13. [m,n] = size(data);%得到数据的大小  
  14.   
  15. x = [(1:m)‘ data];  
  16. [m,n] = size(x);%重新计算数据集的大小  
  17. types = zeros(1,m);%用于区分核心点1,边界点0和噪音点-1  
  18. dealed = zeros(m,1);%用于判断该点是否处理过,0表示未处理过  
  19. dis = calDistance(x(:,2:n));  
  20. number = 1;%用于标记类  
  21.   
  22. %% 对每一个点进行处理  
  23. for i = 1:m  
  24.     %找到未处理的点  
  25.     if dealed(i) == 0  
  26.         xTemp = x(i,:);  
  27.         D = dis(i,:);%取得第i个点到其他所有点的距离  
  28.         ind = find(D<=Eps);%找到半径Eps内的所有点  
  29.           
  30.         %% 区分点的类型  
  31.           
  32.         %边界点  
  33.         if length(ind) > 1 && length(ind) < MinPts+1  
  34.             types(i) = 0;  
  35.             class(i) = 0;  
  36.         end  
  37.         %噪音点  
  38.         if length(ind) == 1  
  39.             types(i) = -1;  
  40.             class(i) = -1;  
  41.             dealed(i) = 1;  
  42.         end  
  43.         %核心点(此处是关键步骤)  
  44.         if length(ind) >= MinPts+1  
  45.             types(xTemp(1,1)) = 1;  
  46.             class(ind) = number;  
  47.               
  48.             % 判断核心点是否密度可达  
  49.             while ~isempty(ind)  
  50.                 yTemp = x(ind(1),:);  
  51.                 dealed(ind(1)) = 1;  
  52.                 ind(1) = [];  
  53.                 D = dis(yTemp(1,1),:);%找到与ind(1)之间的距离  
  54.                 ind_1 = find(D<=Eps);  
  55.                   
  56.                 if length(ind_1)>1%处理非噪音点  
  57.                     class(ind_1) = number;  
  58.                     if length(ind_1) >= MinPts+1  
  59.                         types(yTemp(1,1)) = 1;  
  60.                     else  
  61.                         types(yTemp(1,1)) = 0;  
  62.                     end  
  63.                       
  64.                     for j=1:length(ind_1)  
  65.                        if dealed(ind_1(j)) == 0  
  66.                           dealed(ind_1(j)) = 1;  
  67.                           ind=[ind ind_1(j)];     
  68.                           class(ind_1(j))=number;  
  69.                        end                      
  70.                    end  
  71.                 end  
  72.             end  
  73.             number = number + 1;  
  74.         end  
  75.     end  
  76. end  
  77.   
  78. % 最后处理所有未分类的点为噪音点  
  79. ind_2 = find(class==0);  
  80. class(ind_2) = -1;  
  81. types(ind_2) = -1;  
  82.   
  83. %% 画出最终的聚类图  
  84. hold on  
  85. for i = 1:m  
  86.     if class(i) == -1  
  87.         plot(data(i,1),data(i,2),‘.r‘);  
  88.     elseif class(i) == 1  
  89.         if types(i) == 1  
  90.             plot(data(i,1),data(i,2),‘+b‘);  
  91.         else  
  92.             plot(data(i,1),data(i,2),‘.b‘);  
  93.         end  
  94.     elseif class(i) == 2  
  95.         if types(i) == 1  
  96.             plot(data(i,1),data(i,2),‘+g‘);  
  97.         else  
  98.             plot(data(i,1),data(i,2),‘.g‘);  
  99.         end  
  100.     elseif class(i) == 3  
  101.         if types(i) == 1  
  102.             plot(data(i,1),data(i,2),‘+c‘);  
  103.         else  
  104.             plot(data(i,1),data(i,2),‘.c‘);  
  105.         end  
  106.     else  
  107.         if types(i) == 1  
  108.             plot(data(i,1),data(i,2),‘+k‘);  
  109.         else  
  110.             plot(data(i,1),data(i,2),‘.k‘);  
  111.         end  
  112.     end  
  113. end  
  114. hold off  
 
距离计算函数
[plain] view plain copy
 
  1. %% 计算矩阵中点与点之间的距离  
  2. function [ dis ] = calDistance( x )  
  3.     [m,n] = size(x);  
  4.     dis = zeros(m,m);  
  5.       
  6.     for i = 1:m  
  7.         for j = i:m  
  8.             %计算点i和点j之间的欧式距离  
  9.             tmp =0;  
  10.             for k = 1:n  
  11.                 tmp = tmp+(x(i,k)-x(j,k)).^2;  
  12.             end  
  13.             dis(i,j) = sqrt(tmp);  
  14.             dis(j,i) = dis(i,j);  
  15.         end  
  16.     end  
  17. end  

epsilon函数
[plain] view plain copy
 
  1. function [Eps]=epsilon(x,k)  
  2.   
  3. % Function: [Eps]=epsilon(x,k)  
  4. %  
  5. % Aim:   
  6. % Analytical way of estimating neighborhood radius for DBSCAN  
  7. %  
  8. % Input:   
  9. % x - data matrix (m,n); m-objects, n-variables  
  10. % k - number of objects in a neighborhood of an object  
  11. % (minimal number of objects considered as a cluster)  
  12.   
  13.   
  14.   
  15. [m,n]=size(x);  
  16.   
  17. Eps=((prod(max(x)-min(x))*k*gamma(.5*n+1))/(m*sqrt(pi.^n))).^(1/n);  


 
最终的结果
技术分享图片
 
(数据集1的聚类结果)
技术分享图片
(数据集2的聚类结果)
在上面的结果中,红色的点代表的是噪音点,点代表的是边界点,十字代表的是核心点。不同的颜色代表着不同的类。
 

参考文献

[1] M. Ester, H. Kriegel, J. Sander, X. Xu, A density-based algorithm for discovering clusters in large spatial databases with noise,  www.dbs.informatik.uni-muenchen.de/cgi-bin/papers?query=--CO
[2] M. Daszykowski, B. Walczak, D. L. Massart, Looking for Natural Patterns in Data. Part 1: Density Based Approach




以上是关于基于凸集上投影(POCS)的聚类算法的主要内容,如果未能解决你的问题,请参考以下文章

机器学习DBSCAN Algorithms基于密度的聚类算法

推荐机器学习:基于层次的聚类算法

机器学习聚类算法总结

基于k-means的聚类算法—机器学习

机器学习:聚类算法简介

DBSCAN