算法设计与智能计算 || 专题九: 基于拉普拉斯算子的谱聚类算法

news/2024/5/20 6:59:02 标签: 聚类, 算法, 机器学习

聚类

文章目录

1. 信息增益的度量

由于数据集 X = [ x 1 , x 2 , ⋯   , x n ] X=[\boldsymbol{x}_1, \boldsymbol{x}_2, \cdots, \boldsymbol{x}_n] X=[x1,x2,,xn] 的图结构不像图像的像素有像素值, 数据样本没有规整的结构, 也没有特定的函数 f f f, 因此, 我们需要为每个样本赋予一个函数值 { f i } i = 1 n \{f_i\}_{i=1}^n {fi}i=1n, 或表示成函数向量 f \boldsymbol{f} f. 为获得整个数据集的凸凹性(或差异性)

在这里插入图片描述

这种差异性可以通过拉普拉斯变换表示为
h = L f = ( D − W ) f = D f − W f \boldsymbol{h} = L\boldsymbol{f}=(D-W)\boldsymbol{f}=D\boldsymbol{f}-W\boldsymbol{f} h=Lf=(DW)f=DfWf
h \boldsymbol{h} h 的第 i i i 个 分量 h i h_i hi 可表示为
h i = d i f i − w i , : f = ∑ j ∈ N i w i j f i − ∑ j ∈ N i w i j f j = ∑ j ∈ N i w i j ( f i − f j ) h_i = d_if_i-w_{i,:}\boldsymbol{f}=\sum_{j\in N_i}w_{ij}f_i-\sum_{j\in N_i}w_{ij}f_j=\sum_{j\in N_i}w_{ij}(f_i-f_j) hi=difiwi,:f=jNiwijfijNiwijfj=jNiwij(fifj)
即, h i h_i hi 是第 i i i 个顶点 v i v_i vi 与其近邻点的差的和. 若构造一个量来表示所有顶点与其近邻点的差异的总和, 则可以由以下几种方式:

  • 第一种(计算困难): ∑ i = 1 n h i 2 = ∑ i = 1 n ( ∑ j ∈ N i w i j ( f i − f j ) ) 2 \sum_{i=1}^n h_i^2 =\sum_{i=1}^n\Big(\sum_{j\in N_i}w_{ij}(f_i-f_j)\Big)^2 i=1nhi2=i=1n(jNiwij(fifj))2
  • 第二种(正负值会抵消): ∑ i = 1 n h i = ∑ i = 1 n ∑ j ∈ N i w i j ( f i − f j ) \sum_{i=1}^n h_i =\sum_{i=1}^n\sum_{j\in N_i}w_{ij}(f_i-f_j) i=1nhi=i=1njNiwij(fifj)
  • 第三种(非负求和): ∑ i = 1 n f i ⋅ h i = ∑ i = 1 n f i ∑ j ∈ N i w i j ( f i − f j ) \sum_{i=1}^n f_i\cdot h_i =\sum_{i=1}^nf_i\sum_{j\in N_i}w_{ij}(f_i-f_j) i=1nfihi=i=1nfijNiwij(fifj)

综合上述三种情况, 第三种度量总的差异是最适合的.

∑ i = 1 n f i ⋅ h i = ∑ i = 1 n f i ∑ j ∈ N i w i j ( f i − f j )    = ∑ i = 1 n ∑ j ∈ N i w i j f i ( f i − f j )    = 1 2 ∑ i = 1 n ∑ j ∈ N i w i j ( 2 f i f i − 2 f i f j )    = 1 2 ∑ i = 1 n ∑ j ∈ N i w i j ( f i f i − 2 f i f j + f j f j )    = 1 2 ∑ i = 1 n ∑ j ∈ N i w i j ( f i − f j ) 2 \begin{array}{ll} \sum_{i=1}^n f_i\cdot h_i &=\sum_{i=1}^nf_i\sum_{j\in N_i}w_{ij}(f_i-f_j)\\\;\\ &=\sum_{i=1}^n\sum_{j\in N_i}w_{ij}f_i(f_i-f_j)\\\;\\ &=\frac{1}{2}\sum_{i=1}^n\sum_{j\in N_i}w_{ij}(2f_if_i-2f_if_j)\\\;\\ &=\frac{1}{2}\sum_{i=1}^n\sum_{j\in N_i}w_{ij}(f_if_i-2f_if_j+f_jf_j)\\\;\\ &=\frac{1}{2}\sum_{i=1}^n\sum_{j\in N_i}w_{ij}(f_i-f_j)^2 \end{array} i=1nfihi=i=1nfijNiwij(fifj)=i=1njNiwijfi(fifj)=21i=1njNiwij(2fifi2fifj)=21i=1njNiwij(fifi2fifj+fjfj)=21i=1njNiwij(fifj)2

