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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > 循环神经网络 >内容正文

循环神经网络

MLW模型的matlab实现(已修复)

發(fā)布時間:2023/12/20 循环神经网络 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MLW模型的matlab实现(已修复) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原作者:???????(5條消息) 復雜網絡多局域世界模型matlab算法實現_乾三連的博客-CSDN博客_多局域世界模型https://blog.csdn.net/qq_36434958/article/details/102770052MLW模型,即復雜網絡多局域世界模型(the Multi Local Worlds Model)是一個具有度指數分布特性的小世界模型。比起B(yǎng)A等其他小世界模型,MLW模型最大的優(yōu)點是具有較高的聚類系數,而高聚類系數是多數現實小世界網絡的特征。因此,MLW模型能較好地模擬現實中的小世界網絡。

MLW模型的生成過程為數個步驟的迭代,最終生成數個互相有較少連接的局域世界,局域世界內的節(jié)點之間的連邊則較多。具體的步驟可以參考上面貼出來的原作者的文章,這里不具體闡述。

原作者貼出的代碼存在較多的bug,我已將其修復,現于此貼出以便諸位可直接使用。

這段代碼需要一個matlab app的支持(具體哪個我不記得了,總之如果到時候報缺少xxx的錯誤直接下載那個就可以了)。如果仍有bug(下載該app后仍無法運行),請告知我,我盡可能及時修正代碼!

