简单无向图的core分解算法

本文介绍了无向图的核心分解算法,用于量化图中节点的紧密程度。核心分解在社交网络分析中用于挖掘高密度用户群体,通过删除度数小于k的节点及边来找到k-core。文章详细阐述了基础算法和优化算法,包括时间复杂度为O(|E|)的优化策略,并提供了Pascal和C++的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在做子图匹配算法的相关优化工作,发现core结构在量化子图结构方面比较常用,现总结如下。

 

基本概念

在图(Graph)模型中,常常会有一些概念用来描述图的某些特征,core就是其中之一。core主要用来描述图中点之间的紧密(cohesive)程度,core的定义为:

设有简单无向图G = (V, E),其中V为点集,E为边集,∃S = (V', E'),V'⊆V, E'⊆E,∀v∈V' d(v) >= k, 且不存在u∈V - V',使得∀v∈V'∪{u} d(v) >= k, 则称S为k-core,其中d(v)表示v的度数(与点v相连的边数,下同)

用白话说就是如果图G中的存在一个最大子图S,S里面的点的度数都大于等于k,则称子图S为k-core,k称为 core S 的阶数

下图为k-core的一个例子:

从上图的例子中我们可以发现:

  1. k-core一定是 (k-n)-core (k>=0, n <=k),比如2-core一定是1-core,也一定是0-core
  2. k-core不一定是连通图

那么k-core有什么用呢?其最常见的应用就是挖掘社交网络中用户之间的紧密程度。如在下图所示的社交网络中,可以把每一个用户当作一个点,用户之间如果有联系的话就用一条边将他们连接起来,这时,k-core就可以用来挖掘这个社交网络中那些互相之间联系紧密的用户群体。

在实际应用中,我们通常更关心图中每一个点的core-value (又被称为core-number),什么是core-value呢?就是该点所在的最高阶的core,用白话说就是如果一个点 v 可以在k-core中,但是却无法在 (k+1)-core 中,则称点v的core-value为k,记作 v.core-value = k

设图G中最大的core-value为x, 则我们把图G中[0,x]-core都找出来称为图G的core分解,通常情况下我们只需要得到图G中每一个点的core-value即可。

下面我将介绍图core分解的经典算法

基础算法

首先,我们可以想象一下如果要计算core-value的话,图中哪一个点的core-value是最容易计算的?我们可以从定义入手,定义要求k-core中任何一个点的度数都要大于等于k,这个其实等价于k-core中最小度数的点的度数要大于等于k,据此我们可以尝试先从图中最小度数的点开始算起。

设图G中最小度数的点为v,因为点v是图G中度数最小的点,那么v肯定也是图G任意子图度数最小的点(图G中没有度数比v更小的点),也就是说任意包含点v的子图,core的最高阶数一定是d(v),因为子图中其他的点的度数都大于等于d(v),此时子图中的所有点一定是都在d(v)-core里面的,同时由于v点自身度数的限制,v点是一定不能在 (d(v)+1)-core 里面的,这个时候我们就直接得到了点v的core-value是d(v),即 v.core-value = d(v)

在我们得到了点v的core-value之后,我们可以把图G分为两个部分,一个是与点v连通的部分,另一个是与点v不连通的部分

  • 与点v不连通的部分

        与点v不连通的部分很简单,我们可以继续在不连通的部分选取度数最小的点,然后按处理点v的方式对这个点进行处理即可。

  • 与点v连通的部分

        在与点v连通的部分,我们又可以将里面的点分为两种类型,一种是度数等于d(v)的点,另一种是度数大于d(v)的点(不可能存在度数小于d(v)的点,因为v是图中度数最小的点)。

  •         度数等于d(v)的点

               对于度数等于d(v)的点,我们可以直接得到这些点的core-value也等于d(v),理由与得到v.core-value的理由一致。

  •         度数大于d(v)的点

               对于度数大于d(v)的点,为了方便表述,我们不失一般性地设在与点v相连的这部分子图中有点u,且d(u) > d(v),即u是度数大于d(v)的点,那么既然我们都已经明确地知道了u的度数一定是大于d(v)的,那么是不是也意味着u.core-value也一定是大于d(v)的呢?答案其实是否定的,我们可以考虑一个极端情况:除了u以外,其他点的度数都是d(v),这时,u.core-value 也等于 d(v),因为此时如果包含点u的core里面存在其他的点,core的最高阶数只能是d(v),而如果包含点u的core里面只有点u一个点,那么此时core的阶数只能是0,按照core-value取最高阶数的定义,即这种极端情况下u.core-value = d(v)。那么u.core-value有可能大于d(v)吗?答案是肯定的,我们考虑另一种极端情况:除了点v以外,其他点的度数都是大于d(v) 的且点v的邻居点(与点v直接相邻的点)的度数是大于d(v) + 1的,在这种情况下,我们只需要将包含点u的core把点v排除在外即可,这时剩下的点度数都是大于d(v)的,所以u.core-value也一定是大于d(v)的。通过上面的分析我们可以发现,对于度数大于d(v)的点,我们是无法直接确定它们的core-value的,需要进行进一步地搜索。

               那么我们该如何进行进一步地搜索呢?通过上

