如何在Python中计算sklearn.dbscan聚类结果的置信度或簇内平均距离
DBSCAN聚类补充计算实现思路
簇内样本两两平均距离计算
计算逻辑为按簇分组后过滤噪声,再对同簇样本计算两两距离的平均值,实现步骤如下:
- 过滤DBSCAN输出的标签值为-1的噪声样本,保留所有归属到有效簇的样本特征
- 按簇标签对样本特征做分组,相同簇的特征归为同一组
- 对每个簇的特征矩阵,使用
sklearn.metrics.pairwise_distances计算两两距离矩阵,排除对角线自身到自身的0值后取平均值,即为该簇的内平均距离
示例实现代码:
import numpy as np from sklearn.cluster import DBSCAN from sklearn.metrics import pairwise_distances # X为输入特征矩阵 dbscan = DBSCAN(eps=0.5, min_samples=5).fit(X) labels = dbscan.labels_ # 过滤噪声,取所有有效簇ID valid_clusters = np.unique(labels[labels != -1]) cluster_inner_avg_dist = {} for cid in valid_clusters: cluster_feat = X[labels == cid] # 计算两两距离 dist_mat = pairwise_distances(cluster_feat) # 取上三角非对角线元素计算平均,避免重复计算和自身距离干扰 avg_dist = dist_mat[np.triu_indices_from(dist_mat, k=1)].mean() cluster_inner_avg_dist[cid] = avg_dist
聚类结果置信度计算
DBSCAN没有原生的置信度输出,常用的计算思路有以下三类:
- 样本级置信度(基于核心点密度)
核心点索引存储在dbscan.core_sample_indices_中,本身满足密度可达要求:- 核心点置信度可设置为1,也可以用核心点邻域内的样本数除以DBSCAN的
min_samples参数做归一化 - 边界点置信度可计算为
1 - (该点到所属簇最近核心点的距离 / eps),距离越近置信度越高 - 噪声点置信度统一设为0
- 核心点置信度可设置为1,也可以用核心点邻域内的样本数除以DBSCAN的
- 样本级置信度(基于簇内紧凑度)
先拿到前面计算的簇内平均距离,单个样本的置信度计算为1 - (该样本到簇内其他所有样本的平均距离 / 簇内平均距离),值越接近1置信度越高,计算结果小于0的统一截断为0 - 簇级置信度
可以用1 - (簇内平均距离 / eps)衡量,值越高说明簇内样本越紧凑,聚类结果可靠性越高,若计算结果为负,说明该簇内平均距离超过了DBSCAN的邻域阈值,聚类质量较差
注意:如果输入特征维度较高,建议先做PCA等降维处理后再计算距离,避免维度灾难导致距离区分度下降,影响计算结果的参考价值。
内容的提问来源于stack exchange,提问作者velvetrock
相关产品推荐
相关产品推荐

