OPTICS聚类

OPTICS聚类

Ordering Points To Identify Cluster Structure

  1. DBSCAN算法的衍生算法
  2. 引入可达距离,解决 ε \varepsilon ε参数确定的问题

定义

  1. 样本点 x i x_i xi的核心距离
    若样本点 x i x_i xi为核心点,则其有核心距离,否则没有核心距离
    如下图,在指定 ε \varepsilon ε距离阈值和MinPts=4时,
    样本点 x i x_i xi第一近邻点为本身(这里计入本身点),第二近邻点为样本2,第三近邻点为样本3 ( x 1 ) (x_1) (x1),第四(MinPts)近邻点为样本4,也就是说第MinPts近邻点在样本点 x i x_i xi ε \varepsilon ε邻域内,则样本点 x i x_i xi必为核心点,且其核心距离为样本点 x i x_i xi到第MinPts近邻点之间的距离,如图中 c ( x i ) c(x_i) c(xi)
    OPTICS聚类_第1张图片
  2. 样本点 x j x_j xj到样本点 x i x_i xi的可达距离
    只有样本点 x i x_i xi为核心点时才被可达,否则这个可达距离不存在
    如上图样本点 x i x_i xi为核心点,则其 ε \varepsilon ε邻域内的点 x j x_j xj x i x_i xi的可达距离为:
    m a x ( d i j , c ( x i ) ) max(d_{ij},c(x_i)) max(dij,c(xi))
    d i j d_{ij} dij x i x_i xi x j x_j xj之间的距离
    c ( x i ) c(x_i) c(xi)为核心点 x i x_i xi的核心距离
    显然有
    x 1 x_1 x1 x i x_i xi的可达距离 r ( x 1 ) = c ( x i ) r(x_1)=c(x_i) r(x1)=c(xi)
    x 2 x_2 x2 x i x_i xi的可达距离 r ( x 2 ) = d i 2 r(x_2)=d_{i2} r(x2)=di2

OPTICS算法流程

  1. 对于样本集S, m 个 样 本 , n 个 特 征 m个样本,n个特征 mn
    初始化所有点的可达距离为inf, r e a c h _ d i s t = a r r a y ( [ n p . i n f ] ∗ m ) reach\_dist=array([np.inf]*m) reach_dist=array([np.inf]m)
    初始化根据可达距离从小到大排序的样本的列表全为0, o r d e r i n g = n p . z e r o s ( m , d t y p e = i n t ) ordering=np.zeros(m,dtype=int) ordering=np.zeros(m,dtype=int)
    初始化样本是否已处理的标记全为False, p r o c e s s e d = n p . z e r o s ( m , d t y p e = b o o l ) processed=np.zeros(m,dtype=bool) processed=np.zeros(m,dtype=bool)
  2. 假设 ε \varepsilon ε为inf,根据参数MinPts计算出所有点核心距离,记core_dist,核心距离大于 ε \varepsilon ε阈值,则不存在核心距离用inf 表示
  3. 从未处理的点中取当前可达距离最小的点 i d x = n p . a r g m i n ( r e a c h _ d i s t ) idx=np.argmin(reach\_dist) idx=np.argmin(reach_dist),放入 o r d e r i n g ordering ordering第一个位置,并标记是否处理为True, p r o c e s s e d [ i d x ] = T r u e processed[idx]=True processed[idx]=True,若当前 i d x idx idx样本具有核心距离,计算当前点 i d x idx idx p r o c e s s e d processed processed中为False的点之间的可达距离 r d i s t rdist rdist,若 r d i s t rdist rdist中的可达距离小于 r e a c h _ d i s t reach\_dist reach_dist中对应的可达距离值,则更新替换为 r d i s t rdist rdist中的值;若当前 i d x idx idx不具有核心距离(inf),即不是核心点,则不处理
  4. 重复3,取当前未处理的样本,即 p r o c e s s e d = F a l s e processed=False processed=False的样本,返回这些未处理的样本在 r e a c h _ d i s t reach\_dist reach_dist中可达距离最小的一个样本点 i d x idx idx,加入 o r d e r i n g ordering ordering的第二个位置,并标记是否处理为True, p r o c e s s e d [ i d x ] = T r u e processed[idx]=True processed[idx]=True. 是核心点则计算它与其他未处理的点的可达距离,否则不处理,直到所有的样本处理完,算法结束。

演示示例

有如下数据
x = [ 1 3 3 3 2 0.2 10 0.8 10.8 1.4 12 0.8 ] \begin{gathered} x=\begin{bmatrix} 1 & 3 \\ 3 & 3 \\ 2 & 0.2 \\ 10 &0.8 \\ 10.8&1.4\\ 12&0.8\end{bmatrix} \quad \end{gathered} x=1321010.812330.20.81.40.8
OPTICS聚类_第2张图片

Python实现OPTICS

百度网盘:https://pan.baidu.com/s/1UUgK-uPfWpRopJ_C1FZY9w
提取码:i4tn

Sklearn库实现OPTICS

import numpy as np
from sklearn.cluster import OPTICS
from matplotlib import pyplot as plt
#load data
x=np.loadtxt("optics_sample.txt")

#instantiate
optics=OPTICS(max_eps=np.inf,eps=3,min_samples=3,cluster_method="dbscan")
optics.fit(x)

#按照可达距离从小到大排序的样本点
optics.ordering_
#[0,1,2,3,4,5]
#样本的可达距离
rdist=optics.reachability_[optics.ordering_]

#可视化可达距离
plt.plot(range(x.shape[0]),rdist,marker="o",markeredgewidth=3,linestyle="-")
plt.title("sklearn-optics")
plt.grid()
plt.xlabel("index")
plt.ylabel("reach dist")
plt.show()

排序样本的可达距离,每一个低谷为一个聚类簇
OPTICS聚类_第3张图片
可视化聚类样本点:

y_pred=optics.labels_
plt.scatter(x[:,0],x[:,1],s=50,c=y_pred,marker="^",edgecolors=None,linewidths=1,cmap="cool")
plt.title("cluster samples")
plt.grid()
plt.xlabel("f1")
plt.ylabel("f2")
plt.axis("equal")
plt.show()

OPTICS聚类_第4张图片

你可能感兴趣的:(机器学习算法学习,机器学习,聚类,python)