### 聚类算法概述 聚类分析是一种无监督学习方法,旨在将数据集划分为若干组(簇),使得同一组内的对象具有较高的相似度,而不同组的对象差异较大。以下是五种常见的聚类算法及其应用场景。 --- ### 1. K-Means 聚类 K-Means 是一种基于划分的聚类算法,目标是最小化簇内误差平方和 (WSS, Within-Cluster Sum of Squares)[^3]。该算法通过迭代优化质心位置来完成分组。 #### 实现方式 ```python from sklearn.cluster import KMeans import numpy as np data = np.random.rand(100, 2) # 随机生成二维数据 kmeans = KMeans(n_clusters=3).fit(data) labels = kmeans.labels_ centroids = kmeans.cluster_centers_ ``` #### 应用场景 适用于大规模数据集中的简单分区问题,例如客户细分、图像压缩等[^4]。 --- ### 2. 层次聚类 (Hierarchical Clustering) 层次聚类构建一棵树状结构表示数据之间的关系,可分为凝聚型(自底向上)和分裂型(自顶向下)。它不需要预先指定簇的数量。 #### 实现方式 ```python from scipy.cluster.hierarchy import dendrogram, linkage, fcluster import matplotlib.pyplot as plt Z = linkage(data, 'ward') # 使用 Ward 方法计算距离矩阵 plt.figure(figsize=(8, 4)) dendrogram(Z) clusters = fcluster(Z, t=3, criterion='maxclust') ``` #### 应用场景 适合用于基因表达数据分析、文档分类等领域,尤其当需要可视化层级关系时[^5]。 --- ### 3. DBSCAN 密度聚类 DBSCAN 基于密度定义簇,能够发现任意形状的簇并识别噪声点。它的核心概念包括 ε 半径邻域和最小样本数 MinPts。 #### 实现方式 ```python from sklearn.cluster import DBSCAN db = DBSCAN(eps=0.3, min_samples=10).fit(data) core_samples_mask = np.zeros_like(db.labels_, dtype=bool) core_samples_mask[db.core_sample_indices_] = True labels = db.labels_ ``` #### 应用场景 广泛应用于异常检测、地理空间数据分析以及处理含有噪声的数据集合[^6]。 --- ### 4. 谱聚类 (Spectral Clustering) 谱聚类利用图论的思想,通过对拉普拉斯矩阵特征分解找到最优分割方案。其主要步骤包括构造相似性图、标准化拉普拉斯矩阵求解前几大特征向量,并应用传统聚类技术如 K-Means 完成分割[^7]。 #### 实现方式 ```python from sklearn.cluster import SpectralClustering sc = SpectralClustering(n_clusters=3, affinity='nearest_neighbors').fit(data) labels = sc.labels_ ``` #### 应用场景 特别适合解决非凸形分布的数据集问题,在社交网络社区挖掘等方面表现优异[^8]。 --- ### 5. 高斯混合模型 (Gaussian Mixture Model, GMM) 高斯混合模型假设数据由多个正态分布组成,采用期望最大化算法估计参数。相比硬分配策略,GMM 提供软归属概率评估每个实例属于哪个簇的可能性。 #### 实现方式 ```python from sklearn.mixture import GaussianMixture gmm = GaussianMixture(n_components=3).fit(data) labels = gmm.predict(data) probabilities = gmm.predict_proba(data) ``` #### 应用场景 常被用来建模复杂多模式的概率分布情况下的金融风险预测或者生物医学信号处理等问题[^9]。 --- ### 总结表 | **算法名称** | **特点描述** | **典型用途** | |--------------------|--------------------------------------------------------------------------------------------------|---------------------------------------| | K-Means | 简单高效;需预设簇数量 | 图像分割、市场研究 | | 层次聚类 | 可视化清晰;无需提前设定簇数目 | 生物信息学 | | DBSCAN | 自动适应不规则形态;能标记离群点 | 地理信息系统 | | 谱聚类 | 处理复杂拓扑结构良好 | 社交媒体社群探测 | | 高斯混合模型 | 支持不确定性量化 | 数据降维 | ---
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Knight丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值