clc,clearm=5;m0=8;e0=15;p=0.3;q=0.2;r=0.25;s=0.05;u=0.2;m1=3;m2=5;m3=4;m4=6;alpha=1;p=[p,q,r,s,u];n=m;pp=cumsum(p); %輪盤賭法選條件for i=1:mA{i}=generategraph(m0,e0); %產生初始的m個局域世界endnum(1:m)=m0; %此處先聲名一個num變量,num變量的1到m個元素都是m0,此處是為了存儲各個局域世界的節(jié)點個數Tno=[];Tuv=[]; %返回值初始化for i=1:400 % 迭代2000次ind=find(pp>=rand); % 輪盤賭法,此處返回一個索引向量,即大于隨機數rand的兩個累計概率值switch ind(1) % 索引到第一個大于累計概率值的對應索引,共有五種可能1,2,3,4,5。分別對應我們的五種可能case 1 %如果上面返回1就執(zhí)行這個操作n=n+1; %更新局域世界個數A{n}=generategraph(m0,e0); % 定義細胞對象A的第n個細胞數組num(n)=length(A{n}); %更新num變量,將新生成的這個局域小世界的節(jié)點個數加進去case 2 %如果上面返回2就執(zhí)行這個操作rn=randperm(n);%生成從1到n的整數構成的一個排列,排列是隨機的,因為我們需要隨機先挑一個局域世界k=rn(1);%索引rn向量的第一個元素相當于從從1到n中隨機抽一個數。從而實現從n個小世界中隨機挑一個的%功能。A{k}=addnode(A{k},m1,alpha);%使用我們前面寫的函數給局域小世界加點。num(k)=length(A{k}); %再次更新numcase 3 %如果上面返回3就執(zhí)行這個操作rn=randperm(n);k=rn(1); %隨機挑一個局域世界A{k}=addedge(A{k},m2,alpha) %執(zhí)行隨機加邊的操作,這一步不需要更新num,因為只是加邊,沒有加點case 4 rn=randperm(n);k=rn(1); %隨機挑選一個局域世界A{k}=deleteedge(A{k},m3,alpha); %隨機刪邊otherwise[no,uv]=addlongedge(A,m4,alpha) %在局域世界中隨機增加長程邊,此處返回由數對組成的兩個變量,%no是一個矩陣,有兩行元素,每一列的兩個元素對應每一次加邊的起點局域世界編號與終點局域世界編號。%uv同理,每一列對應的兩個元素分別對應起點局域世界內的加邊的起點節(jié)點的編號與終點局域世界加邊的終點%節(jié)點編號。Tno=[Tno,no];%每一次迭代后更新TnoTuv=[Tuv,uv];%每一次迭代后更新Tuvend %switch結束end %for循環(huán)結束B=blkdiag(A{:}); %將細胞對象A的所有鄰接矩陣按照對角線拼成一個大的鄰接矩陣num=[0,num]; %方便計算,如果不添加零的話對第一個局域世界在整個網絡中的加邊將會很麻煩,需要倒著索引。cnum=cumsum(num); %計算累加for i=1:length(Tno)%雖然大鄰接矩陣拼出來了,但是局域世界之間加的邊還沒有在這個鄰接矩陣里面加上,下面加邊u=cnum(Tno(1,i))+Tuv(1,i); %首先利用節(jié)點累加值定位到該局域世界的起點處,然后再在起點處上根據第二項地位到%具體位置v=cnum(Tno(2,i))+Tuv(2,i); %同理上面,找到要加的邊的終點在整個大網絡中的位置if (u ~= 0 && v ~= 0)B(u,v)=1;B(v,u)=1;%完成加邊endend %迭代所有值,完成加邊B=degreeaddedge(B); %調用前面編寫的函數,完成對度為0或者1的點隨機加邊B=Locworldconnect(B); %調用自己寫的函數完成對孤立局域世界之間的連接。function a=generategraph(m0,e0) if e0>m0*(m0-1)/2 %判斷輸入的參數是否有效,一個有m0個節(jié)點的網絡最多有m0*(m0-1)/2條邊,因此e0不可能大于這個數fprintf('輸入的m0,e0不匹配\n');return end a=zeros(m0, m0); %從這兒開始構造這個網絡的鄰接矩陣,用zeros函數產生m0Xm0階的元素全為零的矩陣 ra = rand(m0, m0); %用rand函數生成m0xmo階的元素全為0-1之間隨機數的矩陣 ra = tril(ra); %用tril函數提取ra矩陣的下三角部分 ra([1:m0+1:end])=0; %將下三角矩陣的對角線元素全部改為0,因為鄰接矩陣的對角線元素必為0 [sra,indc]=sort(nonzeros(ra),'descend'); %此處nonzeros返回一個向量,這個向量是上一步矩陣所有元素按照列堆疊構成的,然后對這個向量按照降序排序 p=sra(e0); %選定前e0條邊所對應的最小的概率,小于這個概率的不予保留,生成e0條邊 a(ra>=p)=1; a=a+a';endfunction b=addnode(a,m,alpha);%a為輸入的矩陣,m為建立邊的條數,alpha吸引力 b=a;n=length(a); %n為節(jié)點個數 if m>nreturn %輸入數據不匹配,因為建立邊的個數不可能大于整個局域世界中的節(jié)點數 end for i=1:m %開始循環(huán)迭代生成m個點LP=(sum(b)+alpha)/sum(sum(b)+alpha); %計算所有點的連接的概率pp=cumsum(LP); %計算累積概率ind=find(pp>=rand); %依概率與點相連b(n+1,ind(1))=1;b(ind(1),n+1)=1; end endfunction b=addedge(a,m,alpha); %a為輸入的矩陣,m為加邊的個數,alpha為調節(jié)的系數b=a;n=length(a)for i=1:mdeg=sum(b); %計算當前網絡各節(jié)點的度,此處返回一個向量LP=(deg+alpha)/sum(deg+alpha); %計算到各節(jié)點的連接概率pp=cumsum(LP);rnum=randperm(m); %產生一個全排列,即元素是1到m的整數,但是順序是亂的,此處是為了隨機設定邊的一個起點flag=1; %初始加邊的對象while flag<=n&deg(rnum(flag))==n-1 %如果當前節(jié)點已經有n-1條邊,那么是加不了的flag=flag+1;endif flag==n+1,continue,endind=find(pp>=rand);if rnum(flag)~=ind(1)&b(rnum(flag),ind(1))==0b(rnum(flag),ind(1))=1;b(ind(1),rnum(flag))=1endend endfunction b=deleteedge(a,m,alpha); b=a;n=length(a); for i=1:mdeg=sum(b)LP=(1-(deg+alpha)/sum(deg+alpha))/(n-1); %計算各節(jié)點對應的刪除概率pp=cumsum(LP);rnum=randperm(n);flag=1;while flag<n & deg(rnum(flag))==0 %當前為孤立點取下一個點flag=flag+1;endif flag==n& deg(rnum(flag))==0continueendind=find(pp>=rand);if b(rnum(flag),ind(1))==1b(rnum(flag),ind(1))=0;b(ind(1),rnum(flag))=0; %刪除原邊end end endfunction[no,uv]=addlongedge(A,m,alpha);%A為所有局域世界鄰接矩陣的細胞數組,A{1}為第一個鄰接矩陣,m為加邊的條數;no為矩陣,每個列對應兩個局域世界存在連邊,連邊編號存放在矩陣uv的對應列中。n=length(A); %局域世界的個數no=[];uv=[];for i=1:mrn=randperm(n); %隨機抽局域世界排列no=[no,rn(1:2)']; %這個排列的前個元素分別是起點局域世界和終點局域世界a=A{rn(1)};b=A{rn(2)} %分別挑出兩個局域世界的鄰接矩陣p1=(sum(a)+alpha)/sum(sum(a)+alpha);pp1=cumsum(p1);p2=(1-(sum(b)+alpha)/sum(sum(b)+alpha))/length(b)-1pp2=cumsum(p2);ind1=find(pp1>=rand);ind2=find(pp2>=rand);if ~isempty(ind2)uv=[uv,[ind1(1);ind2(1)]]; elseuv=[uv,[ind1(1);0]]; endend endfunction B=degreeaddedge(A); %輸入參數A是存在孤立點的網絡的鄰接矩陣,輸出B是加邊之后的鄰接矩陣B=A;while any(sum(B)<=1) %sum(B)得到當前鄰接矩陣的所有節(jié)點的度,如果有任何一個節(jié)點的度小于或者等于1%就執(zhí)行操作deg=sum(B);p=(deg+1)/sum(deg+1); %算出當前局域世界網絡所有節(jié)點的加邊概率pp=cumsum(p); %輪盤賭法選邊k=find(deg<=1); %找出所有度小于或者等于1的節(jié)點編號for i=kind=find(pp>=rand);jj=ind(1); %jj為用輪盤賭法選擇的節(jié)點地址if jj~=i %確保不會自己連到自己B(i,jj)=1;B(jj,i)=1;endendendendfunction B=Locworldconnect(A);C=tril(A);C=sparse(C);%生成稀疏矩陣[num,label]=graphconncomp(C,'directed',0); %這個函數是matlab工具箱里的函數,用于計算無向圖連通分量.此處介紹%一下什么是連通分量,每一個連通分量就是點的集合,每個集合內部的點都能到達同樣在集合中的點,這個函數的目的%就是為了把孤立的小世界挑出來,此函數返回兩個參數第一個參數num表示這個圖中有多少個連通分量。第二個label表%示每個節(jié)點的所屬的分量編號。if num==1 %如果不存在孤立的小世界,所有的點都連接成一個大的網絡,函數循環(huán)結束,直接返回BB==A;returnendfor i=1:num %對我們得到的num個連通分量開始進行迭代n{i}=find(label==i); %前面label得到的分量編號雖然值不同,但是所有的點都混在一起了,此處將屬于第i個連通%分量節(jié)點的編號挑出來endB=A;deg=sum(A); %計算各節(jié)點的度for i=1:nump1=(deg(n{i})+1)/sum(deg(n{i})+1); %首先把所有屬于第i個分支節(jié)點的節(jié)點的編號挑出來,利用deg()索引到這%這些節(jié)點的度,進而計算連接概率pp1=cumsum(p1); %計算累積概率,輪盤賭法選點又開始了ii=(i+1)*(i+1<=num)+mod(i+1,num)*(i+1>num); %此處是為了實現依次相連,第i個分支連接到第i+1個分支,之%所以這句寫的這么麻煩是因為到最后一個分支num時,沒有下一個分支和他相連,而是需要和第一個分支首尾相連形成%一個環(huán),所以引入(i+1<=num)做判斷是否循環(huán)到了最后一個,注意此處的運算順序,不同于其他語言,這里%加法是優(yōu)先于邏輯判斷的,所以此處返回的是表示布爾值的0或者1.然后用mod取余數1實現定位到第一個分支。p2=(deg(n{ii})+1)/sum(deg(n{ii})+1); %把所有屬于第i+1個節(jié)點的度給挑出來pp2=cumsum(p2); %計算累積概率,輪盤賭法ind1=find(pp1>=rand); %利用概率定位連邊起點ind2=find(pp2>=rand); %利用概率定位連邊終點B(n{i}(ind1(1)),n{ii}(ind2(1)))=1; %進行連邊操作B(n{ii}(ind2(1)),n{i}(ind1(1)))=1;end end

總結

以上是生活随笔為你收集整理的MLW模型的matlab实现(已修复)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。