louvain算法python_一种基于Louvain算法的社区发现方法及系统与流程
本發(fā)明涉及數(shù)據(jù)挖掘技術(shù)領(lǐng)域,尤其涉及一種基于Louvain算法的社區(qū)發(fā)現(xiàn)方法及一種基于Louvain算法的社區(qū)發(fā)現(xiàn)系統(tǒng)
背景技術(shù):
隨著信息化技術(shù)的發(fā)展,信息系統(tǒng)中保存著大量用戶的信息特征,用戶與用戶之間也存在著某種關(guān)聯(lián)性。用戶的特征具有多維度,且多關(guān)聯(lián)性。社區(qū)發(fā)現(xiàn)能幫助人們更有效地了解網(wǎng)絡(luò)的結(jié)構(gòu)特征,從而提供更有效、更具個性化的服務(wù)。
當(dāng)前,許多研究通過分析網(wǎng)絡(luò)的結(jié)構(gòu)來發(fā)現(xiàn)社區(qū)。其中,Blondel等人基于現(xiàn)實中的大規(guī)模網(wǎng)絡(luò)的社區(qū)結(jié)構(gòu)都具有層次性,提出了一種迭代的兩階段模塊度最大化的快速算法(BGL算法)用于發(fā)現(xiàn)社區(qū)。該算法分為兩步:第一步、通過社區(qū)之間局部交換節(jié)點使得社區(qū)劃分的模塊度最大化。第二步、將前一步網(wǎng)絡(luò)劃分產(chǎn)生的社區(qū)作為新的網(wǎng)絡(luò)中的一個節(jié)點,節(jié)點之間邊的權(quán)值為其代表的兩個社區(qū)之間的邊的權(quán)值之和。反復(fù)迭代以上兩個步驟,直到模塊度的大小不再可能增加。BGL算法所使用的模塊度度量標(biāo)準(zhǔn)如下式所定義,該定義適用于加權(quán)網(wǎng)絡(luò):
其中,Aij表示節(jié)點i和節(jié)點j之間的邊的權(quán)重;ki=∑jAij表示與節(jié)點i相連的所有邊的權(quán)值之和;ci表示節(jié)點i所在的(所屬的)社區(qū);δ函數(shù)δ(u,v)表示當(dāng)u與v相等時為1,而其余情況下為0;表示網(wǎng)絡(luò)中所有邊的權(quán)值之和。
然而,BGL算法沒有涉及到網(wǎng)絡(luò)節(jié)點的屬性信息。而研究表明,在真實的在線社交網(wǎng)絡(luò)中,節(jié)點的屬性信息可以是判斷的標(biāo)準(zhǔn)之一,在結(jié)構(gòu)緊密的前提下,同一社區(qū)內(nèi)的節(jié)點屬性越相似越好。除此之外,雖然現(xiàn)有的很多聚類方法已將網(wǎng)絡(luò)的結(jié)構(gòu)和節(jié)點的屬性特征(或稱節(jié)點屬性或節(jié)點屬性信息)結(jié)合起來考慮(例如,通過對屬性和結(jié)構(gòu)進行加權(quán)的方法構(gòu)造新的網(wǎng)絡(luò),并在新的網(wǎng)絡(luò)上進行社區(qū)劃分),但是這些聚類的結(jié)果往往存在結(jié)構(gòu)上并不緊密或者不關(guān)聯(lián)的社區(qū),從而導(dǎo)致社區(qū)發(fā)現(xiàn)的結(jié)果不準(zhǔn)確;而且,這些方法的時間復(fù)雜度較高,不適于處理大規(guī)模的數(shù)據(jù)。
技術(shù)實現(xiàn)要素:
本發(fā)明所要解決的技術(shù)問題在于,提供一種基于Louvain算法的社區(qū)發(fā)現(xiàn)方法及系統(tǒng),可將網(wǎng)絡(luò)中的每個節(jié)點當(dāng)作社區(qū),并針對社區(qū)的模塊度和邊權(quán)重分析,從而可以得到更加精準(zhǔn)的社區(qū)發(fā)現(xiàn)。
為了解決上述技術(shù)問題,本發(fā)明提供了一種基于Louvain算法的社區(qū)發(fā)現(xiàn)方法,包括:
S1,初始化社區(qū),把每個節(jié)點作為一個社區(qū);
S2,將每個節(jié)點依次分配到每個鄰居節(jié)點所在社區(qū)以構(gòu)建社區(qū)圖形;
S3,根據(jù)社區(qū)圖形把社區(qū)看作一個節(jié)點,重新構(gòu)建社區(qū)圖形;
S4,重復(fù)步驟S3,直到所有狀態(tài)穩(wěn)定,則輸出結(jié)果。
作為上述方案的改進,所述步驟S2包括:將每個節(jié)點,依次嘗試分配到每個鄰居節(jié)點所在社區(qū);計算分配前與分配后的模塊度變化量;提取模塊度變化量的最大值;若模塊度變化量的最大值大于0,則將節(jié)點分配到該社區(qū),一直重復(fù)這個步驟,直到所有節(jié)點不再變化,形成社區(qū)圖形。
作為上述方案的改進,所述重新構(gòu)建社區(qū)圖形的方法包括:把社區(qū)內(nèi)節(jié)點度數(shù)和,轉(zhuǎn)化為新節(jié)點到自己的環(huán)路的權(quán)重;把社區(qū)間的邊權(quán)重轉(zhuǎn)化為新節(jié)點間的邊權(quán)重;重復(fù)步驟S2。
作為上述方案的改進,所述步驟S3之前還包括:壓縮社區(qū)圖形。
作為上述方案的改進,通過Python壓縮社區(qū)圖形。
相應(yīng)地,本發(fā)明還提供了一種基于Louvain算法的社區(qū)發(fā)現(xiàn)系統(tǒng),包括:初始化模塊,用于初始化社區(qū),把每個節(jié)點作為一個社區(qū);第一構(gòu)建模塊,用于將每個節(jié)點依次分配到每個鄰居節(jié)點所在社區(qū)以構(gòu)建社區(qū)圖形;第二構(gòu)建模塊,用于根據(jù)社區(qū)圖形把社區(qū)看作一個節(jié)點,重新構(gòu)建社區(qū)圖形;輸出模塊,用于當(dāng)所有狀態(tài)穩(wěn)定時,輸出結(jié)果。
作為上述方案的改進,所述第一構(gòu)建模塊包括:分配單元,用于將每個節(jié)點,依次嘗試分配到每個鄰居節(jié)點所在社區(qū);計算單元,用于計算分配前與分配后的模塊度變化量;提取單元,用于提取模塊度變化量的最大值;圖形單元,用于若模塊度變化量的最大值大于0,則將節(jié)點分配到該社區(qū),直到所有節(jié)點不再變化,形成社區(qū)圖形。
作為上述方案的改進,所述第二構(gòu)建模塊包括:第一轉(zhuǎn)化單元,用于把社區(qū)內(nèi)節(jié)點度數(shù)和,轉(zhuǎn)化為新節(jié)點到自己的環(huán)路的權(quán)重;第二轉(zhuǎn)化單元,把社區(qū)間的邊權(quán)重轉(zhuǎn)化為新節(jié)點間的邊權(quán)重。
作為上述方案的改進,所述基于Louvain算法的社區(qū)發(fā)現(xiàn)系統(tǒng)還包括壓縮模塊,用于壓縮社區(qū)圖形。
作為上述方案的改進,所述壓縮模塊通過Python壓縮社區(qū)圖形。
實施本發(fā)明,具有如下有益效果:
本發(fā)明利用大數(shù)據(jù)中的聚類算法技術(shù),實現(xiàn)復(fù)雜網(wǎng)絡(luò)中的社區(qū)發(fā)現(xiàn)。將網(wǎng)絡(luò)中的每個節(jié)點當(dāng)作社區(qū),并針對社區(qū)的模塊度和邊權(quán)重分析,從而可以得到更加精準(zhǔn)的社區(qū)發(fā)現(xiàn),具體地:
1、本發(fā)明采用基于Louvain算法實現(xiàn)社區(qū)發(fā)現(xiàn),針對社區(qū)中的節(jié)點進行模塊度的關(guān)聯(lián)分析;
2、本發(fā)明采用兩層計算。開始通過模塊度變化量對每個節(jié)點進行社區(qū)劃分,然后針對劃分后形成的社區(qū),做圖形壓縮,從而再次進行社區(qū)的模塊度和邊權(quán)重分析并進行社區(qū)劃分,直到所有狀態(tài)穩(wěn)定,再輸出結(jié)果,對社區(qū)的發(fā)現(xiàn)更加深入。
3、由于節(jié)點具有隨機性,本發(fā)明沒有使用節(jié)點的特征向量對節(jié)點進行相似度判斷,而是直接對節(jié)點進行向量及模塊度的關(guān)聯(lián),更為準(zhǔn)確。
附圖說明
圖1是社區(qū)節(jié)點示意圖;
圖2是本發(fā)明基于Louvain算法的社區(qū)發(fā)現(xiàn)方法的第一實施例流程;
圖3是本發(fā)明基于Louvain算法的社區(qū)發(fā)現(xiàn)方法的第二實施例流程;
圖4是本發(fā)明基于Louvain算法的社區(qū)發(fā)現(xiàn)系統(tǒng)的第一實施例結(jié)構(gòu)示意圖;
圖5是本發(fā)明中第一構(gòu)建模塊的結(jié)構(gòu)示意圖;
圖6是本發(fā)明中第二構(gòu)建模塊的結(jié)構(gòu)示意圖;
圖7是本發(fā)明基于Louvain算法的社區(qū)發(fā)現(xiàn)系統(tǒng)的第二實施例結(jié)構(gòu)示意圖。
具體實施方式
為使本發(fā)明的目的、技術(shù)方案和優(yōu)點更加清楚,下面將結(jié)合附圖對本發(fā)明作進一步地詳細描述。僅此聲明,本發(fā)明在文中出現(xiàn)或即將出現(xiàn)的上、下、左、右、前、后、內(nèi)、外等方位用詞,僅以本發(fā)明的附圖為基準(zhǔn),其并不是對本發(fā)明的具體限定。
復(fù)雜網(wǎng)絡(luò)是一個復(fù)雜系統(tǒng)的抽象,網(wǎng)絡(luò)中的節(jié)點表示個體,邊表示個體間的關(guān)系。社區(qū)結(jié)構(gòu)是復(fù)雜網(wǎng)絡(luò)中的一個普通特征,整個網(wǎng)絡(luò)是由多個社區(qū)組成。社區(qū)發(fā)現(xiàn)(Community Detection)算法用來發(fā)現(xiàn)網(wǎng)絡(luò)中的社區(qū)結(jié)構(gòu),也可以看作是一種聚類算法。該算法是一個復(fù)雜而有意義的過程,它對研究復(fù)雜網(wǎng)絡(luò)特征具有重要作用。算法試圖歸納各個節(jié)點為社區(qū),使得同一個社區(qū)內(nèi)節(jié)點連接緊密,而社區(qū)間連接比較稀疏(參見圖1)。本發(fā)明選用基于模塊度評估的Louvain算法實現(xiàn)社區(qū)發(fā)現(xiàn)過程。
參見圖2,圖2顯示了本發(fā)明一種基于Louvain算法的社區(qū)發(fā)現(xiàn)方法的第一實施例流程圖,其包括:
S101,初始化社區(qū),把每個節(jié)點作為一個社區(qū);
S102,將每個節(jié)點依次分配到每個鄰居節(jié)點所在社區(qū)以構(gòu)建社區(qū)圖形;
具體地,所述步驟S102包括:
(1)將每個節(jié)點,依次嘗試分配到每個鄰居節(jié)點所在社區(qū);優(yōu)選地,采用輪詢方式進行分配。
(2)計算分配前與分配后的模塊度變化量;其中,分配前與分配后的模塊度變化量是指分配前模塊度與分配后模塊度之差。
(3)提取模塊度變化量的最大值;
(4)若模塊度變化量的最大值大于0,則將節(jié)點分配到該社區(qū),一直重復(fù)這個步驟,直到所有節(jié)點不再變化,形成社區(qū)圖形。
具體地,與模塊度變化量相關(guān)統(tǒng)計指標(biāo)如下:
節(jié)點的度:與節(jié)點相連的邊的權(quán)和(無權(quán)圖則=邊數(shù)),對于有向圖,度可以分為入度及出度,分別對應(yīng)以該節(jié)點為終點的權(quán)和與起點的權(quán)和,入度+出度=度
節(jié)點聚類系數(shù):節(jié)點與其鄰居實際存在的邊數(shù)與可能存在的邊數(shù)之比聚類系數(shù)越大,節(jié)點與周圍連接越密切。
圖的平均聚類系數(shù):節(jié)點聚類系數(shù)平均值,越大則圖形中的點的關(guān)系越密切,更容易成團。
最短路徑長度:圖中指定節(jié)點有任意路徑相連,經(jīng)過路徑最短的長度為最短路徑長度。
模塊度:評估一個社區(qū)網(wǎng)絡(luò)劃分好壞的度量方法,它的物理含義是社區(qū)內(nèi)節(jié)點的連邊數(shù)與隨機情況下的邊數(shù)之差:其中Aij為邊ij的權(quán)重,ki=∑j,iAij表示節(jié)點i的度,ci表示i所屬社區(qū),表示圖的總度數(shù)。以上社區(qū)劃分方法基于模塊度計算。
S103,根據(jù)社區(qū)圖形把社區(qū)看作一個節(jié)點,重新構(gòu)建社區(qū)圖形;
具體地,所述重新構(gòu)建社區(qū)圖形的方法包括:
(1)把社區(qū)內(nèi)節(jié)點度數(shù)和,轉(zhuǎn)化為新節(jié)點到自己的環(huán)路的權(quán)重;
(2)把社區(qū)間的邊權(quán)重轉(zhuǎn)化為新節(jié)點間的邊權(quán)重;
(3)重復(fù)步驟S102。
S104,重復(fù)步驟S103,直到所有狀態(tài)穩(wěn)定,則輸出結(jié)果。
社區(qū)的穩(wěn)定狀態(tài),是指社區(qū)號不變的狀態(tài)。一開始,大家都有一個社區(qū)號,自成一個社區(qū),然后就迭代。如果跟旁邊結(jié)合,模塊度會下降,就結(jié)合,然后結(jié)合在一起的就記共同一個社區(qū)號。繼續(xù)迭代,同樣的,一個點,如果要去旁邊的社區(qū),就必須脫離現(xiàn)在的社區(qū),如果去旁邊的社區(qū)模塊度比脫離現(xiàn)在社區(qū)的模塊度還要大,那就不脫離了,那就穩(wěn)定下來了。當(dāng)所有點都穩(wěn)定了,迭代結(jié)束。社區(qū)號不變,就是一個穩(wěn)定的狀態(tài)。
參見圖3,圖3顯示了本發(fā)明一種基于Louvain算法的社區(qū)發(fā)現(xiàn)方法的第二實施例流程圖,其包括:
S201,初始化社區(qū),把每個節(jié)點作為一個社區(qū);
S202,將每個節(jié)點依次分配到每個鄰居節(jié)點所在社區(qū)以構(gòu)建社區(qū)圖形;
具體地,所述步驟S202包括:
(1)將每個節(jié)點,依次嘗試分配到每個鄰居節(jié)點所在社區(qū);
(2)計算分配前與分配后的模塊度變化量;其中,分配前與分配后的模塊度變化量是指分配前模塊度與分配后模塊度之差。
(3)提取模塊度變化量的最大值;
(4)若模塊度變化量的最大值大于0,則將節(jié)點分配到該社區(qū),一直重復(fù)這個步驟,直到所有節(jié)點不再變化,形成社區(qū)圖形。
S203,壓縮社區(qū)圖形。
通過Python方式實現(xiàn)降維及類聚,從而實現(xiàn)社區(qū)圖形的壓縮。
S204,根據(jù)社區(qū)圖形把社區(qū)看作一個節(jié)點,重新構(gòu)建社區(qū)圖形;
具體地,所述重新構(gòu)建社區(qū)圖形的方法包括:
(1)把社區(qū)內(nèi)節(jié)點度數(shù)和,轉(zhuǎn)化為新節(jié)點到自己的環(huán)路的權(quán)重;
(2)把社區(qū)間的邊權(quán)重轉(zhuǎn)化為新節(jié)點間的邊權(quán)重;
(3)重復(fù)步驟S202。
S205,重復(fù)步驟S204,直到所有狀態(tài)穩(wěn)定,則輸出結(jié)果。
因此,本發(fā)明利用大數(shù)據(jù)中的聚類算法技術(shù),實現(xiàn)復(fù)雜網(wǎng)絡(luò)中的社區(qū)發(fā)現(xiàn)。將網(wǎng)絡(luò)中的每個節(jié)點當(dāng)作社區(qū),并針對社區(qū)的模塊度和邊權(quán)重分析,從而可以得到更加精準(zhǔn)的社區(qū)發(fā)現(xiàn)。相應(yīng)地,通過社區(qū)發(fā)現(xiàn),在教育領(lǐng)域中,可以發(fā)現(xiàn)學(xué)校內(nèi)全部學(xué)生的社區(qū)關(guān)系,為學(xué)校內(nèi)學(xué)生的大數(shù)據(jù)分析及服務(wù)提供幫助,如可以提供好友發(fā)現(xiàn),更加精準(zhǔn)的為學(xué)生推薦好友;圖書推薦,可以利用社區(qū)中的閱讀風(fēng)格或者閱讀內(nèi)容,進行圖書推薦;課程推薦,促進學(xué)生個性化學(xué)習(xí);職業(yè)推薦,根據(jù)社區(qū)關(guān)系推進類似的工作,增加職業(yè)推薦的智能性等。
參見圖4,圖4顯示了本發(fā)明基于Louvain算法的社區(qū)發(fā)現(xiàn)系統(tǒng)100的第一實施例,其包括:
初始化模塊1,用于初始化社區(qū),把每個節(jié)點作為一個社區(qū);
第一構(gòu)建模塊2,用于將每個節(jié)點依次分配到每個鄰居節(jié)點所在社區(qū)以構(gòu)建社區(qū)圖形;
第二構(gòu)建模塊3,用于根據(jù)社區(qū)圖形把社區(qū)看作一個節(jié)點,重新構(gòu)建社區(qū)圖形;
輸出模塊4,用于當(dāng)所有狀態(tài)穩(wěn)定時,輸出結(jié)果。
如圖5所示,所述第一構(gòu)建模塊2包括:
分配單元21,用于將每個節(jié)點,依次嘗試分配到每個鄰居節(jié)點所在社區(qū);優(yōu)選地,采用輪詢方式進行分配。
計算單元22,用于計算分配前與分配后的模塊度變化量;其中,分配前與分配后的模塊度變化量是指分配前模塊度與分配后模塊度之差。
提取單元23,用于提取模塊度變化量的最大值;
圖形單元24,用于若模塊度變化量的最大值大于0,則將節(jié)點分配到該社區(qū),直到所有節(jié)點不再變化,形成社區(qū)圖形。
如圖6所示,所述第二構(gòu)建模塊3包括:
第一轉(zhuǎn)化單元31,用于把社區(qū)內(nèi)節(jié)點度數(shù)和,轉(zhuǎn)化為新節(jié)點到自己的環(huán)路的權(quán)重;
第二轉(zhuǎn)化單元32,把社區(qū)間的邊權(quán)重轉(zhuǎn)化為新節(jié)點間的邊權(quán)重。
參見圖7,圖7顯示了本發(fā)明基于Louvain算法的社區(qū)發(fā)現(xiàn)系統(tǒng)的第二實施例,與圖4所示的第一實施例不同的是,本實施例中所述基于Louvain算法的社區(qū)發(fā)現(xiàn)系統(tǒng)還包括壓縮模塊5,所述壓縮模塊5用于壓縮社區(qū)圖形。優(yōu)選地,壓縮模塊5通過Python方式實現(xiàn)降維及類聚,從而實現(xiàn)社區(qū)圖形的壓縮。
由上可知,本發(fā)明具有以下有益效果:
1、本發(fā)明采用基于Louvain算法實現(xiàn)社區(qū)發(fā)現(xiàn),針對社區(qū)中的節(jié)點進行模塊度的關(guān)聯(lián)分析;
2、本發(fā)明采用兩層計算。開始通過模塊度變化量對每個節(jié)點進行社區(qū)劃分,然后針對劃分后形成的社區(qū),做圖形壓縮,從而再次進行社區(qū)的模塊度和邊權(quán)重分析并進行社區(qū)劃分,直到所有狀態(tài)穩(wěn)定,再輸出結(jié)果,對社區(qū)的發(fā)現(xiàn)更加深入。
3、由于節(jié)點具有隨機性,本發(fā)明沒有使用節(jié)點的特征向量對節(jié)點進行相似度判斷,而是直接對節(jié)點進行向量及模塊度的關(guān)聯(lián),更為準(zhǔn)確。
以上所述是本發(fā)明的優(yōu)選實施方式,應(yīng)當(dāng)指出,對于本技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明原理的前提下,還可以做出若干改進和潤飾,這些改進和潤飾也視為本發(fā)明的保護范圍。
總結(jié)
以上是生活随笔為你收集整理的louvain算法python_一种基于Louvain算法的社区发现方法及系统与流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最长非降子序列(动态规划dp dynam
- 下一篇: 抢火车票这个事吧,其实我也能做!(pyt