ویژگی تصویر

آشنایی با کتابخانه igraph در پایتون

  /  پایتون   /  کتابخانه igraph در پایتون
بنر تبلیغاتی الف

کتابخانه igraph یک ابزار قدرتمند و سریع برای تحلیل و مدل‌سازی گراف و شبکه در پایتون است. این کتابخانه امکانات متنوعی برای ساخت، پردازش، تحلیل مرکزیّت، کشف اجتماع (community detection)، مسیر‌یابی کوتاه‌ترین‌ها و نمایش گراف‌ها فراهم می‌کند. igraph برای کار با گراف‌های بزرگ بهینه شده و عملکرد آن در بسیاری از موارد بهتر از کتابخانه‌های مبتنی بر پایتون خالص است.

نصب و شروع سریع

نصب igraph معمولاً از طریق pip یا conda انجام می‌شود. در برخی سیستم‌ها لازم است بسته‌های سیستمی مانند cairo برای ترسیم نصب شوند.

pip install python-igraph
# یا با conda
conda install -c conda-forge python-igraph

دستور بالا igraph را نصب می‌کند. در صورت نیاز به ترسیم پیشرفته ممکن است به پکیج‌های تکمیلی نیاز داشته باشید.

ساختار پایه‌ای گراف در igraph

در igraph می‌توان گراف‌های جهت‌دار یا بدون جهت ساخت، راس‌ها و یال‌ها را اضافه کرد و به ویژگی‌ها (attributes) آنها دسترسی داشت.

from igraph import Graph

# ساخت گراف نا‌جهت‌دار با 5 راس
g = Graph(n=5, edges=[(0,1),(1,2),(2,3),(3,4),(4,0)])
# افزودن ویژگی به راس‌ها
g.vs["name"] = ["A","B","C","D","E"]
# افزودن وزن به یال‌ها
g.es["weight"] = [1,2,1,3,2]
print(g.summary())

کد بالا یک گراف ساده با 5 راس و یال‌های مشخص می‌سازد، سپس نام راس‌ها و وزن یال‌ها را تعریف می‌کند و خلاصه‌ای از گراف چاپ می‌کند. vs مخفف vertex sequence و es مخفف edge sequence است که برای دسترسی به ویژگی‌ها استفاده می‌شوند.

محاسبه شاخص‌های مرکزیّت

یکی از کاربردهای رایج igraph محاسبه معیارهای مرکزیّت مثل درجه، بینابینی (betweenness) و نزدیکی (closeness) است.

# محاسبه درجات و بینابینی
degrees = g.degree()
betw = g.betweenness()
closeness = g.closeness()
print("Degrees:", degrees)
print("Betweenness:", betw)
print("Closeness:", closeness)

در این مثال توزیع درجه و مقادیر بینابینی و نزدیکی راس‌ها محاسبه و چاپ می‌شوند. این توابع روی گراف کامل و با پیچیدگی مناسب اجرا می‌شوند و برای گراف‌های بزرگ عملکرد خوبی دارند.

کشف اجتماع (Community Detection)

igraph چندین الگوریتم برای تشخیص اجتماع ارائه می‌دهد؛ از جمله Walktrap، Louvain و Infomap. در مثال زیر از الگوریتم Walktrap استفاده می‌کنیم.

# الگوریتم Walktrap برای کشف اجتماع
walktrap = g.community_walktrap(weights="weight", steps=4)
clusters = walktrap.as_clustering()
print("Number of clusters:", len(clusters))
for i, c in enumerate(clusters):
    print(i, [g.vs[idx]["name"] for idx in c])

در این کد، ابتدا شیء الگوریتم walktrap ساخته می‌شود و سپس با متد as_clustering خوشه‌ها استخراج می‌گردند. نام راس‌ها در هر خوشه چاپ می‌شود.

مسیریابی و کوتاه‌ترین مسیرها

توابع متعددی برای محاسبه کوتاه‌ترین مسیرها وجود دارد، از جمله dijkstra برای وزن‌دار. مثال زیر فاصله بین همه جفت راس‌ها را محاسبه می‌کند.

# ماتریس فواصل کوتاه‌ترین مسیرها (با وزن)
dist_matrix = g.shortest_paths(weight="weight")
print(dist_matrix)

تابع shortest_paths برای گراف‌های وزن‌دار و بدون‌وزن قابل استفاده است و ماتریسی از فواصل را برمی‌گرداند.

ترسیم گراف

