標籤:

MATLAB Graph Object(2): 建立關係網

我們在上一篇中介紹了如何爬知乎拿數據,這次myc就來給大家展示下如何使用在R2015b中全新引入的graph object來建立關係網。

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神經網路

TAG:图论 | MATLAB |