日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

【知识图谱】Louvain、LPA等5类经典社区发现算法 Python 实战

發(fā)布時(shí)間:2023/12/10 python 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【知识图谱】Louvain、LPA等5类经典社区发现算法 Python 实战 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、社區(qū)發(fā)現(xiàn)概述

根據(jù)圖論,加權(quán)網(wǎng)絡(luò)表示為𝐺=(𝑉,𝐸,𝑊),未加權(quán)網(wǎng)絡(luò)表示為𝐺=(𝑉,𝐸),其中𝑉和𝐸表示節(jié)點(diǎn)和邊的集合,𝑊分別表示𝐸相應(yīng)的權(quán)重,以連接的強(qiáng)度或容量為單位。在未加權(quán)的網(wǎng)絡(luò)中,𝑊被視為1。子圖𝑔?𝐺是保留原始網(wǎng)絡(luò)結(jié)構(gòu)的圖劃分。子圖的劃分遵循預(yù)定義(pre-define)的規(guī)則,不同的規(guī)則可能會(huì)導(dǎo)致不同形式的子圖。

社區(qū)是代表真實(shí)社會(huì)現(xiàn)象的一種子圖。換句話說(shuō),社區(qū)是一組具有共同特征的人或?qū)ο蟆?/p>

社區(qū)是網(wǎng)絡(luò)中節(jié)點(diǎn)密集連接的子圖,稀疏連接的節(jié)點(diǎn)溝通了不同的社區(qū),使用𝐶={𝐶1,𝐶2,?,𝐶𝑘}表示將網(wǎng)絡(luò)𝐺劃分為𝑘個(gè)社區(qū)的集合,其中𝐶𝑖是社區(qū)劃分的第𝑖個(gè)社區(qū)。

節(jié)點(diǎn)𝑣屬于社區(qū)𝐶𝑖滿足如下條件:社區(qū)內(nèi)部每個(gè)節(jié)點(diǎn)的內(nèi)部度大于其外部度。

因此,社區(qū)發(fā)現(xiàn)的目標(biāo)是發(fā)現(xiàn)網(wǎng)絡(luò)𝐺中的社區(qū)𝐶。

技術(shù)交流

目前開(kāi)通了技術(shù)交流,群友已超過(guò)3000人,添加時(shí)最好的備注方式為:來(lái)源+興趣方向,方便找到志同道合的朋友,資料、代碼獲取也可以加入

方式1、添加微信號(hào):dkl88191,備注:來(lái)自CSDN
方式2、微信搜索公眾號(hào):Python學(xué)習(xí)與數(shù)據(jù)挖掘,后臺(tái)回復(fù):加群

二、KL社區(qū)發(fā)現(xiàn)算法

K-L(Kernighan-Lin)算法是一種將已知網(wǎng)絡(luò)劃分為已知大小的兩個(gè)社區(qū)的二分方法,它是一種貪婪算法,它的主要思想是為網(wǎng)絡(luò)劃分定義了一個(gè)函數(shù)增益Q,Q表示的是社區(qū)內(nèi)部的邊數(shù)與社區(qū)之間的邊數(shù)之差,根據(jù)這個(gè)方法找出使增益函數(shù)Q的值成為最大值的劃分社區(qū)的方法。

1、實(shí)現(xiàn)策略

該算法的具體策略是,將社區(qū)結(jié)構(gòu)中的結(jié)點(diǎn)移動(dòng)到其他的社區(qū)結(jié)構(gòu)中或者交換不同社區(qū)結(jié)構(gòu)中的結(jié)點(diǎn)。從初始解開(kāi)始搜索,直到從當(dāng)前的解出發(fā)找不到更優(yōu)的候選解,然后停止。

首先將整個(gè)網(wǎng)絡(luò)的節(jié)點(diǎn)隨機(jī)的或根據(jù)網(wǎng)絡(luò)的現(xiàn)有信息分為兩個(gè)部分,在兩個(gè)社團(tuán)之間考慮所有可能的節(jié)點(diǎn)對(duì),試探交換每對(duì)節(jié)點(diǎn)并計(jì)算交換前后的ΔQ,ΔQ=Q交換后-Q交換前,記錄ΔQ最大的交換節(jié)點(diǎn)對(duì),并將這兩個(gè)節(jié)點(diǎn)互換,記錄此時(shí)的Q值。

規(guī)定每個(gè)節(jié)點(diǎn)只能交換一次,重復(fù)這個(gè)過(guò)程直至網(wǎng)絡(luò)中的所有節(jié)點(diǎn)都被交換一次為止。需要注意的是不能在Q值發(fā)生下降時(shí)就停止,因?yàn)镼值不是單調(diào)增加的,既使某一步交換會(huì)使Q值有所下降,但其后的一步交換可能會(huì)出現(xiàn)一個(gè)更大的Q值。在所有的節(jié)點(diǎn)都交換過(guò)之后,對(duì)應(yīng)Q值最大的社團(tuán)結(jié)構(gòu)即被認(rèn)為是該網(wǎng)絡(luò)的理想社團(tuán)結(jié)構(gòu)。

地址:http://eda.ee.ucla.edu/EE201A-04Spring/kl.pdf

2、代碼實(shí)現(xiàn):

>>> def draw_spring(G, com): ... pos = nx.spring_layout(G) # 節(jié)點(diǎn)的布局為spring型 ... NodeId = list(G.nodes()) ... node_size = [G.degree(i) ** 1.2 * 90 for i in NodeId] # 節(jié)點(diǎn)大小 ... plt.figure(figsize=(8, 6)) # 圖片大小 ... nx.draw(G, pos, with_labels=True, node_size=node_size, node_color='w', node_shape='.') ... color_list = ['pink', 'orange', 'r', 'g', 'b', 'y', 'm', 'gray', 'black', 'c', 'brown'] ... for i in range(len(com)): ... nx.draw_networkx_nodes(G, pos, nodelist=com[i], node_color=color_list[i]) ... plt.show() ... >>> import networkx as nx >>> import matplotlib.pyplot as plt >>> G = nx.karate_club_graph() >>> com = list(kernighan_lin_bisection(G)) >>> import matplotlib.pyplot as plt >>> from networkx.algorithms.community import kernighan_lin_bisection >>> com = list(kernighan_lin_bisection(G)) >>> print('社區(qū)數(shù)量', len(com)) 社區(qū)數(shù)量 2 >>> draw_spring(G, com)

效果:

三、Louvain社區(qū)發(fā)現(xiàn)算法

Louvain算法是一種基于模塊度的社區(qū)發(fā)現(xiàn)算法,其基本思想是網(wǎng)絡(luò)中節(jié)點(diǎn)嘗試遍歷所有鄰居的社區(qū)標(biāo)簽,并選擇最大化模塊度增量的社區(qū)標(biāo)簽,在最大化模塊度之后,每個(gè)社區(qū)看成一個(gè)新的節(jié)點(diǎn),重復(fù)直到模塊度不再增大。

地址:https://arxiv.org/pdf/0803.0476.pdf

1、實(shí)現(xiàn)策略

具體實(shí)現(xiàn)上,如下圖所示,步驟如下:

1)初始時(shí)將每個(gè)頂點(diǎn)當(dāng)作一個(gè)社區(qū),社區(qū)個(gè)數(shù)與頂點(diǎn)個(gè)數(shù)相同。

2)依次將每個(gè)頂點(diǎn)與之相鄰頂點(diǎn)合并在一起,計(jì)算它們最大的模塊度增益是否大于0,如果大于0,就將該結(jié)點(diǎn)放入模塊度增量最大的相鄰結(jié)點(diǎn)所在社區(qū)。

其中,模塊度用來(lái)衡量一個(gè)社區(qū)的質(zhì)量,公式第一如下。

3)迭代第二步,直至算法穩(wěn)定,即所有頂點(diǎn)所屬社區(qū)不再變化。

4)將各個(gè)社區(qū)所有節(jié)點(diǎn)壓縮成為一個(gè)結(jié)點(diǎn),社區(qū)內(nèi)點(diǎn)的權(quán)重轉(zhuǎn)化為新結(jié)點(diǎn)環(huán)的權(quán)重,社區(qū)間權(quán)重轉(zhuǎn)化為新****結(jié)點(diǎn)邊的權(quán)重。

5)重復(fù)步驟1-3,直至算法穩(wěn)定。

2、代碼實(shí)現(xiàn):

>>> import networkx as nx >>> import matplotlib.pyplot as plt >>> G = nx.karate_club_graph() >>> com = list(kernighan_lin_bisection(G)) >>> import matplotlib.pyplot as plt >>> from networkx.algorithms.community import louvain_communities >>> com = list(louvain_communities(G)) >>> print('社區(qū)數(shù)量', len(com)) 社區(qū)數(shù)量 4 >>> draw_spring(G, com)

3、效果:

四、標(biāo)簽傳播社區(qū)發(fā)現(xiàn)算法

LPA全稱label propagation algorithm,即標(biāo)簽傳遞算法,是一種圖聚類算法,常用在社交網(wǎng)絡(luò)中,用于發(fā)現(xiàn)潛在的社區(qū),是一種基于標(biāo)簽傳播的局部社區(qū)劃分。對(duì)于網(wǎng)絡(luò)中的每一個(gè)節(jié)點(diǎn),在初始階段,Label Propagation算法對(duì)于每一個(gè)節(jié)點(diǎn)都會(huì)初始化一個(gè)唯一的一個(gè)標(biāo)簽。

每一次迭代都會(huì)根據(jù)與自己相連的節(jié)點(diǎn)所屬的標(biāo)簽改變自己的標(biāo)簽,更改的原則是選擇與其相連的節(jié)點(diǎn)中所屬標(biāo)簽最多的社區(qū)標(biāo)簽為自己的社區(qū)標(biāo)簽,這就是標(biāo)簽傳播的含義,隨著社區(qū)標(biāo)簽不斷傳播。最終,連接緊密的節(jié)點(diǎn)將有共同的標(biāo)簽

1、實(shí)現(xiàn)策略

LPA認(rèn)為每個(gè)結(jié)點(diǎn)的標(biāo)簽應(yīng)該和其大多數(shù)鄰居的標(biāo)簽相同,將一個(gè)節(jié)點(diǎn)的鄰居節(jié)點(diǎn)的標(biāo)簽中數(shù)量最多的標(biāo)簽作為該節(jié)點(diǎn)自身的標(biāo)簽(bagging思想)。給每個(gè)節(jié)點(diǎn)添加標(biāo)簽(label)以代表它所屬的社區(qū),并通過(guò)標(biāo)簽的“傳播”形成同一個(gè)“社區(qū)”內(nèi)部擁有同一個(gè)“標(biāo)簽”。

標(biāo)簽傳播算法(LPA)的做法如下:

第一步: 為所有節(jié)點(diǎn)指定一個(gè)唯一的標(biāo)簽;

第二步: 逐輪刷新所有節(jié)點(diǎn)的標(biāo)簽,直到達(dá)到收斂要求為止。對(duì)于每一輪刷新,節(jié)點(diǎn)標(biāo)簽刷新的規(guī)則如下:

對(duì)于某一個(gè)節(jié)點(diǎn),考察其所有鄰居節(jié)點(diǎn)的標(biāo)簽,并進(jìn)行統(tǒng)計(jì),將出現(xiàn)個(gè)數(shù)最多的那個(gè)標(biāo)簽賦給當(dāng)前節(jié)點(diǎn)。當(dāng)個(gè)數(shù)最多的標(biāo)簽不唯一 時(shí),隨機(jī)選一個(gè)。

2、代碼實(shí)現(xiàn):

>>> import networkx as nx >>> import matplotlib.pyplot as plt >>> G = nx.karate_club_graph() >>> com = list(kernighan_lin_bisection(G)) >>> import matplotlib.pyplot as plt >>> from networkx.algorithms.community import label_propagation_communities >>> com = list(label_propagation_communities(G)) >>> print('社區(qū)數(shù)量', len(com)) 社區(qū)數(shù)量 3 >>> draw_spring(G, com)

3、效果

五、greedy_modularity社區(qū)算法

1、實(shí)現(xiàn)策略

貪心模塊度社區(qū)算法,是一種用于檢測(cè)社區(qū)結(jié)構(gòu)的分層聚集算法,它在具有n個(gè)頂點(diǎn)和m條邊的網(wǎng)絡(luò)上的運(yùn)行時(shí)間是O(mdlogn),其中d是描述社區(qū)結(jié)構(gòu)的樹狀圖的深度。

地址:https://arxiv.org/pdf/cond-mat/0408187v2.pdf

2、代碼實(shí)現(xiàn):

>>> import networkx as nx >>> import matplotlib.pyplot as plt >>> G = nx.karate_club_graph() >>> com = list(kernighan_lin_bisection(G)) >>> import matplotlib.pyplot as plt >>> from networkx.algorithms.community import greedy_modularity_communities >>> com = list(greedy_modularity_communities(G)) >>> print('社區(qū)數(shù)量', len(com)) 社區(qū)數(shù)量 3 >>> draw_spring(G, com)

3、效果:

參考文獻(xiàn)

1、https://icode9.com/content-1-1321350.html
2、https://blog.csdn.net/qq_16543881/article/details/122825957
3、https://blog.csdn.net/qq_16543881/article/details/122781642

總結(jié)

以上是生活随笔為你收集整理的【知识图谱】Louvain、LPA等5类经典社区发现算法 Python 实战的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。