因此, 数据集信息的总增益的度量可表示为

∑ i = 1 n f i ⋅ h i = 1 2 Σ i = 1 n Σ j ∈ N i w i j ( f i − f j ) 2    = 1 2 Σ i = 1 n Σ j ∈ N i w i j ( f i 2 + f j 2 − 2 f i f j )    = Σ i = 1 n Σ j ∈ N i w i j f i 2 − Σ i = 1 n Σ j ∈ N i w i j f i f j    = Σ i = 1 n ( w i 1 f 1 2 + w i 2 f 2 2 + ⋯ + w i n f n 2 ) − f ⊤ W f    = ( f 1 , f 2 , ⋯   , f n ) ( d 1 d 2 ⋱ d n ) ( f 1 f 2 ⋮ f n ) − ( f 1 , f 2 , ⋯   , f n ) ( w 11 w 12 ⋯ w 1 n w 21 w 22 ⋯ w 2 n ⋯ ⋯ ⋯ ⋯ w n 1 w n 2 ⋯ w n n ) ( f 1 f 2 ⋮ f n )    = f ⊤ D f − f ⊤ W f    = f ⊤ ( D − W ) f    = f ⊤ L f \begin{array}{l} \sum_{i=1}^n f_i\cdot h_i=\frac{1}{2}\Sigma_{i=1}^n\Sigma_{j\in N_i}w_{ij}(f_i-f_j)^2\\\;\\ =\frac{1}{2}\Sigma_{i=1}^n\Sigma_{j\in N_i}w_{ij}(f_i^2+f_j^2-2f_if_j)\\\;\\ =\Sigma_{i=1}^n\Sigma_{j\in N_i}w_{ij}f_i^2-\Sigma_{i=1}^n\Sigma_{j\in N_i}w_{ij}f_if_j\\\;\\ =\Sigma_{i=1}^n(w_{i1}f_1^2+w_{i2}f_2^2+\cdots+w_{in}f_n^2)-\boldsymbol f^{\top}W\boldsymbol f\\\;\\ =(f_1,f_2,\cdots,f_n)\begin{pmatrix} d_1 & & & \\ & d_2 & & \\ & & \ddots & \\ & & &d_n \end{pmatrix}\begin{pmatrix} f_1\\ f_2\\ \vdots \\ f_n \end{pmatrix}- (f_1,f_2,\cdots,f_n)\begin{pmatrix} w_{11} & w_{12} & \cdots & w_{1n} \\ w_{21} & w_{22}& \cdots & w_{2n}\\ \cdots &\cdots & \cdots & \cdots \\ w_{n1} & w_{n2} & \cdots &w_{nn} \end{pmatrix}\begin{pmatrix} f_1\\ f_2\\ \vdots \\ f_n \end{pmatrix}\\\;\\ =\boldsymbol{f}^{\top}D\boldsymbol{f}-\boldsymbol{f}^{\top}W\boldsymbol{f}\\\;\\ =\boldsymbol{f}^{\top}(D-W)\boldsymbol{f}\\\;\\ =\boldsymbol{f}^{\top}L\boldsymbol{f} \end{array} i=1nfihi=21Σi=1nΣjNiwij(fifj)2=21Σi=1nΣjNiwij(fi2+fj22fifj)=Σi=1nΣjNiwijfi2Σi=1nΣjNiwijfifj=Σi=1n(wi1f12+wi2f22++winfn2)fWf=(f1,f2,,fn) d1d2dn f1f2fn (f1,f2,,fn) w11w21wn1w12w22wn2w1nw2nwnn f1f2fn =fDffWf=f(DW)f=fLf

