密度峰值聚类算法介绍(DPC)

引言

Rodriguez 等于2014年提出快速搜索和寻找密度峰值的聚类(clustering by fast search and find of density peaks),简称密度峰值聚类(density peaks clustering,DPC)算法。

一、DPC算法

1.1 DPC算法的两个假设

1)类簇中心被类簇中其他密度较低的数据点包围;
2)类簇中心间的距离相对较远。

1.2 DPC算法的两个重要概念

1)局部密度
设有数据集为 X N × M = [ x 1 , x 2 , … , x N ] T X_{N\times M}=[x_1, x_2, … ,x_N ]^T XN×M=[x1,x2,,xN]T,其中 x i = [ x i 1 , x i 2 , … , x i M ] T x_i=[x_{i1}, x_{i2}, … ,x_{iM} ]^T xi=[xi1,xi2,,xiM]T,N为样本个数,M为样本维数。

对于样本点 i 的局部密度,局部密度有两种计算方式,离散值采用截断核的计算方式,连续值则用高斯核的计算方式。

2.方法模型

2.1 稳健深度自编码器

深度自编码器(Deep Auto-Encoder, DAE)被大量应用在图像识别,噪声去除与数据降维领域。

它是一种无监督学习算法,模型期望输出与输入相同。

参考链接
[1] 密度峰值聚类算法(DPC) 2021.11
[2] 基于相互邻近度的密度峰值聚类算法 2021.3

### 密度峰值聚类算法介绍 密度峰值聚类(Density Peak Clustering, DPC)是一种基于密度的聚类方法,该技术通过识别数据集中具有局部最高密度的数据点作为簇中心来实现聚类操作[^1]。这些被选中的点被称为“密度峰”,它们不仅拥有较高的样本密度而且距离其他更高密度点较远。 对于每一个对象而言,在DPC中有两个重要的参数用于描述其特性: - **局部密度 \( \rho_i \)** :衡量周围有多少邻居位于某个特定半径范围内; - **距离 \( \delta_i \)** : 定义为离第i个点最近的一个比它密度更高的点之间的最小欧氏距离;如果当前节点已经是全局最大密度,则设此值无穷大。 当这两个指标计算完毕之后,可以通过绘制决策图来进行可视化分析,其中横坐标表示局部密度\( \rho \),纵坐标代表距离\( \delta \) 。那些处于右上方区域内的点即被认为是潜在的核心点或者说密度高峰位置。 一旦确定了所有的核心点后,就可以按照一定规则分配剩余未分类的对象到最接近自己的高密度区形成最终的类别划分结果。 #### Python 实现代码示例 下面给出了一种简单的Python版本实现方式,利用`scipy.spatial.distance.pdist`函数计算两两点间欧式距离矩阵,并据此求解各点对应的局部密度以及最小距离向量。 ```python import numpy as np from scipy import linalg from sklearn.neighbors import KDTree def find_density_peaks(dist_matrix, dc=None): """Compute local densities rho and minimum distances delta.""" n_samples = dist_matrix.shape[0] # Compute the cutoff distance if not provided. if dc is None: sorted_distances = np.sort(dist_matrix.flatten()) percentile_2 = int(0.02 * len(sorted_distances)) dc = sorted_distances[percentile_2] # Calculate local density ρ based on Gaussian kernel function. gaussian_kernel = lambda d: np.exp(-(d / dc)**2) rhos = np.sum(gaussian_kernel(dist_matrix), axis=1) # Build a KD Tree to efficiently query nearest neighbors with higher density. tree = KDTree(np.column_stack((rhos, range(n_samples)))) queries = [(rho, i) for i, rho in enumerate(rhos)] _, indices = tree.query(queries, k=[2]) deltas = np.full_like(rhos, fill_value=np.inf) for idx, neighbor_idx in enumerate(indices[:, 0]): if rhos[idx] < rhos[neighbor_idx]: deltas[idx] = dist_matrix[idx][neighbor_idx] return rhos, deltas if __name__ == "__main__": # Generate some test data points. X = np.random.rand(50, 2) # Construct pairwise Euclidean distance matrix between all pairs of samples. dists = linalg.norm(X[:, np.newaxis, :] - X[np.newaxis, :, :], axis=-1) # Find density peaks according to given dataset. rhos, deltas = find_density_peaks(dists) print("Local Density:", rhos) print("Minimum Distances:", deltas) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值