http://blog.csdn.net/pipisorry/article/details/49052255

海量数据挖掘Mining Massive Datasets(MMDs) -Jure Leskovec courses学习笔记之社交网络之社区检测:高级技巧-线性代数方法

Communities in Social Networks:  Intuitively, "communities" are sets of individuals in a network like Facebook friends, that have an unusually high density of edges. 

{这篇博客的内容:part of the advanced track.  They use concepts from linear algebra to explain how to break graphs optimally (i.e., break the fewest edges) into disjoint "communities."}

聚类检测

Networks & Communities

Note: 图中我们可以看到有三个clusters,并且有些clusters还可以继续划分成小clusters(hierarchical structure)。

图聚类的目的和应用

Goal : Find densely linked clusters. Given a network, we want to find sets of nodes where there are lots of connections between the members of the set and few connections to the outside of the set.

示例:下面的邻接矩阵中的点表示用户查询一个词,广告投放者是否投放广告。从中检测微市场。

应用一

Note: 这些advertiser和query的坐标都是经过某种排序才可以发现这些特定的clusters。

应用二:社交网络中发现社交圈/社区find social communities, or call them social circles



皮皮blog

聚类检测方法1:图聚类划分conductance score

{怎么聚类,首先要定义什么是好的聚类。需要说明的是,下面这个划分准则并不是最好的,这个划分准则对应的算法是N-P难的问题}

划分任务好坏的直觉知识

首先给定一个图G,要对其进行划分

直觉上比较好的cluster划分

图切割和cut score

将cluster质量表示成一个cut的函数

这样我们的目标是找到一个相当容易被切割的nodes集合。

但是这样会出现下面的问题

The problem is if I use this cut score to find good clusters , I can find kind of uninteresting degenerate solutions(无趣的退化解)

根本原因是没有考虑内部nodes的连接。

图划分准则:传导conductance score

pi(A)公式解读:

分子其实就是cut(A),对应external cluster connections。

分母则是集合A的容量volume,是至少有一条边在A中的边的权重和,也就是A中节点度的和(实际上是看成了有向边来计算的)。取min是因为if I have set a to be very big, then the volume of A can kind of overpower overpower the whole thing.所以假定A的大小小于整个图的一半。

pi(A)计算的值越小,那么找到的cluster越好。

这种准则的优点:

In some sense, it produces pieces clusters that are kind of comparable sizes.

图传导划分示例

皮皮blog

聚类检测方法2:谱图划分spectral graph partitioning

{通常的算法里面,“谱”主要指 Laplacian matrix 的应用,具体物理意义应该是反映了图中各种节点之间的某种内在的连接信息}

图的划分目标和任务

Goals:Finding Clusters

右图中的邻接矩阵是重排序过的reordered,这样就可以清晰地看出其中的clusters。

图的最优划分是一个NP难问题,需要寻找另一种解决思路——谱图划分。

谱图理论

Note: n就是networks中的nodes数目。

这里看出yi是节点i所有邻居的权重和。

谱图理论Spectral graph theory

谱图理论的划分示例

示例一:d-regular graph

证明一个全1向量是否是矩阵A的特征向量

这样就证明并得到一个特征对

示例二:Graph on 2 components

d-regular graph不是连通的情况, 2-regular graph

直觉上,图G勉强连接和图分离的特征向量不会改变太多,基本一样。if our graph is disconnected, we already know what the eigenvectors will be.If the graph will be barely connected,the eigenvectors, we hope,won't change too much.

图的拉普拉斯矩阵的表示

邻接矩阵的定义Adjacency Matrix A

Note:

1. 向量正交就是任意两个向量点积为0。

2. 矩阵A所有元素相加和为图中所有边数*2。

度矩阵的定义Degree Matrix D

图的拉普拉斯矩阵的定义Laplacian Matrix L

拉普拉斯矩阵的一个性质是行(列)和为0,这样就可以找到一个平凡特征对。

使用拉普拉斯矩阵进行图的划分

{通过拉普拉斯矩阵的特征值和特征向量寻找能将图划分成两个的最优划分:这里要解决的是怎样将图的划分问题转化为下面定义的lambda2的最小化问题。

注意这里的x是点的标志labeling(是一个称作Fiedler vector的向量),也就是拉普拉斯矩阵L的次小特征值对应的特征向量。这个次小特征值和特征向量有下面讲到的神奇性质,但是下式右边最小值为什么是L的次小特征值以及x为什么是lambda2对应的特征向量就不作过多解释。}