综上可知, 对于离散样本点的函数 f = ( f 1 , f 2 , ⋯   , f n ) ⊤ \boldsymbol{f}=(f_1,f_2,\cdots,f_n)^\top f=(f1,f2,,fn), w i j w_{ij} wij 为两个样本点之间的权重, 则数据集上的信息总增益为

f ⊤ L f = 1 2 Σ i = 1 n Σ j ∈ N i w i j ( f i − f j ) 2 \boldsymbol{f}^{\top}L\boldsymbol{f}=\frac{1}{2}\Sigma_{i=1}^n\Sigma_{j\in N_i}w_{ij}(f_i-f_j)^2 fLf=21Σi=1nΣjNiwij(fifj)2

2. 谱聚类: 寻找最优的函数向量 f \boldsymbol{f} f

2.1 : 寻找一个最优的函数向量 f \boldsymbol{f} f

为数据集的每个样本点寻找一个合适的函数 f i f_i fi, 完成函数的求值 { f i ( x i ) } i = 1 n \Big\{f_i(\boldsymbol{x}_i)\Big\}_{i=1}^n {fi(xi)}i=1n. 为使得样本点之间可以在同一尺度下进行大小的比较, 我们将函数值限定在0,1之间, 则可转化为约束 优化问题
min ⁡ f f ⊤ L f s . t f ⊤ f = 1 \min_{\boldsymbol{f}}\boldsymbol{f}^{\top}L\boldsymbol{f}\\ s.t \quad \boldsymbol{f}^{\top}\boldsymbol{f}=1 fminfLfs.tff=1

利用拉格朗日乘子法将等式约束优化问题转化成无约束优化问题
min ⁡ f Q ( f ) = f ⊤ L f − λ f ⊤ f \min_{\boldsymbol{f}}Q(\boldsymbol{f})=\boldsymbol{f}^{\top}L\boldsymbol{f}-\lambda\boldsymbol{f}^{\top}\boldsymbol{f} fminQ(f)=fLfλff
求极值
∂ Q ( f ) ∂ f = 2 L f − 2 λ f = 2 ( L f − λ f ) = 0 \frac{\partial Q(\boldsymbol{f})}{\partial \boldsymbol{f}} =2L\boldsymbol{f}-2\lambda\boldsymbol{f}=2(L\boldsymbol{f}-\lambda\boldsymbol{f})=0 fQ(f)=2Lf2λf=2(Lfλf)=0


L f = λ f ( 转化为求拉普拉斯特征向量问题 ) L\boldsymbol{f}=\lambda\boldsymbol{f}(转化为求拉普拉斯特征向量问题) Lf=λf(转化为求拉普拉斯特征向量问题)

这是拉普拉斯矩阵 L L L 的特征方程. 由于拉普拉斯矩阵的行和为 0 0 0, 上式有一个平凡解 λ = 0 \lambda=0 λ=0, 其对应的特征向量为 1 \boldsymbol{1} 1. 此解显然与数据集无关, 不是优化问题的最优解. 又因为拉普拉斯矩阵是半正定矩阵, 特征值非负, 因此, f \boldsymbol{f} f 是拉普拉斯矩阵第二小的特征值对应的特征向量.

将上式两边左乘 f ⊤ \boldsymbol{f}^{\top} f
m i n f ⊤ L f ⇔ m i n λ f ⊤ f = m i n λ = λ m i n min\boldsymbol{f}^{\top}L\boldsymbol{f}\Leftrightarrow min\lambda\boldsymbol{f}^{\top}\boldsymbol{f}=min\lambda=\lambda_{min} minfLfminλff=minλ=λmin

min ⁡ f f ⊤ L f f ⊤ f = λ m i n \min_{\boldsymbol{f}}\frac{\boldsymbol{f}^{\top}L\boldsymbol{f}}{\boldsymbol{f}^{\top}\boldsymbol{f}}=\lambda_{min} fminfffLf=λmin
称为瑞利熵

2.2 寻找鲁棒性更强的多个函数向量

为获得更加鲁棒的结果, 可以寻找多个向量函数, 然后进行信息的融合. 则数据集上的信息总增益表示为

min ⁡ f 1 , ⋯   , f k Σ i = 1 k f i ⊤ L f i \min_{\boldsymbol{f_1,\cdots,f_k}}\Sigma_{i=1}^k\boldsymbol{f_i}^{\top}L\boldsymbol{f_i} f1,,fkminΣi=1kfiLfi

Σ i = 1 k f i ⊤ L f i = min ⁡ f 1 , ⋯   , f k ( f 1 ⊤ ⋮ f k ⊤ ) ( L 11 L 12 ⋯ L 1 n L 21 L 22 ⋯ L 2 n ⋯ ⋯ ⋯ ⋯ L n 1 L n 2 ⋯ L n n ) ( f 1 ⋮ f k ) = min ⁡ F t r ( F ⊤ L F ) \Sigma_{i=1}^k\boldsymbol{f_i}^{\top}L\boldsymbol{f_i}=\min_{\boldsymbol{f_1,\cdots,f_k}} \begin{pmatrix} \boldsymbol{f}_1^{\top}\\ \vdots \\ \boldsymbol{f}_k^{\top} \end{pmatrix} \begin{pmatrix} L_{11} & L_{12} & \cdots & L_{1n} \\ L_{21} & L_{22}& \cdots & L_{2n}\\ \cdots &\cdots & \cdots & \cdots \\ L_{n1} & L_{n2} & \cdots &L_{nn} \end{pmatrix} \begin{pmatrix} \boldsymbol{f}_1\\ \vdots \\ \boldsymbol{f}_k \end{pmatrix}\\ =\min_{\boldsymbol{F}}tr(\boldsymbol{F}^{\top}L\boldsymbol{F}) Σi=1kfiLfi=f1,,fkmin f1fk L11L21Ln1L12L22Ln2L1nL2nLnn f1fk =Fmintr(FLF)

结论:此问题等价于求多个较小的特征向量。

2.3 谱聚类(spectral clustering)算法

通过构造连接矩阵的方式获取拉普拉斯矩阵, 然后进行最优化求解

  • 图拉普拉斯版本, 此版本效率有点儿低
class spectralClust_graph:
    
    def __init__(self, nClust=2, gamma=13.5, tau=0.1):
        
        self.nClust = nClust # 初始化类数
        self.gamma = gamma # 径向基核函数参数
        self.tau = tau # 近邻半径参数
    
    # 计算距离矩阵    
    def pairwise_distances(self, X):
        n = X.shape[1]
        G = X.T@X
        H = np.diag(G).reshape(-1,1)@np.ones((1,n))
        dist = H+H.T-2*G
        Dist = np.sqrt(dist)
        print(Dist.shape)
        return Dist
        return Dist
    
    # 计算权重矩阵
    def create_graph_weights(self, X, gamma, tau):
        
        # YOUR CODE HERE
        distance_matrix = self.pairwise_distances(X.T)
        n = distance_matrix.shape[0]
        graph_weights = []
        weights = np.exp(-gamma*distance_matrix)
        weights = weights*(weights>=tau)
        for i in range(n):
            for j in range(n):
                if i != j:
                    graph_weights.append(weights[i,j])
        graph_weights = np.array(graph_weights)
        return graph_weights
    
    # 计算连接矩阵
    def construct_incidence_matrix(self, X):
        
        weights = self.create_graph_weights(X, self.gamma, self.tau)
        
        no_of_samples = X.shape[0]
        # 为数据集连接边分配索引
        edges = []
        for i in range(no_of_samples):
            for j in range(no_of_samples):
                if i == j:
                    continue
                else:
                    edges.append([i,j])
        
        no_of_edges = len(edges)
        incidence_matrix = np.zeros(shape=(no_of_edges,no_of_samples))
        for index in range(no_of_edges):
            indices = edges[index]
            incidence_matrix[index, indices[0]] = -np.sqrt(weights[index])
            incidence_matrix[index, indices[1]] = np.sqrt(weights[index])
        id0 = (incidence_matrix==0).all(1)
        incidence_matrix = np.delete(incidence_matrix,id0,axis=0)
        return incidence_matrix
        
    
    def fit(self, X):
        incidence_matrix = self.construct_incidence_matrix(X)
        graph_laplacian = incidence_matrix.T@incidence_matrix
        eigenvalues, eigenvectors = linalg.eigs(graph_laplacian,k=self.nClust,which='SM')
        Labels = k_means(eigenvectors.real,self.nClust)
        
        return Labels[1]

import numpy as np
from scipy.sparse import linalg
from matplotlib.colors import ListedColormap
from sklearn.datasets import make_moons
from sklearn.cluster import k_means
import matplotlib.pyplot as plt

if __name__ == "__main__":
    # 构造数据集
    seed = 13
    np.random.seed(seed)
    no_of_samples = 1000
    X, y = make_moons(n_samples=no_of_samples, noise=0.1, random_state=seed)
    
    scg = spectralClust_graph()
    unsupervised_labels = scg.fit(X)
    
    # 画图
    colormap_bright = ListedColormap(['#FF0000', '#0000FF']) # 设置颜色
    plt.figure(figsize=(12,6))
    plt.subplot(121)
    plt.scatter(X[:, 0], X[:, 1])
    plt.xticks(fontsize=16)
    plt.yticks(fontsize=16)
    
    plt.subplot(122)
    plt.scatter(X[:, 0], X[:, 1], c=unsupervised_labels, cmap=colormap_bright, edgecolors='k')
    plt.xticks(fontsize=16)
    plt.yticks(fontsize=16)
    
    plt.show()    

在这里插入图片描述

  • 通用的普聚类版本
    也可以通过度矩阵构造拉普拉斯矩阵 L = D − W L=D-W L=DW, 然后进行优化.
class spectralCLUST:
    
    def __init__(self, nClust=2, gamma=13.5, tau=0.1, affinity=None):
        
        self.nClust = nClust # 初始化类数
        self.gamma = gamma # 径向基核函数参数
        self.tau = tau # 近邻半径参数
        self.affinity = affinity
    
    # 计算距离矩阵, 矩阵的每一列为一个样本点    
    def pairwise_distances(self, X):
        n = X.shape[1]
        G = X.T@X
        H = np.diag(G).reshape(-1,1)@np.ones((1,n))
        dist = H+H.T-2*G
        Dist = np.sqrt(dist)
        print(Dist.shape)
        return Dist
    
    # 计算拉普拉斯矩阵,矩阵的每一列为一个样本点 
    def create_Weights(self, X, gamma, tau):
        
        #
        distance_matrix = self.pairwise_distances(X)
        n = distance_matrix.shape[0]
        weights = np.exp(-gamma*distance_matrix)
        Weights = weights*(weights>=tau)
        return Weights
    
    def clustering(self,CKSym):
        N = CKSym.shape[1]
        n = self.nClust
        DN = np.diag(np.divide(1, np.sqrt(np.sum(CKSym, axis=0) + np.finfo(float).eps)))
        LapN = identity(N).toarray().astype(float) - np.matmul(np.matmul(DN, CKSym), DN)
        _, _, vN = np.linalg.svd(LapN)
        vN = vN.T
        kerN = vN[:, N - n:N]
        normN = np.sqrt(np.sum(np.square(kerN), axis=1))
        kerNS = np.divide(kerN, normN.reshape(len(normN), 1) + np.finfo(float).eps)
        km = KMeans(n_clusters=n).fit(kerNS)
        return km.labels_
        
    # 拟合函数,矩阵 X 的每一列为数据点
    def fit(self, X): 
        if self.affinity == None:
            gamma = self.gamma
            tau = self.tau
            W = self.create_Weights(X, gamma, tau)
            Labels = self.clustering(W)
        if self.affinity == 'precomputed':
            Labels = self.clustering(X)
        
        return Labels

