密度峰值聚类介绍与matlab实现

1、算法简介:

        2014年6⽉,Alex Rodriguez和Alessandro Laio在Science上发表了⼀篇名《Clustering by fast search and find of density peaks》的文章,提供了⼀种简洁而优美的聚类算法,是⼀种基于密度的聚类方法,可以识别各种形状的类簇,并且参数很容易确定。它克服了DBSCAN中不同类的密度差别大、邻域范围难以设定的问题,鲁棒性强。

2、算法对于数据集的假设:

        在这个算法中对数据集有两条假设:

                1.数据集在空间分布并不均匀,数据中局部高密度点被一些局部低密度点包围

                2.数据集中局部高密度点之间的相对距离较大

3、算法相关公式:

        1)密度计算:  \rho_i=\sum_{j}\chi (d_{ij}-d_c)其中,密度计算有两种计算方式:1.传统的欧式距离计算距离,将距离小于点的数量直接作为密度,2.计算欧式距离并计算高斯函数值,将所有点值的和作为密度。

 2)局部高密度点距离计算:,当dij是密度最高的点时:

4、算法过程

1)计算数据密度

根据设定的截断距离d_c,计算每个数据点的局部密度\rho_i

2)局部高密度点距离

计算每个点到高于自身局部密度值点的最小距离。得到\delta_i

3)根据密度与距离估计中心点

对每⼀个点,绘制出局部密度\rho_i与高局部密度点距离\delta_i的散点图

可以看出上图中的大部分数据都具有较小的距离,但是有一些数据有着较大的距离与密度,这样的点我们选择为聚类中心点。同时将有着较高距离较低密度的点确定为异常点

4)划分剩余数据点(聚类过程)

把每个数据点归类到比他们的密度更大的最相近的类中心所属的类别中。

代码实现:

1)密度计算

%% 密度计算函数
function data_density=cal_density(data,cut_dist)
    data_len=size(data,1);
    data_density=zeros(1,data_len);
    for idata_len=1:data_len
        temp_dist=pdist2(data,data(idata_len,:));
        data_density(idata_len)=sum(exp(-(temp_dist./cut_dist).^2));
    end
end

2)距离计算

%% 计算delta
function data_delta=cal_delta(data,data_density)
    data_len=size(data,1);
    data_delta=zeros(1,data_len);
    for idata_len=1:data_len
        index=data_density>data_density(idata_len);
        if sum(index)~=0
            data_delta(idata_len)=min(pdist2(data(idata_len,:),data(index,:)));
        else
            data_delta(idata_len)=max(pdist2(data(idata_len,:),data));
        end
    end
end

3)聚类中心点寻找

%% 寻找聚类中心点
function [center,center_index]=find_center(data,data_delta,data_density,cut_dist)
    R=data_density.*data_delta;
    [sort_R,R_index]=sort(R,"descend");
    gama=abs(sort_R(1:end-1)-sort_R(2:end));
    [sort_gama,gama_idnex]=sort(gama,"descend");
    gmeans=mean(sort_gama(2:end));
    %寻找疑似聚类中心点
    temp_center=data(R_index(gama>gmeans),:);
    temp_center_index=R_index(gama>gmeans);
    %进一步筛选中心点
    temp_center_dist=pdist2(temp_center,temp_center);
    temp_center_len=size(temp_center,1);
    center=[];
    center_index=[];
    %判断中心点之间距离是否小于2倍截断距离并中心点去重
    for icenter_len=1:temp_center_len
        temp_index=find(temp_center_dist(icenter_len,:)<2*cut_dist);
        [~,max_density_index]=max(data_density(temp_center_index(temp_index)));
        if sum(center_index==temp_center_index(temp_index(max_density_index)))==0
            center=[center;temp_center(temp_index(max_density_index),:)];
            center_index=[center_index,temp_center_index(temp_index(max_density_index))];
        end
        % center(icenter_len,:)=temp_center(temp_index(max_density_index),:);
    end
end

4)聚类过程

%% 聚类算法
function cluster=Clustering(data,center,center_index,data_density)
    data_len=size(data,1);
    data_dist=pdist2(data,data);
    cluster=zeros(1,data_len);
    % 标记中心点序号
    for i=1:size(center_index,2)
        cluster(center_index(i))=i;
    end
    % 对数据密度进行降序排序
    [sort_density,sort_index]=sort(data_density,"descend");
    for idata_len=1:data_len
        %判断当前数据点是否被分类
        if cluster(sort_index(idata_len))==0
            near=sort_index(idata_len);
            while 1
                near_density=find(data_density>data_density(near));
                near_dist=data_dist(near,near_density);
                [~,min_index]=min(near_dist);
                if cluster(near_density(min_index))
                    cluster(sort_index(idata_len))=cluster(near_density(min_index));
                    break;
                else
                    near=near_density(min_index);
                end
            end
        end
    end
end

完整代码:峰值聚类算法(matlab)_matlab密度峰值聚类算法-机器学习文档类资源-CSDN下载

  • 12
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
密度峰值聚类算法(matlab)是一种用于聚类算法,它基于数据点的密度来找到聚类的中心。该算法由三个部分组成:聚类算法密度计算和数据点分类。 聚类算法密度峰值聚类算法的核心部分,它通过计算数据点之间的距离和密度来确定每个数据点的聚类归属。算法首先标记中心点序号,然后对数据点的密度进行降序排序。接下来,对于每个数据点,判断其是否已被分类。如果未分类,则找到与其密度更大的邻近点,并将其归类为同一类别。这个过程会一直进行,直到所有的数据点都被分类。 密度计算是计算每个数据点的密度的函数。它通过计算数据点与其他点之间的距离,并根据一个预设的截断距离来确定数据点的密度。计算过程中,使用高斯核函数来表示距离的影响,将距离转化为密度值。最后,将所有的数据点的密度值计算出来。 综上所述,密度峰值聚类算法(matlab)是一种基于数据点密度聚类算法,通过计算数据点之间的距离和密度来确定聚类的中心,并将数据点分类到不同的聚类中。这个算法可以帮助人们对数据进行有效的聚类分析。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [密度峰值聚类介绍matlab实现](https://blog.csdn.net/qq_30977037/article/details/112160360)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值