L矩阵的次小特征值second smallest eigenvalue

注意,对拉普拉斯矩阵进行特征分解就可以得到其特征值和对应的特征向量。

Note:

1. xTLx是一个二次型,其列出了所有x1, x2...xn的可能二次项。double summation

2. 等式推导中第3个等号的解释:因为D是一个对角矩阵故第一项是对角元素相关的式子。

而第二项实际是xTAx,所有xixj的二次项的和,即是所有可能边xixj的和的两倍,其实也就是矩阵A所有元素之和。

3. 等式推导中第4个等号解释:所有点的出度和等于所有边对应的点数和的和,也就是有多少个出度xi^2就会加和多少次,等价于所有条边(i, j)对应的两个点xi^2+xj^2的和的和。for every node we have to take its squared value entry,and then sum it up together D times.What this basically means is that we can take the squared value, and sum
it up once for every edge.

次小特征值对应的特征向量x的性质

构造次小特征值表达式

如果我们对每个节点设置一个标志labeling,使这些标志和为0,并且这些标志的平方和为1。这样lambda2的最小化就变成了有边节点标志的差的平方和(分子)的最小化问题了,图示如右图。

分子最小化时,就是说有边连接的两个节点就放在0的同一侧(同时为正或者同时为负,否则lambda不可能最小),即让通过原点0的边尽可能少,同时让同一侧的边尽可能多。其目的就是将两个clusters的划分转化为求次小特征值及其对应的特征向量问题。

回到寻找最优划分问题

Fieldler'1973

首先如果我们只是将每个节点赋予标志+1或者-1,通过最小化f(y),并不能解决问题。

瑞利定理Rayleigh Theorem

这里对节点标志重新赋值成实数值,并使其节点和为0,平方和为1,minf(y)也就成了上面提到的次小特征值了。

故f(y)的最小值对应于找到一个Fiedler vector向量(就是拉普拉斯矩阵L的次小特征值lambda2对应的特征向量)对节点的标志进行赋值,就能通过最小化∑(yi - yj)^2来得到f(y)的最小值。

这样Fiedler vector(拉普拉斯矩阵L的次小特征值lambda2对应的特征向量)也就告诉我们哪些点被放到同一个cluster中,哪些放到另一个cluster中。

谱聚类算法Spectral Clustering三大步骤

第一步:通过图G计算矩阵A,D => L.

第二步:求次小特征值lambda2和其对应的特征向量x,然后根据x对所有节点赋标志值。In particular, we are interested in the second smallest eigenvalue lambda 2 and the corresponding eigenvector x.

第三步:最后通过x得到一个划分(如通过0进行划分),得到的分类也就是clusters。once we have the vector x,all we have to do is to do the grouping where we basically look at the components of x.And determine which nodes belong to the set A, and which nodes belong to the set B.这里的cluster A B也就是划分后0的左右侧节点集合。

谱划分算法步骤示例

Note: 这里对lambda排序时,特征向量也跟着排序了,但是每个节点对应的特征向量中的值是没有改变的,也不用排序。

谱划分示例

拉普拉斯矩阵L的次小特征值lambda2对应的特征向量x2,求解2个clusters问题图解

拉普拉斯矩阵L的次小特征值lambda2对应的特征向量x2,求解4个clusters问题图解

求解多个clusters问题的图解

这里x1是拉普拉斯矩阵L的最小特征值lanbda1对应的特征向量(可以看到都是相等的,根本无法区分),x3拉普拉斯矩阵L的第三小特征值lanbda3对应的特征向量

k路谱聚类(将图G划分为k个clusters)

第二种方法就是将计算拉普拉斯矩阵L的2-k+1小的特征值和其对应的特征向量,并通过这多个特征向量将图中每个节点reduce到一个坐标向量中(而不是一个点),之后再通过k-means等聚类算法对这些reduced后的节点进行聚类,就得到k个类了。

皮皮blog

聚类检测方法3:Trawling

{这种方法可以检测多种不同类型的clusters, detects very different types of clusters}

