赞
踩
聚类分析是数据挖掘和机器学习中一种重要的无监督学习技术,旨在将数据集中的对象划分为多个"簇(cluster)"。每个簇由相似的对象组成,而不同簇之间的对象则存在明显差异。聚类分析广泛应用于客户细分、图像分割、基因表达数据分析等多个领域。
传统的聚类算法如K-Means、层次聚类等存在一些明显缺陷:
为了克服上述缺陷,1996年Martin Ester等人提出了基于密度的聚类算法DBSCAN(Density-Based Spatial Clustering of Applications with Noise)。DBSCAN具有以下优势:
因此,DBSCAN已成为聚类分析中应用最广泛的算法之一。
DBSCAN算法的核心思想是基于数据对象之间的"密度可达性(Density-Reachability)"关系对数据集进行聚类。密度可达性由两个参数决定:
具体来说,对于数据集D中任意两个对象p和q:
"密度可达性"是一种半自反、非对称的关系。
如果样本点p的Eps邻域内的样本点数量不小于MinPts,则称p为"核心对象(Core Point)"。
如果样本点p不是核心对象,但存在核心对象q使得p"密度可达"于q,则称p为"边界对象(Border Point)"。
如果样本点p既不是核心对象,也不是边界对象,则称p为"噪声对象(Noise Point)"。
由一个核心对象及其"密度可达"的所有对象(包括边界对象)组成的最大集合即为一个簇。
基于上述概念,DBSCAN算法将数据集D划分为多个"簇",以及一个"噪声对象集合"。
DBSCAN算法的伪代码如下:
DBSCAN(D, eps, MinPts): C = 0 # 簇的个数 FOR each unvisited point P in dataset D: mark P as visited N = getNeighbors(P, eps) IF size(N) < MinPts: mark P as NOISE ELSE: C = C + 1 expandCluster(P, N, C, eps, MinPts) expandCluster(P, N, C, eps, MinPts): add P to cluster C FOR each point P' in N: IF P' is not visited: mark P' as visited N' = getNeighbors(P', eps) IF size(N') >= MinPts: N = N merged with N' IF P' is not yet member of any cluster: add P' to cluster C getNeighbors(P, eps): return all points within P's eps-neighborhood
算法步骤:
expandCluster
函数expandCluster
函数:
时间复杂度为 $O(n \log n)$,其中n为样本数量。
在DBSCAN算法中,需要计算样本点之间的距离或相似度。常用的距离度量包括:
其中p和q为n维空间中的两个点。
其中$p \cdot q$为向量点积,$||p||$和$||q||$分别为p和q的L2范数。
其中A和B为两个集合,分子为交集元素个数,分母为并集元素个数。
用户可根据数据的特征选择合适的距离度量或相似度计算方法。
为了提高DBSCAN算法的计算效率,通常需要使用空间索引技术加速邻域搜索。常用的空间索引结构包括:
以K-D树为例,其构建过程可用如下伪代码表示:
create_kdtree(points, depth=0): if len(points) == 0: return None k = len(points[0]) # 维数 axis = depth % k # 按当前深度选择分割维度 # 按axis维度排序 sorted_points = sorted(points, key=lambda point: point[axis]) median = len(sorted_points) // 2 # 选择中位数点作为根节点 root = sorted_points[median] # 根节点 root.left = create_kdtree(sorted_points[:median], depth+1) root.right = create_kdtree(sorted_points[median+1:], depth+1) return root
在构建好K-D树后,可以高效地搜索给定点p的Eps邻域内的样本点集合:
search_neighbors(point, root, eps): if root is None: return [] neighbors = [] # 计算根节点与目标点的距离 dist = distance(root.point, point) # 如果距离小于eps,将根节点加入邻居列表 if dist < eps: neighbors.append(root.point) # 递归搜索左右子树 axis = depth % k if abs(root.point[axis] - point[axis]) < eps: neighbors.extend(search_neighbors(point, root.left, eps)) neighbors.extend(search_neighbors(point, root.right, eps)) elif point[axis] < root.point[axis]: neighbors.extend(search_neighbors(point, root.left, eps)) else: neighbors.extend(search_neighbors(point, root.right, eps)) return neighbors
使用空间索引可以将邻域搜索的时间复杂度从$O(n)$降低到$O(\log n)$,从而提高DBSCAN算法在大规模数据集上的性能。
下面给出一个使用Python和Scikit-Learn库实现DBSCAN算法的示例:
from sklearn.cluster import DBSCAN from sklearn.preprocessing import StandardScaler import numpy as np # 生成模拟数据集 X = np.array([[1, 2], [2, 2], [2, 3], [8, 7], [8, 8], [25, 80]]) # 数据标准化 X = StandardScaler().fit_transform(X) # 构建DBSCAN模型 dbscan = DBSCAN(eps=0.5, min_samples=2) # 训练DBSCAN模型 clusters = dbscan.fit_predict(X) print('样本点的簇标签:') print(clusters)
输出结果:
样本点的簇标签:
[ 0 0 0 -1 1 2]
可以看到,该数据集被划分为3个簇,标号分别为0,1,2。标号为-1表示噪声点。
接下来我们详细解释上述代码:
from sklearn.cluster import DBSCAN
from sklearn.preprocessing import StandardScaler
import numpy as np
X = np.array([[1, 2], [2, 2], [2, 3], [8, 7], [8, 8], [25, 80]])
X = StandardScaler().fit_transform(X)
dbscan = DBSCAN(eps=0.5, min_samples=2)
clusters = dbscan.fit_predict(X)
print('样本点的簇标签:')
print(clusters)
可以看到,DBSCAN算法能够自动发现数据集中的簇,并区分出噪声点。
尽管DBSCAN算法具有较高的计算效率,但在处理大规模高维数据集时,仍可能遇到性能瓶颈。下面介绍一些常见的DBSCAN算法优化技术:
对于非常大的数据集,可以先进行数据抽样,在抽样数据上运行DBSCAN算法,得到初步的簇划分结果。然后将全数据集投影到这些簇上,重新计算每个簇的核心对象和边界对象,从而得到最终的聚类结果。这种思路被称为DBSCAN的近似算法LDBSCAN。
DBSCAN算法中的邻域搜索和簇扩展过程可以进行并行化处理,以提高计算效率。常见的并行计算框架包括Spark、Hadoop等。
对于动态更新的数据流,可以使用增量DBSCAN算法。其基本思路是维护一个内存中的簇结构,对于新到达的样本点,判断其是否属于现有簇,或者形成一个新簇。这种方法避免了重复扫描全量数据的开销。
在某些应用场景下,可以对DBSCAN算法施加一些约束,如限制簇的最大/最小半径、最大/最小样本数量等,从而得到更合理的聚类结果。
层次DBSCAN算法采用分层思想,先在较大的eps值下发现粗粒度的簇,再在较小的eps值下细分每个粗粒度簇,从而提高效率。
对于某些特殊数据类型(如序列数据、图数据等),可以设计改进的距离度量或相似度计算方法,使DBSCAN算法能够更好地发现簇的内在结构。
通过上述优化技术,可以进一步提升DBSCAN算法在大规模数据集、高维数据、动态数据等场景下的性能表现。
DBSCAN算法由于其优良的聚类性能,已被广泛应用于多个领域:
客户细分与营销
在客户关系管理中,可以使用DBSCAN算法对客户数据进行细分,发现具
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。