SNS分析
SNS上で、あるユーザーが自分の友達の友達の中で最も人気がある人を見つけるために、ネットワーク分析を行いたいと考えています。
この問題を解決するために、与えられたSNSグラフ内で、指定されたユーザーの友達の友達の中で最も人気がある人を見つける関数を実装してください。
解法
以下は、この問題に対するNetworkXによる実装例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| import networkx as nx
def find_most_popular_friend_of_friends(G, user): """ 指定されたユーザーの友達の友達の中で最も人気がある人を見つける関数
Parameters ---------- G : NetworkXのグラフオブジェクト SNSグラフ user : ノード 検索対象のユーザー
Returns ------- ノード 最も人気があるユーザー """ friends = set(nx.neighbors(G, user))
friends_of_friends = set() for friend in friends: friends_of_friends.update(nx.neighbors(G, friend))
friends_of_friends.discard(user) friends_of_friends.difference_update(friends)
degrees = G.degree(friends_of_friends)
sorted_degrees = sorted(degrees, key=lambda x: x[1], reverse=True)
return sorted_degrees[0][0]
|
この関数は、与えられたSNSグラフ内で指定されたユーザーの友達の友達の中で最も人気がある人を見つけるために使用できます。
与えられたユーザーの友達の友達を取得し、各ノードの次数を計算して、次数が最大のノードを返します。
動作確認
テスト用のデータを作成して、上記の関数を使用して解決してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| import networkx as nx
G = nx.Graph() G.add_edges_from([ ('Alice', 'Bob'), ('Alice', 'Charlie'), ('Bob', 'David'), ('Bob', 'Eve'), ('Charlie', 'David'), ('Charlie', 'Frank'), ('David', 'Eve'), ('Eve', 'Frank'), ('Eve', 'Grace'), ('Frank', 'Grace') ])
most_popular_friend_of_friends = find_most_popular_friend_of_friends(G, 'Alice')
print(f"Most popular friend of friends of Alice: {most_popular_friend_of_friends}")
|
このコードでは、GというSNSグラフを作成し、find_most_popular_friend_of_friends関数を使用して、’Alice’の友達の友達で最も人気がある人を見つけています。
出力結果は以下の通りになります。
[実行結果]
Most popular friend of friends of Alice: Grace
与えられたSNSグラフ内で指定されたユーザーの友達の友達の中で最も人気がある人を見つけることができました。