Trawling

Note: 这种想法来源于hubs and authorities。红点是hubs,蓝点是authorities。提前说明一下,这里的红点其实就是图G中所有的节点,蓝点是节点指向的其它节点且这些节点是一种频繁项集。

我们的目标就是要找到这种dense 2-layer graph,其代表的含义就是同类的人讨论同样的话题。

更形式化要解决问题的定义

完全二分图:左图每个点都有边指向右图所有点。

目标改为枚举所有完全二分子图。每个不同的完全二分子图应该也说要找的不同的clusters吧?

频繁项集和二分图

{解决上面的枚举所有完全二分子图问题}

频繁项集挖掘描述

[Agrawal-Srikant ‘99]

[海量数据挖掘MMDS week2: Association Rules关联规则与频繁项集挖掘]

频繁项集和二分图之间的联系

[Kumar et al. ‘99]

红点就是图G中所有的节点,蓝点是节点指向的其它节点且这些节点的出现是一种频繁项集。

1)将图G中每个点看成是一个basket,它指向的节点就是basket中的items,然后设置最小支持度和项集大小。

2)如果发现了一个频繁项集就意味着:

3)这也就代表我们发现了一个完全二分子图

算法示例

这里找到的两个完全二子分图就是我们找到的两个clusters?

皮皮blog

Reviews复习

通过谱图划分算法计算得到

拉普拉斯矩阵L =

[[ 2. -1. -1.  0.  0.  0.]

 [-1.  3.  0. -1.  0. -1.]

 [-1.  0.  2. -1.  0.  0.]

 [ 0. -1. -1.  3. -1.  0.]

 [ 0.  0.  0. -1.  2. -1.]

 [ 0. -1.  0.  0. -1.  2.]]

次小特征值对应特征向量

x2 = [-0.5 -0.  -0.5  0.   0.5  0.5]

划分

[2 4 5 6]

[1 2 3 4]

可知,点2,4都是ties,由随机概率可能是两个clusters中的任意一个。但是56或者13只能是同一clusters中。

Code:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
__title__ = '谱图划分'
__author__ = '皮'
__mtime__ = '10/16/2015-016'
__email__ = 'pipisorry@126.com'

