Paper: 《SCAN: A Structural Clustering Algorithm for Networks》
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. 节点相似度
节点相似度定义为两个节点共同邻居的数目与两个节点邻居数目的几何平均数的比值(这里的邻居均包含节点自身)。
其中
2.
ϵ
- 邻居
节点的
3. 核节点
核节点是指
4. 直接可达
节点
5. 可达
节点
6. 相连
若核节点u可达节点v和节点w,则称节点v和节点w相连.
7.相连聚类
如果一个非空子图C中的所有节点是相连的,并且C是满足可达的最大子图,那么称C是一个相连聚类。
8. 桥节点(hub)
与至少两个聚类相邻的孤立节点.
9. 离群点(outlier)
只与一个聚类相邻或不与任何聚类相邻的孤立节点.
10. 引理:
如果
11. 引理:
三、具体算法
1、对于每个未分配社团的节点
2、若
3、最后检查所有的non-menber节点,若其相邻节点存在于两个及以上的社团中,则将其标为hub节点,否则标为outlier。
...
如上文章转载自:http://blog.csdn.net/DawnRanger/article/details/51108433
SparklingGraph介绍 (git主页)
大规模,分布式图形处理变得简单!从多种格式加载图形并计算度量
动态PSCAN
这是使用PSCAN alghoritm进行epsilon参数搜索的解决方案示例。Aglhoritm查找可能的epsilon值,并使用二进制搜索来找到一个距离请求数量最近的分区。找到的集群被用作分区。
import ml.sparkling.graph.operators.partitioning.PSCANBasedPartitioning import org.apache.spark.SparkContext import org.apache.spark.graphx.Graph implicit ctx:SparkContext=??? // initialize your SparkContext as implicit value val graph = ??? // load your graph (for example using Graph loading API) val numberOfRequiredPartitions=24 val partitionedGraph = PSCANBasedPartitioning.partitionGraphBy(graph,numberOfRequiredPartitions)
使用SCAN算法做社区检测:
import ml.sparkling.graph.operators.OperatorsDSL._ import ml.sparkling.graph.operators.algorithms.pscan.PSCAN.ComponentID import org.apache.spark.SparkContext import org.apache.spark.graphx.Graph implicit ctx:SparkContext=??? // initialize your SparkContext as implicit value val graph =??? // load your graph (for example using Graph loading API) val components: Graph[ComponentID, Int] = PSCAN.computeConnectedComponents(graph) // Graph where each vertex is associated with its component identifier或者
import ml.sparkling.graph.operators.OperatorsDSL._ import ml.sparkling.graph.operators.algorithms.pscan.PSCAN.ComponentID import org.apache.spark.SparkContext import org.apache.spark.graphx.Graph implicit ctx:SparkContext=??? // initialize your SparkContext as implicit value val graph =??? // load your graph (for example using Graph loading API) val components: Graph[ComponentID, Int] = graph.PSCAN(epsilon=0.5) // Graph where each vertex is associated with its component identifier前提是使用sparkling的方式导入图才可以使用.
更多算法实现请参考官网, 与使用方法参看API: http://sparkling-graph.github.io/sparkling-graph/latest/api/#ml.sparkling.graph.api.generators.package