SCAN:一种基于密度的社团发现算法
2016-04-09 23:32
519 查看
Paper: 《SCAN: A Structural Clustering Algorithm for Networks》
Auther: Xiaowei Xu, Nurcan Yuruk, Zhidan Feng, Thomas A. J. Schweiger
Conference: SIGKDD 2007
主要思想在于,在考虑两点之间的关系的时候,不仅考虑它们的直接链接,而是利用它们的邻居节点来作为聚类的标准。也就是说,节点根据它们共享邻居方式而聚类。
由图可知,节点0、5共享了4个节点,节点9、13只共享了2个节点,显然它们在聚类是应采取不同的聚类方式。
σ(v,w)=|Γ(v)∩Γ(w)||Γ(v)||Γ(w)|−−−−−−−−−−√ \sigma(v, w) = \frac{|\Gamma(v)\cap \Gamma(w)|}{\sqrt{|\Gamma(v)|| \Gamma(w)|}}
其中 Γ(x)\Gamma(x) 表示节点 xx 及其相邻节点所组成的集合。
Nϵ={w∈Γ(v)|σ(v,w)≥ϵ}N_{\epsilon}=\{w \in \Gamma(v) | \sigma(v, w) \geq \epsilon \}
COREϵ,μ(v)⇔|Nϵ(v)|≥μ {CORE}_{\epsilon,\mu}(v) \Leftrightarrow | N_{\epsilon}(v)| \geq \mu
DirREACHϵ,μ(v,w)⇔COREϵ,μ(v)∧w∈Nϵ(v) {DirREACH}_{\epsilon,\mu}(v,w) \Leftrightarrow {CORE}_{\epsilon,\mu}(v) \land w \in N_{\epsilon}(v)
REACHϵ,μ(v,w)⇔∃v1,…,vn∈V:v1=v∧vn=w∧∀i∈{1,…,vn}:DirREACHϵ,μ(vi,vi+1) {REACH}_{\epsilon,\mu}(v,w) \Leftrightarrow \\
\exists v_1,\dots,v_n \in V:v_1 =v \land v_n = w \land \\
\forall i \in \{ 1,\dots,v_n\}: {DirREACH}_{\epsilon,\mu}(v_i,v_{i+1})
CONNECTϵ,μ(v,w)⇔∃u∈V:REACHϵ,μ(u,v)∧REACHϵ,μ(u,w) CONNECT_{\epsilon,\mu}(v,w) \Leftrightarrow \exists u \in V:REACH_{\epsilon,\mu}(u,v) \land REACH_{\epsilon,\mu}(u,w)
CLUSTERϵ,μ(C)⇔(1)Connectivity:∀v,w∈C:CONNECTϵ,μ(v,w)(2)Maximality:∀v,w∈V:v∈C∧REACHϵ,μ(v,w)⇒w∈C \begin{align*}
&{CLUSTER}_{\epsilon,\mu}(C) \Leftrightarrow \\
&(1)Connectivity: \\
&\quad \forall v,w \in C: CONNECT_{\epsilon,\mu}(v,w) \\
&(2)Maximality:\\
&\quad \forall v,w \in V: v \in C \land REACH_{\epsilon,\mu}(v,w) \Rightarrow w \in C
\end{align*}
2、若 vv 不是核节点则将其标志为non-member。
3、最后检查所有的non-menber节点,若其相邻节点存在于两个及以上的社团中,则将其标为hub节点,否则标为outlier。
Auther: Xiaowei Xu, Nurcan Yuruk, Zhidan Feng, Thomas A. J. Schweiger
Conference: SIGKDD 2007
一:SCAN算法简介
SCAN算法是由机器学习里的基于密度的聚类算法DBSCAN改进而来的一种非重叠社团发现算法,具有线性时间复杂度。其一大亮点在于能发现社团中桥节点(hub)和离群点(outlier)。主要思想在于,在考虑两点之间的关系的时候,不仅考虑它们的直接链接,而是利用它们的邻居节点来作为聚类的标准。也就是说,节点根据它们共享邻居方式而聚类。
由图可知,节点0、5共享了4个节点,节点9、13只共享了2个节点,显然它们在聚类是应采取不同的聚类方式。
二、主要概念介绍
1. 节点相似度
节点相似度定义为两个节点共同邻居的数目与两个节点邻居数目的几何平均数的比值(这里的邻居均包含节点自身)。σ(v,w)=|Γ(v)∩Γ(w)||Γ(v)||Γ(w)|−−−−−−−−−−√ \sigma(v, w) = \frac{|\Gamma(v)\cap \Gamma(w)|}{\sqrt{|\Gamma(v)|| \Gamma(w)|}}
其中 Γ(x)\Gamma(x) 表示节点 xx 及其相邻节点所组成的集合。
2. ϵ\epsilon - 邻居
节点的 ϵ\epsilon - 邻居定义为与其相似度不小于 ϵ\epsilon 的节点所组成的集合。Nϵ={w∈Γ(v)|σ(v,w)≥ϵ}N_{\epsilon}=\{w \in \Gamma(v) | \sigma(v, w) \geq \epsilon \}
3. 核节点
核节点是指 ϵ\epsilon 邻居的数目大于 μ\mu 的节点。COREϵ,μ(v)⇔|Nϵ(v)|≥μ {CORE}_{\epsilon,\mu}(v) \Leftrightarrow | N_{\epsilon}(v)| \geq \mu
4. 直接可达
节点 ww 是核节点 vv 的 ϵ\epsilon 邻居,那么称从 vv 直接可达 ww.DirREACHϵ,μ(v,w)⇔COREϵ,μ(v)∧w∈Nϵ(v) {DirREACH}_{\epsilon,\mu}(v,w) \Leftrightarrow {CORE}_{\epsilon,\mu}(v) \land w \in N_{\epsilon}(v)
5. 可达
节点 vv 可达 ww ,当且仅当存在一个节点链 v1,…,vn∈V,v1=v,vn=w v_1,\dots,v_n \in V, v_1 = v, v_n = w ,使得 vi+1v_{i+1} 是 从viv_i 直接可达的。REACHϵ,μ(v,w)⇔∃v1,…,vn∈V:v1=v∧vn=w∧∀i∈{1,…,vn}:DirREACHϵ,μ(vi,vi+1) {REACH}_{\epsilon,\mu}(v,w) \Leftrightarrow \\
\exists v_1,\dots,v_n \in V:v_1 =v \land v_n = w \land \\
\forall i \in \{ 1,\dots,v_n\}: {DirREACH}_{\epsilon,\mu}(v_i,v_{i+1})
6. 相连
若核节点u可达节点v和节点w,则称节点v和节点w相连.CONNECTϵ,μ(v,w)⇔∃u∈V:REACHϵ,μ(u,v)∧REACHϵ,μ(u,w) CONNECT_{\epsilon,\mu}(v,w) \Leftrightarrow \exists u \in V:REACH_{\epsilon,\mu}(u,v) \land REACH_{\epsilon,\mu}(u,w)
7.相连聚类
如果一个非空子图C中的所有节点是相连的,并且C是满足可达的最大子图,那么称C是一个相连聚类。CLUSTERϵ,μ(C)⇔(1)Connectivity:∀v,w∈C:CONNECTϵ,μ(v,w)(2)Maximality:∀v,w∈V:v∈C∧REACHϵ,μ(v,w)⇒w∈C \begin{align*}
&{CLUSTER}_{\epsilon,\mu}(C) \Leftrightarrow \\
&(1)Connectivity: \\
&\quad \forall v,w \in C: CONNECT_{\epsilon,\mu}(v,w) \\
&(2)Maximality:\\
&\quad \forall v,w \in V: v \in C \land REACH_{\epsilon,\mu}(v,w) \Rightarrow w \in C
\end{align*}
8. 桥节点(hub)
与至少两个聚类相邻的孤立节点.9. 离群点(outlier)
只与一个聚类相邻或不与任何聚类相邻的孤立节点.10. 引理:
如果 vv 是一个核节点,那么从 vv 可达的节点集是一个结构相连聚类11. 引理:
CC 是一个结构相连聚类, pp 是 CC 中的一个核节点。那么 CC 等于从 pp 结构可达的节点集。三、具体算法
1、对于每个未分配社团的节点 vv ,检查 vv 是否是核节点,是核节点则将其直接可达节点分配到一个社团中(社团标号记为该节点),并将其 ϵ\epsilon-邻居放进队列中,重复进行1步骤(类似于对直接可达节点进行DFS)。2、若 vv 不是核节点则将其标志为non-member。
3、最后检查所有的non-menber节点,若其相邻节点存在于两个及以上的社团中,则将其标为hub节点,否则标为outlier。
ALGORITHM SCAN(G=<V, E>, ε, μ) // all vertices in V are labeled as unclassified; for each unclassified vertex v ∈ V do // STEP 1. check whether v is a core; if COREε,μ(v) then // STEP 2.1. if v is a core, a new cluster is expanded; generate new clusterID; insert all x ∈ Nε (v) into queue Q; while Q ≠ 0 do y = first vertex in Q; R = {x ∈ V | DirREACHε,μ(y, x)}; for each x ∈ R do if x is unclassified or non-member then assign current clusterID to x; if x is unclassified then insert x into queue Q; remove y from Q; else // STEP 2.2. if v is not a core, it is labeled as non-member label v as non-member; end for. // STEP 3. further classifies non-members for each non-member vertex v do if (∃ x, y ∈ Γ(v) ( x.clusterID ≠ y.clusterID) then label v as hub else label v as outlier; end for. end SCAN.
相关文章推荐
- memcpy实例(一)
- Java中equals和==的区别
- Mac/Linux --管理与维护
- 谈谈什么情况下会导致内存泄露
- spark shell ,在Windows上build Spark
- javascript正则表达式验证身份证
- 蓝桥杯2
- python基本数据类型-字符串
- 001.php输出echo
- C语言学习016:单链表
- 20145214实验一 Java开发环境的熟悉
- c++sort函数的用法浅析
- Tricks(二十七)—— 如何在不使用 np.argsort 的情况下获得排序后元素的下标
- StringBuffer的相关区别
- memset实例(一)
- php相关错误
- iOS 选项器
- 07python之字符串的常用方法
- 初识PHP(三)面向对象特性
- javaWeb学习记录:数据库:事务