"""
import math
import numpy as np
from scipy import linalg
import matplotlib.pyplot as plt
from Utility.Contant import eps
from Utility.PrintOptions import printoptions

G , , , , , ], , ), (, ), (, ), (, ), (, ), (, ), (, )]}

# G = {'V': [0, 1, 2, 3, 4, 5], 'E': [(0, 1), (0, 2), (0, 4), (2, 3), (1, 2), (3, 4), (3, 5), (4, 5)]}

def BuildLaplacian(G):
    '''
    通过图G构造拉普拉斯矩阵L
    '''
    V = G['V']
    E = G['E']
    A = np.zeros([len(V), len(V)])
    for s_nodeid, e_nodeid in E:

))
    L = D - A
    return L

def EigenCalculate(L):
    '''
    拉普拉斯矩阵L的特征值和特征向量计算
    '''
    eigen_value, eigen_vec = linalg.eig(L)  # eigen_vec的列i对应于第i个特征值
    eigen_vec = eigen_vec.T  # 转换为eigen_vec的行i对应于第i个特征值

    sort_index = np.argsort(eigen_value)
    return eigen_value[sort_index], eigen_vec[sort_index]

def PlotEigenvalue(Y, spliting_point=0, vertice_strat_index=1):
    '''
    绘制特征向量的值分布
    '''
    x_min, x_max = vertice_strat_index, len(Y) + vertice_strat_index - 1
    y_min, y_max = min(Y), max(Y)
    margin , 0.1]
    X = range(vertice_strat_index, len(Y) + vertice_strat_index)
    plt.plot(X, Y, 'r-o', label='')
    plt.axhline(spliting_point)

    # 设置图形展示效果
    def setAx(x_min, x_max, y_min, y_max, margin):
], ])
        plt.ylim(], ])
        plt.xlabel('Rank in x2')
        plt.ylabel('Values of x2')
        plt.legend(loc='lower right')
        plt.title('Components of x2')

    setAx(x_min, x_max, y_min, y_max, margin)

    plt.show(block=True)

if __name__ == '__main__':
    V = np.array(G['V']) + 1
    L = BuildLaplacian(G)
    print('L = \n%s' % L)
    eigen_value, eigen_vec = EigenCalculate(L)

    x2 ]
    , suppress=True):
        print('x2 = %s' % x2)
    print(V[(x2 + eps) >= np.mean(x2)])
    print(V[(x2 - eps) <= np.mean(x2)])
    PlotEigenvalue(x2)

from:http://blog.csdn.net/pipisorry/article/details/49052255

ref:社区发现算法FastUnfolding的GraphX实现

海量数据挖掘MMDS week3:社交网络之社区检测:高级技巧的更多相关文章

  1. 海量数据挖掘MMDS week3:社交网络之社区检测:基本技巧

    http://blog.csdn.net/pipisorry/article/details/49052057 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...

  2. 海量数据挖掘MMDS week3:流算法Stream Algorithms

    http://blog.csdn.net/pipisorry/article/details/49183379 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...

  3. 海量数据挖掘MMDS week2: 局部敏感哈希Locality-Sensitive Hashing, LSH

    http://blog.csdn.net/pipisorry/article/details/48858661 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...

  4. 海量数据挖掘MMDS week7: 局部敏感哈希LSH(进阶)

    http://blog.csdn.net/pipisorry/article/details/49686913 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...

  5. 海量数据挖掘MMDS week1: Link Analysis - PageRank

    http://blog.csdn.net/pipisorry/article/details/48579435 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...

  6. 海量数据挖掘MMDS week2: Association Rules关联规则与频繁项集挖掘

    http://blog.csdn.net/pipisorry/article/details/48894977 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...

  7. 海量数据挖掘MMDS week7: 相似项的发现:面向高相似度的方法

    http://blog.csdn.net/pipisorry/article/details/49742907 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...

  8. 海量数据挖掘MMDS week6: MapReduce算法(进阶)

    http://blog.csdn.net/pipisorry/article/details/49445519 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...

  9. 海量数据挖掘MMDS week6: 决策树Decision Trees

    http://blog.csdn.net/pipisorry/article/details/49445465 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...

随机推荐

  1. phpstorm查看类的继承关系

    在看一些框架源码时,有些类有很多的继承或者接口,有一款神奇的帮助很重要 选中一个类文件,右键,选择diagrams->show diagrams 即可得到类的继承关系,如上右图 使用函数 fun ...

  2. leetcode刷题笔记08 字符串转整数 (atoi)

    题目描述 实现 atoi,将字符串转为整数. 在找到第一个非空字符之前,需要移除掉字符串中的空格字符.如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即 ...

  3. JavaScript Window Navigator

    window.navigator 对象包含有关访问者浏览器的信息. Window Navigator window.navigator 对象在编写时可不使用 window 这个前缀. 实例 <d ...

  4. JavaScript Boolean(布尔)对象

    Boolean(布尔)对象用于将非布尔值转换为布尔值(true 或者 false). Boolean(布尔)对象是三种包装对象:Number.String和Boolean中最简单的一种,它没有大量的实 ...

  5. formData的实现

    参考:https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest <!doctype ...

  6. 一小时入门PHP

    [版权申明:本文系作者原创,转载请注明出处] 文章出处:[http://blog.csdn.net/sdksdk0/article/details/52332296](http://blog.csdn ...

  7. ListView下拉刷新上拉加载更多实现

    这篇文章将带大家了解listview下拉刷新和上拉加载更多的实现过程,先看效果(注:图片中listview中的阴影可以加上属性android:fadingEdge="none"去掉 ...

  8. Hive-ORC文件存储格式(续)

    本文在Hive-ORC文件存储格式的理论基础上,进一步分析一个实际的Hive ORC表中的数据存储形式. 一.表结构 库名+表名:fileformat.test_orc 字段 类型 category_ ...

  9. 如何正确使用const、static、extern

    转自:http://www.jianshu.com/p/2fd58ed2cf55 前言 本篇文章主要介绍在开发中怎么使用const.static.extern关键字. 一.const 与宏的区别: c ...

  10. Android Stutio中使用java8的Lambda表达式

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51532028 本文出自:[openXu的博客] 目录: 为什么要使用Lambda表达式 让A ...