import numpy as np
from scipy.sparse import linalg
from matplotlib.colors import ListedColormap
from sklearn.datasets import make_moons
from sklearn.cluster import KMeans
from scipy.sparse import identity
import matplotlib.pyplot as plt
    
if __name__ == "__main__":
    # 构造数据集
    seed = 13
    np.random.seed(seed)
    no_of_samples = 1000
    X, y = make_moons(n_samples=no_of_samples, noise=0.1, random_state=seed)
    
    clt = spectralCLUST()
    unsupervised_labels = clt.fit(X.T)    
    # 画图
    colormap_bright = ListedColormap(['#FF0000', '#0000FF']) # 设置颜色
    plt.figure(figsize=(12,6))
    plt.subplot(121)
    plt.scatter(X[:, 0], X[:, 1])
    plt.xticks(fontsize=16)
    plt.yticks(fontsize=16)
    
    plt.subplot(122)
    plt.scatter(X[:, 0], X[:, 1], c=unsupervised_labels, cmap=colormap_bright, edgecolors='k')
    plt.xticks(fontsize=16)
    plt.yticks(fontsize=16)
    
    plt.show()

在这里插入图片描述

小结

第二种编程的方法可以实现通用的功能, 既可以处理样本数据集, 同时也可以处理权重矩阵, 以备后续章节使用


http://www.niftyadmin.cn/n/346095.html

相关文章

【面试题】Redis过期删除与内存淘汰

文章目录 Redis过期删除策略🙎‍♂️面试官:如何设置key的过期时间?🙎‍♂️面试官:什么是Redis过期删除策略?🙎‍♂️面试官:过期的key存放到哪里/如何判断key是否过期?…

The Issues Installing vue.js and Node.js

What is the function or meaning for -m in the command of “python -m django --versin”? The -m flag in the command python -m django --version is used to run a module as a script. It requires the user to add a module name as an argument right after it. Af…

MySQL高级篇第一天

目录 一、索引 二、索引结构 三、索引分类 四、索引语法 五、索引设计原则 六、视图 七、存储过程与概述 八、触发器 九、总结 一、索引 (一)索引概述 索引是一种能够帮组Mysql高效的从磁盘上查询数据的一种数据结构,这些数据结构以某…

【5.21】六、自动化测试—常见技术

目录 6.2 自动化测试常见技术 1. 录制与回放测试 2. 脚本测试 3. 数据驱动测试 6.2 自动化测试常见技术 自动化测试技术有很多种,这里介绍3种常见的技术: 1. 录制与回放测试 录制是指使用自动化测试工具对桌面应用程序或者是Web页面的某一项功能进…

Unity 之 Addressable可寻址系统 -- 将Resources加载资源方式修改为Addressable加载 -- 实战(一)

Unity 之 Resources加载资源方式修改为Addressable加载 一,两种资源加载方式对比二,将Resource项目转为Addressables2.1 实现逻辑2.2 操作步骤 三,使用Addressables的注意事项四,使用中遇到问题 一,两种资源加载方式对…

2023/5/21总结

因为之前高中学过一点点的html。虽然不是很多&#xff0c;但是有一点点基础&#xff0c;看了一些关于html的知识点&#xff0c;算是复习了&#xff0c;如果后面忘记打算再去查。 html是超文本标记语言&#xff0c;通常由<></>构成&#xff0c;当然也有单标记&…

halcon模板匹配之shape/ncc模板匹配参数解释说明

注&#xff1a;转载请保留原文地址https://blog.csdn.net/baidu_36363174/article/details/105846684 参数&#xff1a; NumLevels 金字塔层数越大&#xff0c;计算次数越快。【但采样过程中&#xff0c;图像信息减少&#xff0c;匹配的精确性会降低&#xff0c;特别是层数特别…

CMD与DOS脚本编程【第九章】

预计更新 第一章. 简介和基础命令 1.1 介绍cmd/dos脚本语言的概念和基本语法 1.2 讲解常用的基础命令和参数&#xff0c;如echo、dir、cd等 第二章. 变量和运算符 2.1 讲解变量和常量的定义和使用方法 2.2 介绍不同类型的运算符和运算规则 第三章. 控制流程和条件语句 3.1 介…