Python微信订餐小程序课程视频
https://edu.csdn.net/course/detail/36074
Python实战量化交易理财系统
https://edu.csdn.net/course/detail/35475
引入
聚类算法一般可以分为两类:
- Compactness。代表的算法有 K-means,GMM 等。但这类算法只能处理凸集,为了处理非凸的样本集,必须引⼊核技巧。
- Connectivity。这类以 spectral clustering 为代表。
举个例子,将下述数据采用聚类算法进行聚类,可以采用 GMM 或 K-Means 的方法:
然而对于下述数据却并不能使用上述两种算法:
此时可以考虑采用谱聚类(spectral clustering)的方法。
谱聚类算法(Spectral Clustering)
主要思想是把所有的数据看做空间中的点,这些点之间可以用边连接起来。距离较远的两个点之间的边权重值较低,而距离较近的两个点之间的边权重值较高,通过对所有数据点组成的图进行切图,让切图后不同的子图间边权重和尽可能的低,而子图内的边权重和尽可能的高,从而达到聚类的目的。
1 基础知识
1.1 无向带权图
对于一个图 GGG ,一般用 VVV 代表点的集合 和用 EEE 来描述边的集合。则 G(V,E)G(V,E)G(V,E) 。其中, V=(v1,v2,…vn)V=(v1,v2,…vn)V=(v_1, v_2,…v_n) 。对于 VVV 中的任意两个点,可以有边连接,也可以没有边连接。定义权重 wijwijw_{ij} 为点 viviv_i 和点 vjvjv_j 之间的权重。对于无向图,有 wij=wjiwij=wjiw_{ij} = w_{ji}。
权重:对于有边相连的两个点 viviv_i 和 vjvjv_j,有 wij>0wij>0w_{ij} > 0 , 对于没有边连接的两个点 viviv_i 和 vjvjv_j ,wij=0wij=0w_{ij} = 0。
度:对于图中的任意一个点 viviv_i ,它的度 didid_i 定义为和它相连的所有边的权重之和,即 :
di=∑j=1nwijdi=∑j=1nwijd_i = \sum\limits_{j=1}^{n}w_{ij}
利用节点的权重值,可以得到图的邻接矩阵 WWW ,是一个 n×nn×nn \times n 的矩阵,第 iii 行的第 jjj 个值对应的权重为 wijwijw_{ij}。
除此之外,对于点集 VVV 的的一个子集 A⊂VA⊂VA \subset V ,我们定义:
-
- |A|:=子集A中点的个数|A|:=子集A中点的个数|A|: = 子集A中点的个数
- vol(A):=∑i∈Adivol(A):=∑i∈Adi vol(A): = \sum\limits_{i \in A}d_i
- |A|:=子集A中点的个数|A|:=子集A中点的个数|A|: = 子集A中点的个数
利用每个节点的度,可以得到一个 n×nn×nn \times n 的度矩阵 DDD,它是一个对角矩阵,只有主对角线有值,对应第 iii 行的第 i个i个i个 点的度数,定义如下:
D=⎛⎝⎜⎜⎜⎜⎜d1…⋮……d2⋮………⋱dn⎞⎠⎟⎟⎟⎟⎟D=(d1………d2…⋮⋮⋱……dn)\mathbf{D} =\left( \begin{array}{ccc}d_1 & \ldots & \ldots \ \ldots & d_2 & \ldots \ \vdots & \vdots & \ddots \ \ldots & \ldots & d_n \end{array} \right)
1.2 相似矩阵
一般情况下,邻接矩阵 WWW,通常可以自己输入权重,但在谱聚类中,我们只有数据点的定义,并没有直接给出这个邻接矩阵,那么怎么得到这个邻接矩阵呢?
基本思想:距离较远的两个点之间的边权重值较低,而距离较近的两个点之间的边权重值较高。一般来说,可以通过样本点距离度量的相似矩阵 SSS 来获得邻接矩阵 WWW。
构建邻接矩阵 WWW 的方法有三类:
-
- ϵϵ\epsilon - 邻近法
- KKK 邻近法
- 全连接法
1.2.1 ϵϵ\epsilon-邻近法
首先,设置一个距离阈值 ϵϵ\epsilon ,然后用欧式距离 sijsijs_{ij} 度量任意两点 xixix_i 和 xjxjx_j 的距离。即相似矩阵的 sij=||xi−xj||22sij=||xi−xj||22s_{ij} = ||x_i-x_j||_2^2 ,然后根据 sijsijs_{ij} 和 ϵϵ\epsilon 的大小关系,来定义邻接矩阵 WWW 如下:
wij={0ϵsij>ϵsij≤ϵwij={0sij>ϵϵsij≤ϵw_{ij}=\begin{cases}0& {s_{ij} > \epsilon}\\epsilon& { {s_{ij} \leq \epsilon}}\end{cases}
从上式可见,两点间的权重要不是 ϵϵ\epsilon,要不就是 000。显然这很难精确区分每个点之间的距离大小。所以很少使用 ϵϵ\epsilon- 邻近法。
1.2.2 KKK 邻近法
基本思想:利用 KNN 算法遍历所有的样本点,取每个样本最近的 kkk 个点作为近邻,只有和样本距离最近的 kkk 个点之间的 wij>0wij>0w_{ij} > 0 。
但是这种方法会造成重构之后的邻接矩阵 WWW 非对称,且后面的算法需要对称邻接矩阵。为解决这种问题,一般采取下面两种方法之一:
**Method1:**第一种 KKK 邻近法是只要一个点在另一个点的 KKK 近邻中,则保留 sijsijs_{ij}:
wij=wji={0exp(−||xi−xj||222σ2)xi∉KNN(xj)andxj∉KNN(xi)xi∈KNN(xj)orxj∈KNN(xi)wij=wji={0xi∉KNN(xj)andxj∉KNN(xi)exp(−||xi−xj||222σ2)xi∈KNN(xj)orxj∈KNN(xi)w_{ij}=w_{ji}=\begin{cases}0& {x_i \notin KNN(x_j) ;and ;x_j \notin KNN(x_i)}\exp(-\frac{||x_i-x_j||_22}{2\sigma2})& {x_i \in KNN(x_j); or; x_j \in KNN(x_i})\end{cases}
**Method2:**第二种 KKK 邻近法是必须两个点