假设数据集为,OPTICS算法的目标是输出一个有序排列,以及每个元素的两个属性值:核心距离,可达距离。
样本数据集为:D = {[1, 2], [2, 5], [8, 7], [3, 6], [8, 8], [7, 3], [4,5]}
假设eps = inf,min_samples=2,则数据集D在OPTICS算法上的执行步骤如下:
索引 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
元素 | (1, 2) | (2, 5) | (8, 7) | (3, 6) | (8, 8) | (7, 3) | (4, 5) |
核心距离 | 3.16 | 1.41 | 1.0 | 1.41 | 1.0 | 3.61 | 1.41 |
索引 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 核心对象 |
元素 | (1, 2) | (2, 5) | (8, 7) | (3, 6) | (8, 8) | (7, 3) | (4, 5) | |
核心距离 | 3.16 | 1.41 | 1.0 | 1.41 | 1.0 | 3.61 | 1.41 | |
第一次可达距离 | -- | 3.16 | 8.60 | 4.47 | 9.21 | 6.08 | 4.24 | 0 |
索引 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 核心对象 |
元素 | (1, 2) | (2, 5) | (8, 7) | (3, 6) | (8, 8) | (7, 3) | (4, 5) | |
核心距离 | 3.16 | 1.41 | 1.0 | 1.41 | 1.0 | 3.61 | 1.41 | |
第二次可达距离 | -- | -- | 6.32 | 1.41 | 6.70 | 5.38 | 2.0 | 1 |
索引 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 核心对象 |
元素 | (1, 2) | (2, 5) | (8, 7) | (3, 6) | (8, 8) | (7, 3) | (4, 5) | |
核心距离 | 3.16 | 1.41 | 1.0 | 1.41 | 1.0 | 3.61 | 1.41 | |
第三次可达距离 | -- | -- | 5.09 | -- | 5.39 | 5.0 | 1.41 | 3 |
索引 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 核心对象 |
元素 | (1, 2) | (2, 5) | (8, 7) | (3, 6) | (8, 8) | (7, 3) | (4, 5) | |
核心距离 | 3.16 | 1.41 | 1.0 | 1.41 | 1.0 | 3.61 | 1.41 | |
第四次可达距离 | -- | -- | 4.47 | -- | 5.0 | 3.61 | -- | 6 |
索引 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 核心对象 |
元素 | (1, 2) | (2, 5) | (8, 7) | (3, 6) | (8, 8) | (7, 3) | (4, 5) | |
核心距离 | 3.16 | 1.41 | 1.0 | 1.41 | 1.0 | 3.61 | 1.41 | |
第五次可达距离 | -- | -- | 4.12 | -- | 5.0 (5.10) |
-- | -- | 5 |
索引 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 核心对象 |
元素 | (1, 2) | (2, 5) | (8, 7) | (3, 6) | (8, 8) | (7, 3) | (4, 5) | |
核心距离 | 3.16 | 1.41 | 1.0 | 1.41 | 1.0 | 3.61 | 1.41 | |
第六次可达距离 | -- | -- | -- | -- | 1.0 | -- | -- | 2 |
所以最后的R:(0,1,3,6,5,2,4) ,对应的可达距离为:{∞,3.16,1.41,1.41,3.61,4.12,1.0}
按照最终的输出顺序绘制可达距离图
class sklearn.cluster.OPTICS(
*,
min_samples=5,
max_eps=inf,
metric='minkowski',
p=2,
metric_params=None,
cluster_method='xi',
eps=None,
xi=0.05,
predecessor_correction=True,
min_cluster_size=None,
algorithm='auto',
leaf_size=30,
memory=None,
n_jobs=None)
min_samples | int > 1 或介于0和1之间的浮点数,默认为5 点被视为核心点时,邻域中的样本数量 如果是浮点数,表示样本数量的一部分 |
max_eps | 两个样本被视为彼此邻域的最大距离。 np.inf的默认值将识别所有规模的聚类; 降低max_eps将导致更短的运行时间 |
metric | str或可调用,默认为'minkowski' 用于距离计算的度量。可以使用 来自scikit-learn:['cityblock', 'cosine', 'euclidean', 'l1', 'l2', 'manhattan'] 来自scipy.spatial.distance:['braycurtis', 'canberra', 'chebyshev', 'correlation', 'dice', 'hamming', 'jaccard', 'kulsinski', 'mahalanobis', 'minkowski', 'rogerstanimoto', 'russellrao', 'seuclidean', 'sokalmichener', 'sokalsneath', 'sqeuclidean', 'yule'] |
p | 闵可夫斯基度量的参数 |
xi | float在0和1之间,默认为0.05 确定可达性图中构成聚类边界的最小陡度。 例如,可达性图中的向上点被定义为一个点与其后继的比率最多为1-xi。 仅在cluster_method='xi'时使用 |
min_cluster_size | int > 1 或介于0和1之间的浮点数,默认为None OPTICS聚类中的最小样本数量,表示为绝对数量或样本数量的一部分(至少为2)。如果为None,则使用min_samples的值。 仅在cluster_method='xi'时使用。 |
algorithm | {'auto', 'ball_tree', 'kd_tree', 'brute'},默认为'auto' 用于计算最近邻居的算法: 'ball_tree'将使用BallTree。 'kd_tree'将使用KDTree。 'brute'将使用蛮力搜索。 'auto'(默认)将尝试根据传递给fit方法的值决定最合适的算法。 |
leaf_size | 传递给BallTree或KDTree的叶子大小。这会影响构建和查询的速度,以及存储树所需的内存。最佳值取决于问题的性质。 |
cluster_method | str,默认为'xi' 使用计算的可达性和排序提取聚类的方法。可能的值是“xi”和“dbscan” |
from sklearn.cluster import OPTICS
import numpy as np
X = np.array([[1, 2], [1, 4], [1, 0],
[10, 2], [10, 4], [10, 0]])
op=OPTICS(min_samples=2).fit(X)
op.labels_
#array([0, 0, 0, 1, 1, 1])
op.ordering_
#array([0, 1, 2, 3, 4, 5])
#按聚类顺序排列的样本索引列表
op.reachability_
#array([inf, 2., 2., 9., 2., 2.])
#按对象顺序索引的每个样本的可达距离
op.core_distances_
#array([inf, 2., 2., 9., 2., 2.])
#每个样本成为核心点的核心距离
#永远不会成为核心的点的距离为无穷大。
参考内容:机器学习笔记(十一)聚类算法OPTICS原理和实践_optics聚类_大白兔黑又黑的博客-CSDN博客
(4)聚类算法之OPTICS算法 - 知乎 (zhihu.com)