IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 【数据聚类】第八章第二节:谱聚类算法之切图聚类、算法流程及其实现 -> 正文阅读

[人工智能]【数据聚类】第八章第二节:谱聚类算法之切图聚类、算法流程及其实现

本文部分内容源自刘建平博客,在此基础上进行总结拓展

一:谱聚类与图划分

无向图切图:谱聚类算法根据数据点之间的相似度将数据点划分到不同簇中,因此将数据点映射到无向图之后,可以转化为图划分的问题。对于无向图 G G G,切图的目标是将图 G ( V , E ) G(V,E) G(V,E)切分成互相无连接 k k k个子图,其中

  • 每个子图点的集合为 { A 1 , A 2 , . . . , A k } \{A_{1},A_{2},...,A_{k}\} {A1?,A2?,...,Ak?},且满足 A i ∩ A j = ? A_{i}\cap A_{j}=\empty Ai?Aj?=? A 1 ∪ A 2 ∪ . . . ∪ A k = V A_{1}\cup A_{2}\cup ... \cup A_{k}=V A1?A2?...Ak?=V
  • 对于任意两个子图点的集合 A A A B B B我们定义 A A A B B B之间的切图权重为 W ( A , B ) = ∑ i ∈ A , j ∈ B w i j W(A,B)=\sum\limits_{i\in A,j \in B} w_{ij} W(A,B)=iA,jB?wij?
  • 对于 k k k个子图点的集合 { A 1 , A 2 , . . . , A k } \{A_{1},A_{2},...,A_{k}\} {A1?,A2?,...,Ak?}定义切图 c u t ( A 1 , A 2 , . . . , A k ) = 1 2 ∑ i = 1 k W ( A i , A ˉ i ) cut(A_{1},A_{2},...,A_{k})=\frac{1}{2}\sum\limits_{i=1}^{k}W(A_{i},\bar A_{i}) cut(A1?,A2?,...,Ak?)=21?i=1k?W(Ai?,Aˉi?) (其中 A ˉ i \bar A_{i} Aˉi? A i A_{i} Ai?的补集)

可以看出, c u t cut cut描述了子图之间的相似性, c u t cut cut越小那么子图的差异性就越大。但是 c u t ( A 1 , A 2 , . . . , A k ) = 1 2 ∑ i = 1 k W ( A i , A ˉ i ) cut(A_{1},A_{2},...,A_{k})=\frac{1}{2}\sum\limits_{i=1}^{k}W(A_{i},\bar A_{i}) cut(A1?,A2?,...,Ak?)=21?i=1k?W(Ai?,Aˉi?)在划分子图时并没有考虑每个子图中节点的个数。所以在某些情况下,最小化 c u t ( A 1 , A 2 , . . . , A k ) cut(A_{1},A_{2},...,A_{k}) cut(A1?,A2?,...,Ak?)可能会把一个数据点或是很少数据点看做一个子图,导致子图划分结果不平衡

  • 例如下图,选择一个权重最小的边缘的点,比如 C C C H H H之间进行 c u t cut cut,这样可以最小化 c u t ( A 1 , A 2 , . . . , A k ) cut(A_{1},A_{2},...,A_{k}) cut(A1?,A2?,...,Ak?)但是却不是最优的切图

在这里插入图片描述
为了解决这个问题,会引入一些正则化方法。最常用的两种方法为比例割和规范割

  • 比例割 R a t i o c u t ( A 1 , A 2 , . . . , A k ) = 1 2 ∑ i = 1 k W ( A i , A ˉ i ) ∣ A i ∣ Ratiocut(A_{1},A_{2},...,A_{k})=\frac{1}{2}\sum\limits_{i=1}^{k}\frac{W(A_{i},\bar A_{i})}{|A_{i}|} Ratiocut(A1?,A2?,...,Ak?)=21?i=1k?Ai?W(Ai?,Aˉi?)?
  • 规范割 N C u t ( A 1 , A 2 , . . . , A k ) = 1 2 ∑ i = 1 k W ( A i , A ˉ i ) v o l ( A i ) NCut(A_{1},A_{2},...,A_{k})=\frac{1}{2}\sum\limits_{i=1}^{k}\frac{W(A_{i},\bar A_{i})}{vol(A _{i})} NCut(A1?,A2?,...,Ak?)=21?i=1k?vol(Ai?)W(Ai?,Aˉi?)?