igraph قابلیت‌های ترسیمی دارد، اما برای ترسیم‌های پیچیده‌تر معمولاً از matplotlib یا cairo استفاده می‌شود. در اینجا یک مثال ساده با layout از پیش‌ساخته نمایش داده شده است.

import matplotlib.pyplot as plt
from igraph import plot

layout = g.layout("fr")  # Fruchterman-Reingold layout
plot(g, layout=layout, vertex_label=g.vs["name"], bbox=(300,300), margin=20)

کد بالا با استفاده از layout فرانشترمن-رینگولد، گراف را رسم می‌کند و برچسب راس‌ها را نمایش می‌دهد. برای انتشار تصویری با کیفیت بالا می‌توان از پارامترهای بیشتری در plot استفاده کرد.

خواندن و نوشتن فرمت‌های مختلف

igraph از فرمت‌های متنوعی مانند GraphML، GML، Pajek و edge list پشتیبانی می‌کند که اجازه می‌دهد گراف‌ها را بین ابزارها جابه‌جا کنید.

# ذخیره و بارگذاری GraphML
g.write_graphml("graph.graphml")
g2 = Graph.Read_GraphML("graph.graphml")

این مثال گراف را در قالب GraphML ذخیره و دوباره بارگذاری می‌کند، که برای تبادل داده با نرم‌افزارهایی مانند Gephi مفید است.

بهینه‌سازی و نکات اجرایی

  • برای گراف‌های بزرگ از توابع داخلی igraph استفاده کنید و از حلقه‌های پایتون برای پیمایش تمام یال‌ها یا راس‌ها پرهیز کنید.
  • هنگام نیاز به محاسبات پیچیده بر روی ویژگی‌ها، از عملگرهای برداری (vectorized) روی vs و es بهره ببرید؛ این کار حافظه و زمان را کاهش می‌دهد.
  • در مواقعی که نیاز به بالاترین کارایی دارید، کتابخانه‌هایی مانند graph-tool (اگر قابل نصب باشد) ممکن است سریع‌تر باشند، اما igraph تعادلی خوب بین کارایی، سادگی و قابلیت نصب دارد.

نمونه‌ کاربردهای عملی

  • تحلیل شبکه‌های اجتماعی: تشخیص نقش‌های کلیدی با centrality، شناسایی اجتماع‌ها برای تحلیل اجتماعات کاربری.
  • زیست‌محیطی و زیست‌شناسی: تحلیل شبکه‌های پروتئینی و مسیرهای متابولیکی.
  • تحلیل ترافیک اینترنت و شبکه‌های مخابرات: پیدا کردن گلوگاه‌ها و مسیرهای بحرانی.
  • تحقیقات علوم انسانی دیجیتال: تحلیل هم‌استنادی واژه‌ها یا شبکه‌های استناد مقاله‌ها.

مقایسه سریع با NetworkX و دیگر ابزارها

معیارigraphNetworkXgraph-tool
سرعتعالی برای گراف‌های بزرگمتوسط، کندتر در مقیاس بزرگبسیار سریع اما سخت نصب
سهولت نصبخوبعالیپیچیده
قابلیت‌هاکامل برای تحلیل و خوشه‌بندیکتابخانه عمومی‌تر و انعطاف‌پذیرتمرکز بر کارایی

نمونه بهینه‌سازی: اجتناب از حلقه‌ها

# نادرست: استفاده از حلقه برای گرفتن نام راس‌ها
names = []
for v in g.vs:
    names.append(v["name"])

# بهینه: استفاده از ویژگی برداری
names_opt = g.vs["name"]

در مثال بالا، نسخه بهینه از قابلیت برداری igraph استفاده می‌کند که هم ساده‌تر و هم سریع‌تر است.

منابع و ادامه یادگیری

  • مستندات رسمی igraph: راهنمای توابع و مثال‌ها
  • مقالات پژوهشی در حوزه کشف اجتماع و معیارهای مرکزیّت
  • نمونه‌های عملی در گیت‌هاب و پروژه‌های متن‌باز

جمع‌بندی: igraph کتابخانه‌ای مناسب و سریع برای تحلیل شبکه در پایتون است که برای پردازش گراف‌های بزرگ و انجام تحلیل‌های پیشرفته گزینه‌ای مطلوب به شمار می‌آید. با یادگیری روش‌های برداری و توابع داخلی می‌توان تحلیل‌های پیچیده را با کارایی بالا انجام داد.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: