13 年
手机商铺
公司新闻/正文
540 人阅读发布时间:2022-07-08 15:02
DBSCAN是一种无监督的ML聚类算法,输入参数为Eps(距离参数)与MinPts(点个数阈值),基于密度的聚类算法可以发现任意形状的聚类。在基于密度的聚类算法中,通过在数据集中寻找被低密度区域分离的高密度区域,将分离出的高密度区域作为一个独立的类别。
密度基于中心的方法我们可以将点分类为以下3个:
DBSAN使用簇的基于密度的定义,因此它是相对抗噪声的,能够处理任意形状和大小的簇,这一特点使其能够发现使用K均值等其他距离聚类方式无法发现的簇。
在簇的密度变化过大的情况下,该聚类方式的灵敏度会大幅下降。同时在遇到高维数据时,对密度定义相对困难,需要进行额外降维。
计算欧氏距离:
def find_core(j, x, eps): N = list() for i in range(x.shape[0]): temp = np.sqrt(np.sum(np.square(x[j] - x[i]))) # 计算欧式距离 if temp <= eps: N.append(i) return set(N)
具体聚类过程:
def DBSCAN(X, eps, min_Pts): k = -1 eps_list = [] core_list = [] point = set([x for x in range(len(X))]) cluster = [-1 for _ in range(len(X))]# 进行聚类 for i in range(len(X)): eps_list.append(find_core(i, X, eps)) if len(eps_list[-1]) >= min_Pts: core_list.append(i) core_list = set(core_list) while len(core_list) > 0: point1 = copy.deepcopy(point) j = random.choice(list(core_list))#随机选取核心点 k = k + 1 Q = list() Q.append(j) point.remove(j) while len(Q) > 0: q = Q[0] Q.remove(q) if len(eps_list[q]) >= min_Pts: delta = eps_list[q] & point deltalist = list(delta) for i in range(len(delta)): Q.append(deltalist[i]) point = point - delta ball = point1 - point listball = list(ball) for i in range(len(ball)): cluster[listball[i]] = k core_list = core_list - ball return cluster
eps=0.5、min_Pts=9(以鸢尾花数据为例)
Scikit-learn中集成了DBSCAN算法,具体参数如下:
def __init__(self, eps=0.5, min_samples=5, metric='euclidean', metric_params=None,