(1)比例割

引入指示向量(点击可查看指示向量定义) h j ∈ { h 1 , h 2 , . . . , h k } h_{j}\in\{h_{1},h_{2},...,h_{k}\} hj?{h1?,h2?,...,hk?} j = 1 , 2 , . . . , k j=1,2,...,k j=1,2,...,k。对于任意一个向量 h j h_{j} hj?,它是一个 n n n维向量( n n n表示样本数),定义 h i j h_{ij} hij?如下

h i j = { 0 , v i ? A j ∣ A j ∣ , v i ∈ A j h_{ij}=\begin{cases} 0,v_{i}\notin A_{j}\\ \sqrt{|A_{j}|},v_{i}\in A_{j}\\ \end{cases} hij?={0vi?/Aj?Aj? ?vi?Aj??

于是,对于 h i T L h i h_{i}^{T}Lh_{i} hiT?Lhi?,根据拉普拉斯矩阵性质可知

  • 对于任意向量 f = ( f 1 , . . . , f n ) T ∈ R n f=(f_{1},...,f_{n})^{T} \in R^{n} f=(f1?,...,fn?)TRn,有 f T L f = 1 2 ∑ i , j = 1 n w i j ( f i ? f j ) 2 f^{T}Lf=\frac{1}{2}\sum\limits_{i,j=1}^{n}w_{ij}(f_{i}-f_{j})^{2} fTLf=21?i,j=1n?wij?(fi??fj?)2

h i T L h i = 1 2 ∑ m = 1 ∑ n = 1 w m n ( h i m ? h i n ) 2 = c u t ( A i , A ˉ i ) ∣ A i ∣ h_{i}^{T}Lh_{i}=\frac{1}{2}\sum\limits_{m=1}\sum\limits_{n=1}w_{mn}(h_{im}-h_{in})^{2}=\frac{cut(A_{i},\bar A_{i})}{|A_{i}|} hiT?Lhi?=21?m=1?n=1?wmn?(him??hin?)2=Ai?cut(Ai?,Aˉi?)?

  • 严格证明过程请看刘建平博客:链接

可以看到,对于某一个子图 i i i R a t i o n C u t RationCut RationCut就对应于 h i T L h i h_{i}^{T}Lh_{i} hiT?Lhi?,那么对于 k k k个子图

R a t i o C u t ( A 1 , A 2 , . . . , A k ) = ∑ i = 1 k h i T L h i = ∑ i = 1 k ( H T L H ) i i = t r ( H T L H ) RatioCut(A_{1},A_{2},...,A_{k})=\sum\limits_{i=1}^{k}h_{i}^{T}Lh_{i}=\sum\limits_{i=1}^{k}(H^{T}LH)_{ii}=tr(H^{T}LH) RatioCut(A1?,A2?,...,Ak?)=i=1k?hiT?Lhi?=i=1k?(HTLH)ii?=tr(HTLH)

因此, R a t i o n C u t RationCut RationCut切图本质就是最小化 t r ( H T L H ) tr(H^{T}LH) tr(HTLH)。又因为 H T H = I H^{T}H=I HTH=I(单位矩阵),则切图优化目标为

a r g m i n ? H t r ( H T L H ) s . t . H T H = I \underbrace{argmin}_{H} tr(H^{T}LH) s.t.H^{T}H=I H argmin??tr(HTLH)s.t.HTH=I

对于优化目标 t r ( H t L H ) tr(H^{t}LH) tr(HtLH)中的每一个优化子目标 h i T L h i h_{i}^{T}Lh_{i} hiT?Lhi?,其中的 h h h是单位正交基, L L L为对称矩阵,所以此时 h i T L h i h_{i}^{T}Lh_{i} hiT?Lhi?的最大值即为 L L L的最大特征值、最小值即为 L L L的最小特征值。而在谱聚类中,我们的目标就是要找到目标的最小特征值,得到对应特征值向量,此时切图效果最佳。所以对于 h i T L h i h_{i}^{T}Lh_{i} hiT?Lhi?,目标就是找到 L L L的最小特征值,而对于 t r ( H t L H ) = ∑ i = 1 k h i T L h i tr(H^{t}LH)=\sum\limits_{i=1}^{k}h_{i}^{T}Lh_{i} tr(HtLH)=i=1k?hiT?Lhi?,则目标就是要找到 k k k个最小的特征值

因此,通过找到 L L L的最小的 k k k个特征值,可以得到对应的 k k k个特征向量,这 k k k特特征向量组成一个 n n n× k k k维矩阵,也即 H H H。一般需要对矩阵 H H H按行做标准化,如下

  • 一般来说, k k k远小于 n n n,也就说进行了降维

h i j ? = h i j ( ∑ t = 1 k h i t 2 ) 1 2 h_{ij}^{*}=\frac{h_{ij}}{(\sum\limits_{t=1}^{k}h_{it}^2)^{\frac{1}{2}}} hij??=(t=1k?hit2?)21?hij??

这里需要注意,降维后导致得到的指示向量 h h h对应的 H H H现在并不能完全指示各样本的归属,因此一般在得到 n × k n×k n×k维的矩阵 H H H后还需要对每一行进行一次传统的聚类,比如使用K-Means聚类

(2)规范割(常用)

规范割和比例割类似,只是把比例割的分母 ∣ A i ∣ |A_{i}| Ai?换成了 v o l ( A i ) vol(A_{i}) vol(Ai?),定义指示向量 h i j h_{ij} hij?如下

h i j = { 0 , v i ? A j v o l ( A i ) , v i ∈ A j h_{ij}=\begin{cases} 0,v_{i}\notin A_{j}\\ \sqrt{vol(A_{i})},v_{i}\in A_{j}\\ \end{cases} hij?={0vi?/Aj?vol(Ai?) ?vi?Aj??

于是,对于 h i T L h i h_{i}^{T}Lh_{i} hiT?Lhi?,根据拉普拉斯矩阵性质可知

  • 对于任意向量 f = ( f 1 , . . . , f n ) T ∈ R n f=(f_{1},...,f_{n})^{T} \in R^{n} f=(f1?,...,fn?)TRn,有 f T L f = 1 2 ∑ i , j = 1 n w i j ( f i ? f j ) 2 f^{T}Lf=\frac{1}{2}\sum\limits_{i,j=1}^{n}w_{ij}(f_{i}-f_{j})^{2} fTLf=21?i,j=1n?wij?(fi??fj?)2

h i T L h i = 1 2 ∑ m = 1 ∑ n = 1 w m n ( h i m ? h i n ) 2 = c u t ( A i , A ˉ i ) v o l ( A i ) h_{i}^{T}Lh_{i}=\frac{1}{2}\sum\limits_{m=1}\sum\limits_{n=1}w_{mn}(h_{im}-h_{in})^{2}=\frac{cut(A_{i},\bar A_{i})}{vol(A_{i})} hiT?Lhi?=21?m=1?n=1?wmn?(him??hin?)2=vol(Ai?)cut(Ai?,Aˉi?)?

  • 严格证明过程请看刘建平博客:链接

可以看到,对于某一个子图 i i i R a t i o n C u t RationCut RationCut就对应于 h i T L h i h_{i}^{T}Lh_{i} hiT?Lhi?,那么对于 k k k个子图

N C u t ( A 1 , A 2 , . . . , A k ) = ∑ i = 1 k h i T L h i = ∑ i = 1 k ( H T L H ) i i = t r ( H T L H ) NCut(A_{1},A_{2},...,A_{k})=\sum\limits_{i=1}^{k}h_{i}^{T}Lh_{i}=\sum\limits_{i=1}^{k}(H^{T}LH)_{ii}=tr(H^{T}LH) NCut(A1?,A2?,...,Ak?)=i=1k?hiT?Lhi?=i=1k?(HTLH)ii?=tr(HTLH)

但此时 H T H =? I H^{T}H \not=I HTH=I,而是 H T D H = I H^{T}DH =I HTDH=I

  • 这是因为 h i T D h i = ∑ j = 1 n h i j 2 d j = 1 v o l ( A i ) ∑ j ∈ A i d j = 1 v o l ( A i ) v o l ( A i ) = 1 h_{i}^{T}Dh_{i}=\sum\limits_{j=1}^{n}h_{ij}^{2}d_{j}=\frac{1}{vol(A_{i})}\sum\limits_{j\in A_{i}}d_{j}=\frac{1}{vol(A_{i})}vol(A_{i})=1 hiT?Dhi?=j=1n?hij2?dj?=vol(Ai?)1?jAi??dj?=vol(Ai?)1?vol(Ai?)=1

因此,此时切图优化目标为

a r g m i n ? H t r ( H T L H ) s . t . H T D H = I \underbrace{argmin}_{H} tr(H^{T}LH) s.t.H^{T}DH=I H argmin??tr(HTLH)s.t.HTDH=I

但是现在矩阵 H H H中的指示向量 h h h并不是标准正交基,所以需要对 H H H做一定转换。令 H = D ? 1 2 F H=D^{-\frac{1}{2}}F H=D?21?F,则 H T L H = F T D ? 1 2 L D ? 1 2 F H^{T}LH=F^{T}D^{-\frac{1}{2}}LD^{-\frac{1}{2}}F HTLH=FTD?21?LD?21?F H T D H = F T F = I H^{T}DH=F^{T}F=I HTDH=FTF=I,于是优化目标变更为
a r g m i n ? F t r ( F T D ? 1 2 L D ? 1 2 F ) s . t . F T F = I \underbrace{argmin}_{F} tr(F^{T}D^{-\frac{1}{2}}LD^{-\frac{1}{2}}F) s.t.F^{T}F=I F argmin??tr(FTD?21?LD?21?F)s.t.FTF=I

现在,和比例割一样,通过找到 D ? 1 2 L D ? 1 2 D^{-\frac{1}{2}}LD^{-\frac{1}{2}} D?21?LD?21?(就是之前的 L L L)的最小的 k k k个特征值,可以得到对应的 k k k个特征向量,这 k k k特征向量组成一个 n n n× k k k维矩阵,也即 F F F,最后对 F F F进行传统聚类

  • 一般来说, D ? 1 2 L D ? 1 2 D^{-\frac{1}{2}}LD^{-\frac{1}{2}} D?21?LD?21?相当于对 L L L做了一次标准化,也即 L i j d i ? d j \frac{L_{ij}}{\sqrt{d_{i}*d_{j}}} di??dj? ?Lij??

二:谱聚类算法流程

给定数据集 D = { x 1 , x 2 , . . . , x n } D=\{x_{1}, x_{2}, ... , x_{n}\} D={x1?,x2?,...,xn?}

  1. 根据输入的相似矩阵生成方式(一般为高斯核函数)构建相似矩阵 S S S(AffinityMatrix)
  2. 根据相似矩阵 S S S构建邻接矩阵 W W W,再构建度矩阵 D D D
  3. 计算拉普拉斯矩阵 L = D ? W L=D-W L=D?W
  4. 得到标准化后的拉普拉斯矩阵 D ? 1 2 L D ? 1 2 D^{-\frac{1}{2}}LD^{-\frac{1}{2}} D?21?LD?21?
  5. 计算 D ? 1 2 L D ? 1 2 D^{-\frac{1}{2}}LD^{-\frac{1}{2}} D?21?LD?21?最小的 k k k个特征值对应的特征向量 f f f
  6. 将特征向量 f f f组成矩阵并按行标准化,最终组成 n n n× k k k维的特征矩阵 F F F
  7. F F F中每一行作为一个 k k k维的样本,共 n n n个样本,采用某种聚类方法进行聚类,假设聚类维数为 k 、 k^{、} k
  8. 得到簇划分C ( c 1 , c 2 , . . . , c k 、 ) (c_{1}, c_{2}, ... , c_{k^{、}}) (c1?,c2?,...,ck?)

三:Python实现

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.cluster import KMeans
from sklearn.metrics.pairwise import rbf_kernel
from sklearn.datasets import make_blobs
from sklearn.preprocessing import normalize

def get_affinity_matrix(data_set):
    #  利用高斯核函数计算相似矩阵(全连接)
    rbf = rbf_kernel(data_set)
    for i in range(len(rbf)):
        rbf[i, i] = 0
    return rbf


def distance(x1, x2):
    """
    获得两个样本点之间的距离
    :param x1: 样本点1
    :param x2: 样本点2
    :return:
    """
    dist = np.sqrt(np.power(x1-x2,2).sum())
    return dist

def get_dist_matrix(data):
    """
    获取距离矩阵
    :param data: 样本集合
    :return: 距离矩阵
    """
    n = len(data)  #样本总数
    dist_matrix = np.zeros((n, n)) # 初始化邻接矩阵为n×n的全0矩阵
    for i in range(n):
        for j in range(i+1, n):
            dist_matrix[i][j] = dist_matrix[j][i] = distance(data[i], data[j])
    return dist_matrix

def get_W(data, k):
    # 获取邻接矩阵(K邻近法)
    n = len(data)
    dist_matrix = get_dist_matrix(data)
    W = np.zeros((n, n))
    for idx, item in enumerate(dist_matrix):
        idx_array = np.argsort(item)  # 每一行距离列表进行排序,得到对应的索引列表
        W[idx][idx_array[1:k+1]] = 1
    transpW =np.transpose(W)
    return (W+transpW)/2

def spectral_clustering(data_set, k):
    # 利用相似矩阵S得到邻接矩阵W
    W = get_affinity_matrix(data_set)  #高斯核函数(全连接法)
    #  W = get_W(data_set, k)  # K邻近法

    # 计算度矩阵D,并得到矩阵D的1/2次方的逆矩阵(便于计算拉普拉斯矩阵)
    D_inv = np.diag(np.power(np.sum(W, axis=1), -0.5))

    # 计算拉普拉斯矩阵L=D-W
    # 标准化拉普拉斯矩阵l = D_inv*L*D_inv=I-D_inv*W*D_inv
    L = np.eye(len(data_set)) - np.dot(np.dot(D_inv, W), D_inv)

    # 得到特征值和特征向量
    eigvals, eigvecs = np.linalg.eig(L)

    # 找到前k个最小的特征值(索引)
    k_smallest_eigvals_index = np.argsort(eigvals)[:k]

    # 取出这k小特征值对应的特征向量,并正则化
    k_smallest_eigvecs = normalize(eigvecs[:, k_smallest_eigvals_index])
    
    # 使用K_Means聚类
    return KMeans(n_clusters=k).fit_predict(k_smallest_eigvecs)


raw_data = pd.read_csv(r'E:\Postgraduate\Dataset\jain.csv', header=None)
raw_data.columns = ['X', 'Y']
x_axis = 'X'
y_axis = 'Y'

examples_num = raw_data.shape[0]
train_data = raw_data[[x_axis, y_axis]].values.reshape(examples_num, 2)


min_vals = train_data.min(0)
max_vals = train_data.max(0)
ranges = max_vals - min_vals
normal_data = np.zeros(np.shape(train_data))
nums = train_data.shape[0]
normal_data = train_data - np.tile(min_vals, (nums, 1))
normal_data = normal_data / np.tile(ranges, (nums, 1))

labels = spectral_clustering(normal_data, 2)

# 原数据
fig, (ax0, ax1) = plt.subplots(ncols=2)
ax0.scatter(normal_data[:, 0], normal_data[:, 1], c='black')
ax0.set_title('raw data')
# 谱聚类结果
ax1.scatter(normal_data[:, 0], normal_data[:, 1], c=labels)
ax1.set_title('Spectral Clustering')

plt.show()

(高斯核函数)
在这里插入图片描述

(K邻近法)
在这里插入图片描述

四:谱聚类算法优缺点

(1)优点

  • 谱聚类只需要数据之间的相似度矩阵,所以对于稀疏数据的聚类很有效
  • 使用了降维,因此处理高纬数据聚类时复杂度要明显低于传统聚类算法
  • 谱聚类算法建立在谱图理论基础上,与传统聚类算法相比,它具有能在任意形状的样本空间上聚类且收敛于全局最优解

(2)缺点

  • 如果最终聚类的维度非常高,则由于降维的幅度不够,导致算法的运行速度和最后效果都不是很好
  • 聚类效果依赖于相似度矩阵,所以不同的相似度矩阵得到的最终聚类效果大不同相同
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-09-13 11:15:05  更:2022-09-13 11:18:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:33:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码