MATLAB Graph Object(2): 建立關係網
MATLAB中表達圖的方法有兩種,無向圖graph和有向圖digraph。在這個項目中我們想建立專欄和關注者,以及關注者和其他關注者間的模型,因此使用有向圖digraph。
>>subsG = digraph();n
首先我們利用這篇文章中介紹的造福滑鼠點點族的方式來讀入數據。
將讀入的數據放入一個表中,表的第一列為專欄的關注者,第二列為專欄關注者的關注者。隨後當然是根據這篇文章里的方法生成一個MATLAB函數(importfile),以便之後的操作啦。
>>data = importfile(relation);n>>subscribers = data.Subscribers;n
subscribers每個元素是這樣的,有用戶的id, 名字,和關注者的數量
8c479214206c3f2664df29a000a0bf95,Yu Jiang,253n
我們先對載入的數據進行下處理,將id,name,和followerCount分離
>>str = cellfun(@(x)strsplit(x,,),subscribers,UniformOutput,false);n>>[ids,names,followerCount] = cellfun(@(x)deal(x{:}),str,UniformOutput,false);n
我們以專欄的第一位關注者,也是專欄的作者之一的@Yu Jiang為例。對於每個知乎上的用戶,名字可以有重複,但是id是唯一的。
首先在digraph中加入一個節點,以唯一標識id作為節點的標識
>>subsG = subsG.addnode(ids{1});nnsubsG = nn digraph with properties:nn Edges: [0×1 table]n Nodes: [1×1 table]n
我們的關係圖就建立起來了,然而只有一個節點,沒什麼意思。下面來給我們的作者介紹點朋友。
首先我們獲取關注者,關注者的格式是這樣的
uid,name,followercount;uid,name,followercount;....n
我們用分號區分每個關注者,然後就是做和處理專欄關注者的時候類似的操作,將每個人的id,name,和followerCount分離
>>followers = data.Followers{1}; %第一個專欄關注者的聽眾們n>>str = strsplit(followers,;); %分割每一個聽眾n>>splitstr = cellfun(@(x)strsplit(x,,),str,UniformOutput,false); %分割id, name, followerCountn>>[fids,fnames,ffollowerCount] = cellfun(@(x)deal(x{:}),splitstr,UniformOutput,false); %賦值n
然後建立關係
>>subsG = subsG.addedge(fids,ids{1}); %由fids指向ids{1}n
搞定!讓我們來看看關係圖
>>plot(subsG)n
是緊密團結在以@Yu Jiang老師為中心的各個知乎用戶。
沒有問題,接下來就是對每個專欄的關注者做相同的操作啦。(以下省去2個for循環
看看最後的關係圖,共有近5萬個知乎用戶,建立了近6萬個關係
subsG = nn digraph with properties:nn Edges: [56939x1 table]n Nodes: [47345x1 table]n
從這裡例子大家可以發現,由於graph object的引入,我們大部分操作都是對數據的文本處理,而建立關係圖的操作其實只有兩行。
>>addnoden>>addedgen
Graph object的引入不僅使得在MATLAB里建立網路變得容易了,其他圍繞graph的操作也變得非常方便。
下一篇myc將介紹如何將關係圖可視化,畢竟很多人用MATLAB就是為了畫圖嗎(並不是
推薦閱讀:
※matlab怎樣將有NaN的數據刪除整行?謝謝
※MATLAB和物聯網連載6: Thingspeak Tutorial 5
※想用別人的實驗來算東西,但沒有他的數據,只有文獻里的圖線怎麼辦?
※MATLAB神經網路(一):BP神經網路