<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>데싸(Data Science) 노트</title>
    <link>https://data-science-note.tistory.com/</link>
    <description>데이터 분석가의
데이터 사이언스(Data science) 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Mon, 15 Jun 2026 09:16:04 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>백관구</managingEditor>
    <image>
      <title>데싸(Data Science) 노트</title>
      <url>https://tistory1.daumcdn.net/tistory/4061543/attach/a54b333089b545999725318be32257ac</url>
      <link>https://data-science-note.tistory.com</link>
    </image>
    <item>
      <title>[그래프 ML] 그래프 분해(Graph Factorization) - 파이썬 GEM (Graph Embedding Methods)</title>
      <link>https://data-science-note.tistory.com/99</link>
      <description>&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;※ 출처 : 그래프 머신러닝 (클라우디오 스타밀레 외, 김기성&amp;middot;장기식&lt;span&gt;&amp;nbsp;&lt;/span&gt;옮김)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;book-toc&quot;&gt;
  &lt;p&gt;목차&lt;/p&gt;
  &lt;ul id=&quot;toc_list&quot;&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 그래프 분해(Graph Factorization)란&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.1. 개념&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 행렬 분해를 그래프 데이터, 특히 &lt;b&gt;그래프의 인접 행렬에 적용&lt;/b&gt;한 개념입니다. 그래프 분해를 통해 &lt;b&gt;그래프 구조를 저차원의 잠재 공간으로 투영&lt;/b&gt;(projection)하는 것을 목표로 합니다. 주어진 그래프 $G$를 작은 차원의 두 행렬 &quot;&lt;b&gt;노드 임베딩 행렬&lt;/b&gt; $F$&quot;와 &quot;&lt;b&gt;잠재 그래프 구조 행렬&lt;/b&gt; $H$&quot;의 곱으로 근사합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$G \approx F \times H$$&lt;/p&gt;
&lt;figure id=&quot;og_1712038141811&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[그래프 ML] 행렬 분해(Matrix Factorization) - 비음수 행렬 분해(NMF), 특이값 분해(SVD), 주성분 분석(PCA)&quot; data-og-description=&quot;HTML 삽입 미리보기할 수 없는 소스 ※ 출처 : 그래프 머신러닝 (클라우디오 스타밀레 외, 김기성&amp;middot;장기식 옮김) 1. 행렬 분해(Matrix Factorization)란 1.1. 개념 $$X \approx S \times A$$ 대규모 행렬 데이터를 &quot; data-og-host=&quot;data-science-note.tistory.com&quot; data-og-source-url=&quot;https://data-science-note.tistory.com/98&quot; data-og-url=&quot;https://data-science-note.tistory.com/98&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dPP0p0/hyVJXS0osK/yQyfiMkDAWveJDPF0sxdpk/img.png?width=800&amp;amp;height=269&amp;amp;face=0_0_800_269,https://scrap.kakaocdn.net/dn/cxGOD0/hyVGTkp1i1/mzk5Sv0tgd3cpjegWwzJPK/img.png?width=800&amp;amp;height=269&amp;amp;face=0_0_800_269,https://scrap.kakaocdn.net/dn/b8NKRD/hyVGRGTjDF/QxxjNKrJkSIevX3CVrEUWK/img.png?width=1209&amp;amp;height=407&amp;amp;face=0_0_1209_407&quot;&gt;&lt;a href=&quot;https://data-science-note.tistory.com/98&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://data-science-note.tistory.com/98&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dPP0p0/hyVJXS0osK/yQyfiMkDAWveJDPF0sxdpk/img.png?width=800&amp;amp;height=269&amp;amp;face=0_0_800_269,https://scrap.kakaocdn.net/dn/cxGOD0/hyVGTkp1i1/mzk5Sv0tgd3cpjegWwzJPK/img.png?width=800&amp;amp;height=269&amp;amp;face=0_0_800_269,https://scrap.kakaocdn.net/dn/b8NKRD/hyVGRGTjDF/QxxjNKrJkSIevX3CVrEUWK/img.png?width=1209&amp;amp;height=407&amp;amp;face=0_0_1209_407');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[그래프 ML] 행렬 분해(Matrix Factorization) - 비음수 행렬 분해(NMF), 특이값 분해(SVD), 주성분 분석(PCA)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;HTML 삽입 미리보기할 수 없는 소스 ※ 출처 : 그래프 머신러닝 (클라우디오 스타밀레 외, 김기성&amp;middot;장기식 옮김) 1. 행렬 분해(Matrix Factorization)란 1.1. 개념 $$X \approx S \times A$$ 대규모 행렬 데이터를&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;data-science-note.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.2. 활용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 행렬 분해와 마찬가지로 그래프 분해를 통해 그래프의 &lt;b&gt;노드들을 저차원의 잠재 공간에 임베딩&lt;/b&gt;할 수 있고, 동시에 그래프의 &lt;b&gt;구조적 패턴&lt;/b&gt;을 포착할 수 있습니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 38.721%; text-align: center;&quot;&gt;&lt;b&gt;분야&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 61.279%; text-align: center;&quot;&gt;&lt;b&gt;활용&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 38.721%; text-align: center;&quot;&gt;&lt;b&gt;네트워크 분석&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 61.279%;&quot;&gt;- 통신 네트워크, 소셜 네트워크 구조 분석&lt;br /&gt;- 커뮤니티 구조, 중심성, 연결성 파악&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 38.721%; text-align: center;&quot;&gt;&lt;b&gt;데이터 마이닝 &amp;amp; 패턴 인식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 61.279%;&quot;&gt;- 대규모 데이터에서 주요 패턴, 구조 발견&lt;br /&gt;- 데이터 클러스터링, 유사성 측정, 이상 탐지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 38.721%; text-align: center;&quot;&gt;&lt;b&gt;생물 정보학&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 61.279%;&quot;&gt;- 단백질 구조, 유전자 네트워크, 대사 경로 분석&lt;br /&gt;- 생물학적 네트워크의 모듈성, 중요 노드 식별, 기능 예측&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 38.721%; text-align: center;&quot;&gt;&lt;b&gt;웹 마이닝 &amp;amp; 링크 분석&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 61.279%;&quot;&gt;- 웹 페이지와 하이퍼링크 구조를 그래프로 표현하고 분석&lt;br /&gt;- 페이지 랭킹, 커뮤니티 탐색, 권위 페이지 탐색&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 38.721%; text-align: center;&quot;&gt;&lt;b&gt;정보 검색 &amp;amp; 추천 시스템&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 61.279%;&quot;&gt;- 사용자와 아이템 간 관계를 그래프로 표현하고 분석&lt;br /&gt;- 협력 필터링, 관련 아이템 추천, 개별 맞춤화&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 파이썬 GEM (Graph Embedding Methods) 라이브러리&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 그래프 임베딩을 위한 파이썬 라이브러리로, 다양한 알고리즘을 구현하고 있어 효과적으로 그래프 데이터를 임베딩(벡터화) 할 수 있습니다. 임베딩과 관련한 알고리즘 외에도 평가 지표, 데이터 전처리, 시각화 툴을 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ GEM Paper&lt;/p&gt;
&lt;figure id=&quot;og_1712038178736&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;GEM: A Python package for graph embedding methods&quot; data-og-description=&quot;Goyal et al., (2018). GEM: A Python package for graph embedding methods . Journal of Open Source Software, 3(29), 876, https://doi.org/10.21105/joss.00876&quot; data-og-host=&quot;joss.theoj.org&quot; data-og-source-url=&quot;https://joss.theoj.org/papers/10.21105/joss.00876&quot; data-og-url=&quot;https://joss.theoj.org/papers/10.21105/joss.00876&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bydtqe/hyVJS5d5Yc/r8TeyJok6mcfck2ydTtSoK/img.jpg?width=2800&amp;amp;height=1300&amp;amp;face=0_0_2800_1300,https://scrap.kakaocdn.net/dn/eluAIj/hyVJZXAvUP/eFdZ6PXTqxrdKtSkgr51Uk/img.jpg?width=2800&amp;amp;height=1300&amp;amp;face=0_0_2800_1300&quot;&gt;&lt;a href=&quot;https://joss.theoj.org/papers/10.21105/joss.00876&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://joss.theoj.org/papers/10.21105/joss.00876&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bydtqe/hyVJS5d5Yc/r8TeyJok6mcfck2ydTtSoK/img.jpg?width=2800&amp;amp;height=1300&amp;amp;face=0_0_2800_1300,https://scrap.kakaocdn.net/dn/eluAIj/hyVJZXAvUP/eFdZ6PXTqxrdKtSkgr51Uk/img.jpg?width=2800&amp;amp;height=1300&amp;amp;face=0_0_2800_1300');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GEM: A Python package for graph embedding methods&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Goyal et al., (2018). GEM: A Python package for graph embedding methods . Journal of Open Source Software, 3(29), 876, https://doi.org/10.21105/joss.00876&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;joss.theoj.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ GEM GitHub&lt;/p&gt;
&lt;figure id=&quot;og_1712038207446&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - palash1992/GEM&quot; data-og-description=&quot;Contribute to palash1992/GEM development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/palash1992/GEM&quot; data-og-url=&quot;https://github.com/palash1992/GEM&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/gti4L/hyVJ09161b/d8OGrORT6YKmZ9gdsX4J8k/img.png?width=1200&amp;amp;height=600&amp;amp;face=967_153_1066_261&quot;&gt;&lt;a href=&quot;https://github.com/palash1992/GEM&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/palash1992/GEM&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/gti4L/hyVJ09161b/d8OGrORT6YKmZ9gdsX4J8k/img.png?width=1200&amp;amp;height=600&amp;amp;face=967_153_1066_261');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - palash1992/GEM&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Contribute to palash1992/GEM development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1. 설치&lt;/h3&gt;
&lt;pre id=&quot;code_1712037252725&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install git+https://github.com/palash1992/GEM.git&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.2. 주요 알고리즘&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 199px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 35px;&quot;&gt;
&lt;td style=&quot;width: 35.93%; text-align: center; height: 35px;&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://www.robots.ox.ac.uk/~az/lectures/ml/lle.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;LLE&lt;/a&gt;&lt;br /&gt;&lt;/b&gt;(Locally Linear Embedding)&lt;/td&gt;
&lt;td style=&quot;width: 64.07%; text-align: center; height: 35px;&quot;&gt;지역적으로 선형인 근사를 유지하는 임베딩 기법&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 35.93%; text-align: center; height: 20px;&quot;&gt;&lt;a href=&quot;https://yeolab.weebly.com/uploads/2/5/5/0/25509700/belkin_laplacian_2003.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;Laplacian Eigenmaps&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 64.07%; text-align: center; height: 20px;&quot;&gt;그래프 라플라시안 행렬의 고유벡터를 이용해 투영하는 비선형 임베딩 기법&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 35.93%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/40839.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;그래프 분해&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;(Graph Factorization)&lt;/td&gt;
&lt;td style=&quot;width: 64.07%; text-align: center; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 55px;&quot;&gt;
&lt;td style=&quot;width: 35.93%; text-align: center; height: 55px;&quot;&gt;&lt;a href=&quot;https://www.kdd.org/kdd2016/papers/files/rfp0184-ouA.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;고차원 근접 보존 임베딩&lt;br /&gt;&lt;/b&gt;&lt;/a&gt;(&lt;b&gt;HOPE&lt;/b&gt;; Higher-Order Proximity preserved Embedding)&lt;/td&gt;
&lt;td style=&quot;width: 64.07%; text-align: center; height: 55px;&quot;&gt;고유값 분해를 통해 그래프의 구조적 특성을 유지하는 임베딩 기법&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 52px;&quot;&gt;
&lt;td style=&quot;width: 35.93%; text-align: center; height: 52px;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;a href=&quot;https://www.kdd.org/kdd2016/papers/files/rfp0191-wangAemb.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;SDNE&lt;/a&gt;&lt;br /&gt;&lt;/b&gt;&lt;/b&gt;(Structural Deep Network Embedding)&lt;/td&gt;
&lt;td style=&quot;width: 64.07%; text-align: center; height: 52px;&quot;&gt;준지도 학습 기반으로 구조 및 특성 정보를 포함하는 임베딩 기법&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 35.93%; height: 20px; text-align: center;&quot;&gt;&lt;a href=&quot;https://www.kdd.org/kdd2016/papers/files/rfp0218-groverA.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;Node2Vec&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 64.07%; height: 20px; text-align: center;&quot;&gt;노드 시퀀스에 기반한 스킵그램 모델을 활용하는 임베딩 기법&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.3. 예제 : 그래프 분해(Graph Factorization)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;① 예제 그래프 생성&lt;/p&gt;
&lt;pre id=&quot;code_1712041331082&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import networkx as nx

G = nx.barbell_graph(m1=10, m2=4)  # 예제 그래프
nx.draw(G, with_labels=True)  # 그래프 시각화&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;499&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AESVw/btsGjE9Fb0W/ltvu1J4ui7Erem9p2oiUx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AESVw/btsGjE9Fb0W/ltvu1J4ui7Erem9p2oiUx1/img.png&quot; data-alt=&quot;예제 그래프 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AESVw/btsGjE9Fb0W/ltvu1J4ui7Erem9p2oiUx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAESVw%2FbtsGjE9Fb0W%2Fltvu1J4ui7Erem9p2oiUx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;454&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;499&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;예제 그래프 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;② 그래프 임베딩 학습 및 실행&lt;/p&gt;
&lt;pre id=&quot;code_1712041965315&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from gem.embedding.gf import GraphFactorization

gf = GraphFactorization(d=2,  # 임베딩 차원
                        eta=1e-4,  # 확률적 경사 하강법(SGD; Stochastic Gradient Descent)의 학습률
                        regu=0.7,  # 가중치 크기에 대한 정규화 계수
                        max_iter=10000,  # SGD 최대 반복 횟수
                        data_set=None)
# 입력 그래프의 노드 임베딩 연산
gf.learn_embedding(G)
embeddings = gf.get_embedding()
print(&quot;그래프 임베딩 크기:&quot;, embeddings.shape)&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;그래프 임베딩 크기: (24, 2)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;③ 임베딩 결과 시각화&lt;/p&gt;
&lt;pre id=&quot;code_1712042430738&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import matplotlib.pyplot as plt

fig, sub = plt.subplots(figsize=(5, 5))
for i, V in enumerate(embeddings):
    v0, v1 = V[0], V[1]
    sub.scatter(v0, v1, s=200)
    sub.annotate(str(i), (v0, v1), fontsize=10, ha=&quot;center&quot;, va=&quot;center&quot;)
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btmcSx/btsGgzISUy4/7R4m6zzGCoebOqSa0cTEsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btmcSx/btsGgzISUy4/7R4m6zzGCoebOqSa0cTEsk/img.png&quot; data-alt=&quot;그래프 분해 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btmcSx/btsGgzISUy4/7R4m6zzGCoebOqSa0cTEsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtmcSx%2FbtsGgzISUy4%2F7R4m6zzGCoebOqSa0cTEsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;494&quot; height=&quot;428&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그래프 분해 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>인공지능/그래프</category>
      <category>gem</category>
      <category>그래프</category>
      <category>그래프분해</category>
      <category>머신러닝</category>
      <category>파이썬</category>
      <author>백관구</author>
      <guid isPermaLink="true">https://data-science-note.tistory.com/99</guid>
      <comments>https://data-science-note.tistory.com/99#entry99comment</comments>
      <pubDate>Tue, 2 Apr 2024 17:36:39 +0900</pubDate>
    </item>
    <item>
      <title>[그래프 ML] 행렬 분해(Matrix Factorization) - 비음수 행렬 분해(NMF), 특이값 분해(SVD), 주성분 분석(PCA)</title>
      <link>https://data-science-note.tistory.com/98</link>
      <description>&lt;div class=&quot;book-toc&quot;&gt;
  &lt;p&gt;목차&lt;/p&gt;
  &lt;ul id=&quot;toc_list&quot;&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;※ 출처 : 그래프 머신러닝 (클라우디오 스타밀레 외, 김기성&amp;middot;장기식&lt;span&gt;&amp;nbsp;&lt;/span&gt;옮김)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 행렬 분해(Matrix Factorization)란&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.1. 개념&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$X \approx S \times A$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 대규모 행렬 데이터를 두 개 이상의 작은 행렬들의 곱으로 나타내는 것을 말합니다. 일반적으로 &lt;b&gt;원본 행렬 $X$를 원천 행렬(source matrix) $S$와 기여도 행렬(abundance matrix) $A$의 곱으로 근사&lt;/b&gt;합니다. 여기서 $S$는 데이터를 구성하는 기본 요소들을, $A$는 각 요소가 원본 데이터에 기여하는 정도를 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.2. 활용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 고차원 데이터의 &lt;b&gt;잠재적인 패턴&lt;/b&gt;과 구조를 발견하고, 저차원 표현으로 &lt;b&gt;압축&lt;/b&gt;하며, &lt;b&gt;노이즈를 제거&lt;/b&gt;하는 등의 목적으로 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 대표적인 활용 분야&lt;br /&gt;&amp;nbsp; - 추천 시스템의 협업 필터링&lt;br /&gt;&amp;nbsp; - 신호 처리&lt;br /&gt;&amp;nbsp; - 텍스트 마이닝과 토픽 모델링&lt;br /&gt;&amp;nbsp; - 생체 정보 분석&lt;br /&gt;&amp;nbsp; - 예시&lt;br /&gt;&amp;nbsp; &amp;nbsp; . 영화 평점 데이터에서 사용자-영화 행렬을 분해하면 사용자 취향과 영화 장르 정보를 추출 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 행렬 분해의 수학적 배경&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 행렬 분해는 주어진 $m \times n$ 차원의 행렬 $X$를 원천 행렬 $S \in \mathbb{R}^{m \times d}$와 기여도 행렬 $A \in \mathbb{R}^{d \times n}$의 곱으로 나타내는 것입니다. 여기서 $d$는 잠재 차원의 개수를 가리킵니다. 목표는 $X$와 $S \times A$의 차이를 최소화하는 행렬 $S$, $A$를 찾는 것입니다. 이를 수식으로 표현하면:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\min \lVert X - S \times A \rVert^{2}_{F}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* $\lVert \rVert_F$ : 프로브니우스 노름(Frobenius norm)&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;※ 프로브니우스 노름(Frobenius Norm)&lt;/b&gt;&lt;br /&gt;* 행렬의 노름(norm) 중 하나로, 행렬의 모든 원소 값에 대한 제곱 합의 제곱근&lt;br /&gt;&amp;nbsp; - 유클리드 노름이 벡터의 크기를 나타내듯, 프로브니우스 노름은 행렬의 크기를 나타내는 스칼라 값임&lt;br /&gt;* $m \times n$ 행렬 $A = (a_{ij})$에 대해,&lt;br /&gt;$$\lVert A \rVert_{F} = \sqrt{\sum_{i, j} a_{ij}^2}$$&lt;br /&gt;* 연산이 간단하고 미분이 용이하여 최적화 문제에 적합&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1. 원천 행렬(Source Matrix)와 기여도 행렬(Abundance Matrix)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 원천 행렬(Source Matrix) $S$&lt;br /&gt;&amp;nbsp; - 데이터 $X$를 구성하는 기본 요소나 패턴&lt;br /&gt;&amp;nbsp; - 각 열 벡터는 하나의 기본 패턴을 의미&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 기여도 행렬(Abundance Matrix) $A$&lt;br /&gt;&amp;nbsp; - 각 기본 패턴이 원본 데이터 $X$에 기여하는 정도&lt;br /&gt;&amp;nbsp; - 원소 $A_{ij}$ : $j$번째 패턴이 $i$번째 데이터 포인트에 기여하는 정도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 예시&lt;br /&gt;&amp;nbsp; - 텍스트 데이터 $X$가 문서-단어 행렬일 때,&lt;br /&gt;&amp;nbsp; &amp;nbsp; . $S$ : 단어 $m$, 토픽 $d$ 행렬&lt;br /&gt;&amp;nbsp; &amp;nbsp; . $A$ : 토픽 $d$, 문서 $n$ 행렬로, 각 문서가 토픽을 포함하는 정도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 대표적인 행렬 분해 기법&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1. 비음수 행렬 분해(NMF; Non-negative Matrix Factorization)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$X \approx W \times H$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 행렬 $X \in \mathbb{R}^{m \times n}$를 두 개의 비음수 행렬 기저 행렬 $W \in \mathbb{R}^{m \times d} \ge 0 $, 계수 행렬 $H \in \mathbb{R}^{d \times n} \ge 0 $의 곱으로 분해&lt;br /&gt;* 비음수 제약 조건으로 인해 부분적으로 가산적인 구조를 가지므로 해석이 용이&lt;br /&gt;* 텍스트 마이닝, 음성 처리, 이미지 처리에 활용&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;※ 비음수 제약 조건&lt;/b&gt;&lt;br /&gt;* 분해된 행렬 $W$, $H$의 모든 원소가 0 이상의 값을 갖는 조건&lt;br /&gt;&amp;nbsp; - 이 제약 조건으로 인해 데이터 $X$가 $W$와 $H$의 곱으로 표현될 때, 부분적으로 합쳐지는 구조를 가짐&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 파이썬 예제&lt;br /&gt;&amp;nbsp; ① 예제 그래프 생성&lt;/p&gt;
&lt;pre id=&quot;code_1711081823355&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import networkx as nx

G = nx.karate_club_graph()  # 예제 그래프
nx.draw(G)  # 그래프 시각화&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;499&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q5CCA/btsF0GGuZHe/fCIEdmKGLxB0D9HLWE2qJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q5CCA/btsF0GGuZHe/fCIEdmKGLxB0D9HLWE2qJk/img.png&quot; data-alt=&quot;예제 그래프 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q5CCA/btsF0GGuZHe/fCIEdmKGLxB0D9HLWE2qJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq5CCA%2FbtsF0GGuZHe%2FfCIEdmKGLxB0D9HLWE2qJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;378&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;499&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;예제 그래프 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; ② 그래프 인접 행렬 추출&lt;/p&gt;
&lt;pre id=&quot;code_1711081939448&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;A = nx.to_numpy_array(G)  # 그래프 인접 행렬
print(&quot;인접 행렬 크기:&quot;, A.shape)
print(&quot;인접 행렬:\n&quot;, A)&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;인접 행렬 크기: (34, 34)&lt;br /&gt;인접 행렬:&lt;br /&gt;[[0. 4. 5. ... 2. 0. 0.]&lt;br /&gt;&amp;nbsp;[4. 0. 6. ... 0. 0. 0.]&lt;br /&gt;&amp;nbsp;[5. 6. 0. ... 0. 2. 0.]&lt;br /&gt;...&lt;br /&gt;&amp;nbsp;[2. 0. 0. ... 0. 4. 4.]&lt;br /&gt;&amp;nbsp;[0. 0. 2. ... 4. 0. 5.]&lt;br /&gt;&amp;nbsp;[0. 0. 0. ... 4. 5. 0.]]&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; ③ NMF 모델 학습 및 실행&lt;/p&gt;
&lt;pre id=&quot;code_1711082276482&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from sklearn.decomposition import NMF

# NMF 모델 학습
nmf = NMF(n_components=5,  # 분해할 성분 개수
          init=&quot;nndsvd&quot;,  # 초기화 방법
          max_iter=200)  # 최대 반복 횟수
W = nmf.fit_transform(A)  # 기저 행렬(W)
H = nmf.components_  # 계수 행렬(H)
print(&quot;기저 행렬(W) 크기:&quot;, W.shape)
print(&quot;계수 행렬(H) 크기:&quot;, H.shape)&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;기저 행렬(W) 크기: (34, 5) &lt;br /&gt;계수 행렬(H) 크기: (5, 34)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; ④ NMF 결과 시각화&lt;/p&gt;
&lt;pre id=&quot;code_1711082332202&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import matplotlib.pyplot as plt

fig, subs = plt.subplots(ncols=2, figsize=(10, 5))
# 기저 행렬(W) 시각화
subs[0].imshow(W, cmap=&quot;Reds&quot;)
subs[0].set_title(&quot;W&quot;)
# 계수 행렬(H) 시각화
subs[1].imshow(H, cmap=&quot;Reds&quot;)
subs[1].set_title(&quot;H&quot;)

plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;674&quot; data-origin-height=&quot;451&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bw3nUN/btsF1sA2DWl/S1jKzsVMwXdfthqHug41A0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bw3nUN/btsF1sA2DWl/S1jKzsVMwXdfthqHug41A0/img.png&quot; data-alt=&quot;NMF 결과. (왼쪽) 기저 행렬, (오른쪽) 계수 행렬&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bw3nUN/btsF1sA2DWl/S1jKzsVMwXdfthqHug41A0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbw3nUN%2FbtsF1sA2DWl%2FS1jKzsVMwXdfthqHug41A0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;401&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;674&quot; data-origin-height=&quot;451&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;NMF 결과. (왼쪽) 기저 행렬, (오른쪽) 계수 행렬&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.2. 특이값 분해(SVD; Singular Value Decomposition)&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;$$X = U \Sigma V^T$$&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;* 행렬 $X$를 직교 행렬 $U$,&lt;span&gt;&amp;nbsp;&lt;/span&gt;$V^T$와 대각 행렬 $\Sigma$ 세 개의 행렬 곱으로 분해&lt;br /&gt;* 데이터의 랭크와 고유값, 고유벡터를 계산할 수 있음&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;* 활용&lt;br /&gt;&amp;nbsp; - 차원 축소 및 데이터 압축&lt;br /&gt;&amp;nbsp; &amp;nbsp; . $\Sigma$의 큰 특이값에 대응하는 $U$, $V$의 열 벡터만 선택하여 압축&lt;br /&gt;&amp;nbsp; &amp;nbsp; . 데이터 차원을 축소하고 노이즈를 제거&lt;br /&gt;&amp;nbsp; - 노드 임베딩 및 시각화&lt;br /&gt;&amp;nbsp; &amp;nbsp; . $U$, $V$의 열 벡터를 노드 임베딩 벡터로 활용&lt;br /&gt;&amp;nbsp; &amp;nbsp; . 상위 k개의 열 벡터를 선택하여 k차원 공간에 노드를 임베딩하고 시각화&lt;br /&gt;&amp;nbsp; - 그래프 클러스터링&lt;br /&gt;&amp;nbsp; &amp;nbsp; . $U$, $V^T$의 열 벡터를 기반으로 노드 클러스터링 수행&lt;br /&gt;&amp;nbsp; - 신호 분석 및 주파수 영역 변환&lt;br /&gt;&amp;nbsp; &amp;nbsp; . $\Sigma$의 특이값은 그래프 신호의 주파수 성분을 나타냄&lt;br /&gt;&amp;nbsp; &amp;nbsp; . 주파수 영역에서 분석하거나 필터링을 수행할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 파이썬 예제&lt;br /&gt;&amp;nbsp; ① SVD 실행&lt;/p&gt;
&lt;pre id=&quot;code_1711083050698&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np

U, Sigma, Vt = np.linalg.svd(A, full_matrices=False)  # SVD
Sigma_matrix = np.diag(Sigma)

print(&quot;U 크기:&quot;, U.shape)
print(&quot;Sigma 크기:&quot;, Sigma_matrix.shape)
print(&quot;Vt 크기:&quot;, Vt.shape)&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;U 크기: (34, 34)&lt;br /&gt;Sigma 크기: (34, 34)&lt;br /&gt;Vt 크기: (34, 34)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; ② SVD 결과 시각화&lt;/p&gt;
&lt;pre id=&quot;code_1711083097363&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fig, subs = plt.subplots(ncols=3, figsize=(15, 5))
# U 시각화
subs[0].imshow(U, cmap=&quot;Reds&quot;)
subs[0].set_title(&quot;U&quot;)
# Sigma 시각화
subs[1].imshow(Sigma_matrix, cmap=&quot;Reds&quot;)
subs[1].set_title(&quot;Sigma&quot;)
# V 시각화
subs[2].imshow(Vt, cmap=&quot;Reds&quot;)
subs[2].set_title(&quot;Vt&quot;)

plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;1209&quot; data-origin-height=&quot;407&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btEyeI/btsF1ckY07S/AgRCdm8ipVfiwn2jT5Lmk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btEyeI/btsF1ckY07S/AgRCdm8ipVfiwn2jT5Lmk1/img.png&quot; data-alt=&quot;SVD 결과. (왼쪽) U, (중앙) Sigma, (오른쪽) Vt&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btEyeI/btsF1ckY07S/AgRCdm8ipVfiwn2jT5Lmk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtEyeI%2FbtsF1ckY07S%2FAgRCdm8ipVfiwn2jT5Lmk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1209&quot; height=&quot;407&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;1209&quot; data-origin-height=&quot;407&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SVD 결과. (왼쪽) U, (중앙) Sigma, (오른쪽) Vt&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.3. 주성분 분석(PCA; Principal Component Analysis)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$X \approx u + \sum z_i p_i$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 데이터 $X$를 평균 벡터 $u$와 주성분 벡터 $p_i$, 주성분 벡터에 투영된 X의 값인 $z_i$의 선형조합으로 나타냄&lt;br /&gt;* 고차원 데이터의 차원을 낮추면서 가능한 많은 변동성을 보존하는 기법&lt;br /&gt;* 차원 축소, 데이터 시각화, 노이즈 제거에 활용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 파이썬 예제&lt;br /&gt;&amp;nbsp; ① PCA 실행&lt;/p&gt;
&lt;pre id=&quot;code_1711092934174&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from sklearn.decomposition import PCA

pca = PCA(n_components=5)  # PCA 모델 생성
zi = pca.fit_transform(A)  # PCA 모델 학습 및 변환
u = pca.mean_  # 평균 벡터(u)
pi = pca.components_  # 주성분 벡터(pi)

print(&quot;투영 벡터(zi) 크기:&quot;, zi.shape)
print(&quot;평균 벡터(u) 크기:&quot;, u.shape)
print(&quot;주성분 벡터(pi) 크기:&quot;, pi.shape)&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;투영 벡터(zi) 크기: (34, 5)&lt;br /&gt;평균 벡터(u) 크기: (34,)&lt;br /&gt;주성분 벡터(pi) 크기: (5, 34)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; ② PCA 결과 시각화&lt;/p&gt;
&lt;pre id=&quot;code_1711092991245&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fig, subs = plt.subplots(ncols=2, figsize=(10, 5))
# 투영 벡터(zi) 시각화
subs[0].imshow(zi, cmap=&quot;Reds&quot;)
subs[0].set_title(&quot;zi&quot;)
# 계수 행렬(H) 시각화
subs[1].imshow(pi, cmap=&quot;Reds&quot;)
subs[1].set_title(&quot;pi&quot;)

plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;674&quot; data-origin-height=&quot;451&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FqHTR/btsF0sbcSeT/k4Rm7mmsKWXTKKepNbEDGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FqHTR/btsF0sbcSeT/k4Rm7mmsKWXTKKepNbEDGk/img.png&quot; data-alt=&quot;PCA 결과. (왼쪽) 투영 벡터, (오른쪽) 주성분 벡터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FqHTR/btsF0sbcSeT/k4Rm7mmsKWXTKKepNbEDGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFqHTR%2FbtsF0sbcSeT%2Fk4Rm7mmsKWXTKKepNbEDGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;401&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;674&quot; data-origin-height=&quot;451&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PCA 결과. (왼쪽) 투영 벡터, (오른쪽) 주성분 벡터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 행렬 분해의 활용 사례&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.1. 링크 예측(Link Prediction)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 그래프 데이터에서 노드 간 링크 존재 여부를 예측하는 문제&lt;br /&gt;&amp;nbsp; - (소셜 네트워크) 친구 관계 예측&lt;br /&gt;&amp;nbsp; - (생물학 네트워크) 단백질 간 상호작용 예측&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.2. 노드 임베딩(Node Embedding)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 그래프 데이터의 노드를 낮은 차원의 밀집 벡터로 변환하는 작업&lt;br /&gt;&amp;nbsp; - DeepWalk, Node2Vec 기법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.3. 그래프 신호 처리(Graph Signal Processing)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 그래프 신호(Graph Signal)&lt;br /&gt;&amp;nbsp; - 그래프 구조의 각 노드에 스칼라 값이 할당된 형태&lt;br /&gt;&amp;nbsp; - 예시&lt;br /&gt;&amp;nbsp; &amp;nbsp; . (교통 네트워크) 각 도로 구간의 혼잡도&lt;br /&gt;&amp;nbsp; &amp;nbsp; . (센서 네트워크) 각 센서의 측정값&lt;br /&gt;&amp;nbsp; &amp;nbsp; . (소셜 네트워크) 각 사용자의 특성값&lt;br /&gt;&amp;nbsp; &amp;nbsp; . (분자 구조) 각 원자의 전하량&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 그래프 신호의 필터링, 압축, 보간에 이용&lt;br /&gt;&amp;nbsp; - 그래프 신호를 푸리에 기저(Fourier basis)로 분해&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;※ 그래프 푸리에 기저(Graph Fourier Basis)&lt;/b&gt;&lt;br /&gt;* 그래프 라플라시안 행렬(Graph Laplacian Matrix)의 고유벡터(eigenvectors)로 구성되며, 이 고유벡터들은 그래프 구조를 반영하는 기저 함수 역할을 함&lt;br /&gt;&amp;nbsp; - 그래프 신호를 그래프 라플라시안의 고유벡터들의 선형 조합으로 표현할 수 있음&lt;br /&gt;$$f = \sum \alpha_i \phi_i$$&lt;br /&gt;&amp;nbsp; - $f$ : 그래프 신호, $\phi_i$ : 그래프 푸리에 기저(고유벡터), $\alpha_i$ : 계수&lt;br /&gt;&lt;br /&gt;&lt;b&gt;※ 그래프 라플라시안 행렬(Graph Laplacian Matrix)&lt;/b&gt;&lt;br /&gt;* 그래프의 구조적 특성을 포착하는 행렬&lt;br /&gt;$$L = D - A$$&lt;br /&gt;&amp;nbsp; - $D$ : 차수 행렬(Degree matrix)&lt;br /&gt;&amp;nbsp; &amp;nbsp; . 대각 행렬로 $D(i, i)$는 $i$번째 노드의 차수&lt;br /&gt;&amp;nbsp; - $A$ : 인접 행렬(Adjacency matrix)&lt;br /&gt;* 주요 특성&lt;br /&gt;&amp;nbsp; - 대칭 행렬&lt;br /&gt;&amp;nbsp; - 고유값은 0 이상&lt;br /&gt;&amp;nbsp; - 고유벡터들은 그래프 푸리에 기저를 형성&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.4. 그래프 클러스터링(Graph Clustering)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 그래프의 구조적 유사성을 포착&lt;br /&gt;&amp;nbsp; - 커뮤니티 탐지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>인공지능/그래프</category>
      <category>그래프</category>
      <category>머신러닝</category>
      <category>비지도학습</category>
      <category>행렬분해</category>
      <author>백관구</author>
      <guid isPermaLink="true">https://data-science-note.tistory.com/98</guid>
      <comments>https://data-science-note.tistory.com/98#entry98comment</comments>
      <pubDate>Fri, 22 Mar 2024 17:45:17 +0900</pubDate>
    </item>
    <item>
      <title>[그래프 ML] 그래프 머신러닝 - 파이썬 NetworkX, node2vec, karateclub</title>
      <link>https://data-science-note.tistory.com/97</link>
      <description>&lt;div class=&quot;book-toc&quot;&gt;
  &lt;p&gt;목차&lt;/p&gt;
  &lt;ul id=&quot;toc_list&quot;&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;※ 출처 : 그래프 머신러닝 (클라우디오 스타밀레 외, 김기성&amp;middot;장기식 옮김)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 그래프 머신러닝이란&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;b&gt;그래프 구조&lt;/b&gt;로 표현되는 데이터에 대해 기계학습 알고리즘을 적용하는 분야&lt;br /&gt;&amp;nbsp; - 비정형 구조인 그래프 데이터는 소셜 네트워크, 분자 구조, 지식망, 교통망 등 다양한 영역에서 활용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.1. 대표적인 그래프 머신러닝 기법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;*&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;그래프 임베딩(Graph Embeddings)&lt;/b&gt; &lt;br /&gt;* &lt;b&gt;그래프 신경망(GNN; Graph Neural Network)&lt;/b&gt;&lt;br /&gt;* &lt;b&gt;그래프 커널(Graph Kernels)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 노드 분류, 링크 예측, 그래프 생성, 클러스터링 등 작업 수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.2.&amp;nbsp; 그래프 세분화 수준&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 180px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 23.5658%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;수준(Level)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41.1241%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 35.31%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;예시&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 23.5658%; height: 40px; text-align: center;&quot;&gt;&lt;b&gt;노드 수준&lt;br /&gt;(Node-level)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41.1241%; height: 40px; text-align: center;&quot;&gt;개별 노드의 특성을 예측하거나 분류&lt;/td&gt;
&lt;td style=&quot;width: 35.31%; height: 40px;&quot;&gt;- 소셜 네트워크에서 사용자의 성향 예측&lt;br /&gt;- 분자 구조에서 원자의 종류 예측&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 23.5658%; height: 40px; text-align: center;&quot;&gt;&lt;b&gt;간선 수준&lt;br /&gt;(Edge-level)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41.1241%; height: 40px; text-align: center;&quot;&gt;두 노드 간 연결 고리(링크)가 존재하는지 예측&lt;/td&gt;
&lt;td style=&quot;width: 35.31%; height: 40px;&quot;&gt;- 친구 추천 시스템&lt;br /&gt;- 단백질 간 상호작용 예측&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 23.5658%; height: 20px; text-align: center;&quot;&gt;&lt;b&gt;서브그래프 수준&lt;br /&gt;(Subgraph-level)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41.1241%; height: 20px; text-align: center;&quot;&gt;그래프 내 부분 구조를 인식하거나 추출&lt;/td&gt;
&lt;td style=&quot;width: 35.31%; height: 20px;&quot;&gt;- 분자 구조에서 특정 기능기 패턴 탐지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 60px;&quot;&gt;
&lt;td style=&quot;width: 23.5658%; height: 60px; text-align: center;&quot;&gt;&lt;b&gt;그래프 수준&lt;br /&gt;(Graph-level)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41.1241%; height: 60px; text-align: center;&quot;&gt;전체 그래프의 특성이나 라벨을 예측&lt;/td&gt;
&lt;td style=&quot;width: 35.31%; height: 60px;&quot;&gt;- 분자 물성 예측&lt;br /&gt;- 그래프 생성&lt;br /&gt;- 그래프 유사도 계산&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;809&quot; data-origin-height=&quot;547&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqT66x/btsFN6ejO6B/qktfmJdgQcKsFzSRtqRKv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqT66x/btsFN6ejO6B/qktfmJdgQcKsFzSRtqRKv0/img.png&quot; data-alt=&quot;그래프 세분화 수준. 출처: Graph Machine Learning with Python Part 1: Basics, Metrics, and Algorithms&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqT66x/btsFN6ejO6B/qktfmJdgQcKsFzSRtqRKv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdqT66x%2FbtsFN6ejO6B%2FqktfmJdgQcKsFzSRtqRKv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;406&quot; data-origin-width=&quot;809&quot; data-origin-height=&quot;547&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그래프 세분화 수준. 출처: Graph Machine Learning with Python Part 1: Basics, Metrics, and Algorithms&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 그래프 임베딩 또는 네트워크 임베딩(Graph or Network Embedding)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;b&gt;표현 학습(Representation learning)&lt;/b&gt;이라고도 하며, 이산 그래프에서 연속 영역으로 &lt;b&gt;사상 함수(mapping function) $f:G \rightarrow \mathbb{R}^n$&lt;/b&gt;를 학습하는 작업&lt;br /&gt;&amp;nbsp; - 사상 함수 $f$는 그래프 $G$의 속성이 보존되는 저차원 벡터로 표현되도록 동작함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 사상 함수를 어디에 적용하냐에 따라,&lt;br /&gt;&amp;nbsp; - &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;$f:G \rightarrow \mathbb{R}^n$ :&lt;span&gt;&amp;nbsp;&lt;b&gt;그래프&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt; 임베딩(Graph embedding)&lt;/b&gt; &lt;br /&gt;&amp;nbsp; - $f:V \rightarrow \mathbb{R}^n$ : &lt;b&gt;노드 임베딩(Node embedding)&lt;/b&gt;&lt;br /&gt;&amp;nbsp; - $f:E \rightarrow \mathbb{R}^n$ : &lt;b&gt;간선 임베딩(Edge embedding)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 임베딩 함수로 생성된 공간에서,&lt;br /&gt;&amp;nbsp; - 유사한 구조는 유클리드 거리가 짧음&lt;br /&gt;&amp;nbsp; - 유사하지 않은 구조는 유클리드 거리가 길게 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1. 임베딩 알고리즘 분류&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 128px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 25.5815%; text-align: center; height: 40px;&quot;&gt;&lt;b&gt;알고리즘&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 26.5115%; text-align: center; height: 40px;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 15.6395%; text-align: center; height: 40px;&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 13.3429%; text-align: center; height: 40px;&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 7.7907%; text-align: center; height: 40px;&quot;&gt;&lt;b&gt;계산&lt;br /&gt;복잡도&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 8.81542%; text-align: center; height: 40px;&quot;&gt;&lt;b&gt;구조정보 &lt;br /&gt;활용도&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 37px;&quot;&gt;
&lt;td style=&quot;width: 25.5815%; text-align: center; height: 37px;&quot;&gt;&lt;b&gt;얕은 임베딩&lt;/b&gt;&lt;br /&gt;&lt;b&gt;(Shallow Embedding)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 26.5115%; height: 37px;&quot;&gt;노드 속성과 구조적 정보를 결합하여 임베딩 벡터를 생성&lt;/td&gt;
&lt;td style=&quot;width: 15.6395%; height: 37px;&quot;&gt;연산량 적음&lt;/td&gt;
&lt;td style=&quot;width: 13.3429%; height: 37px;&quot;&gt;구조정보 활용 제한&lt;/td&gt;
&lt;td style=&quot;width: 7.7907%; text-align: center; height: 37px;&quot;&gt;낮음&lt;/td&gt;
&lt;td style=&quot;width: 8.81542%; text-align: center; height: 37px;&quot;&gt;낮음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 25.5815%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;그래프 자동인코딩&lt;/b&gt;&lt;br /&gt;&lt;b&gt;(Graph Auto-encoding)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 26.5115%; height: 17px;&quot;&gt;인코더-디코더 활용하여 노드 임베딩과 그래프 복원을 최적화&lt;/td&gt;
&lt;td style=&quot;width: 15.6395%; height: 17px;&quot;&gt;그래프 구조 포착&lt;/td&gt;
&lt;td style=&quot;width: 13.3429%; height: 17px;&quot;&gt;과적합 가능&lt;/td&gt;
&lt;td style=&quot;width: 7.7907%; text-align: center; height: 17px;&quot;&gt;높음&lt;/td&gt;
&lt;td style=&quot;width: 8.81542%; text-align: center; height: 17px;&quot;&gt;높음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 25.5815%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;근방 집계&lt;/b&gt;&lt;br /&gt;&lt;b&gt;(Neighborhood Aggregation)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 26.5115%; height: 17px;&quot;&gt;근방 노드 임베딩을 반복 집계하여 대상 노드의 임베딩을 생성&lt;/td&gt;
&lt;td style=&quot;width: 15.6395%; height: 17px;&quot;&gt;구조정보 통합&lt;/td&gt;
&lt;td style=&quot;width: 13.3429%; height: 17px;&quot;&gt;하이퍼파라미터 최적화 필요&lt;/td&gt;
&lt;td style=&quot;width: 7.7907%; text-align: center; height: 17px;&quot;&gt;높음&lt;/td&gt;
&lt;td style=&quot;width: 8.81542%; text-align: center; height: 17px;&quot;&gt;중간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 25.5815%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;그래프 정규화&lt;/b&gt;&lt;br /&gt;&lt;b&gt;(Graph Regularization)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 26.5115%; height: 17px;&quot;&gt;그래프 구조정보를 정규화 항으로 활용하여 임베딩 학습을 안내&lt;/td&gt;
&lt;td style=&quot;width: 15.6395%; height: 17px;&quot;&gt;구조정보 활용&lt;/td&gt;
&lt;td style=&quot;width: 13.3429%; height: 17px;&quot;&gt;정규화 강도 설정 까다로움&lt;/td&gt;
&lt;td style=&quot;width: 7.7907%; text-align: center; height: 17px;&quot;&gt;중간&lt;/td&gt;
&lt;td style=&quot;width: 8.81542%; text-align: center; height: 17px;&quot;&gt;높음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 128px;&quot; border=&quot;1&quot; data-ke-style=&quot;style15&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 17.7908%; height: 40px; text-align: center;&quot;&gt;&lt;b&gt;알고리즘&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25.1161%; height: 40px; text-align: center;&quot;&gt;&lt;b&gt;지도 학습&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 24.8256%; height: 40px; text-align: center;&quot;&gt;&lt;b&gt;비지도 학습&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 37px;&quot;&gt;
&lt;td style=&quot;width: 17.7908%; height: 37px; text-align: center;&quot;&gt;&lt;b&gt;얕은 임베딩&lt;/b&gt;&lt;br /&gt;&lt;b&gt;(Shallow Embedding)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25.1161%; height: 37px; text-align: center;&quot;&gt;O&lt;/td&gt;
&lt;td style=&quot;width: 24.8256%; height: 37px; text-align: center;&quot;&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 17.7908%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;그래프 자동인코딩&lt;/b&gt;&lt;br /&gt;&lt;b&gt;(Graph Auto-encoding)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25.1161%; height: 17px; text-align: center;&quot;&gt;-&lt;/td&gt;
&lt;td style=&quot;width: 24.8256%; height: 17px; text-align: center;&quot;&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 17.7908%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;근방 집계&lt;/b&gt;&lt;br /&gt;&lt;b&gt;(Neighborhood Aggregation)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25.1161%; height: 17px; text-align: center;&quot;&gt;O&lt;/td&gt;
&lt;td style=&quot;width: 24.8256%; height: 17px; text-align: center;&quot;&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 17.7908%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;그래프 정규화&lt;/b&gt;&lt;br /&gt;&lt;b&gt;(Graph Regularization)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25.1161%; height: 17px; text-align: center;&quot;&gt;O&lt;br /&gt;(준지도 학습 포함)&lt;/td&gt;
&lt;td style=&quot;width: 24.8256%; height: 17px; text-align: center;&quot;&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 얕은 임베딩(Shallow Embedding) 예시&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1. 노드 투 벡터(Node to Vector)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* node2vec 라이브러리 설치&lt;/p&gt;
&lt;pre id=&quot;code_1710399962674&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install node2vec&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 아래 그림에서 유사한 구조의 노드는 2차원 임베딩 공간에서 서로 가깝고, 구조가 다른 노드와 비교적 멀리 떨어져 있음&lt;br /&gt;&amp;nbsp; - 두 클리크(0~6번 노드와 11~17번 노드)가 명확히 구별됨&lt;/p&gt;
&lt;pre id=&quot;code_1710400856841&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import networkx as nx
from node2vec import Node2Vec
import matplotlib.pyplot as plt
plt.rc(&quot;font&quot;, family=&quot;Malgun Gothic&quot;)


G = nx.barbell_graph(m1=7, m2=4)  # 바벨 그래프(Barbell graph) 생성
encoder = Node2Vec(G, dimensions=2).fit(window=10)  # 2차원 노드 임베딩(Node-level embedding) 알고리즘

fig, subs = plt.subplots(ncols=2, figsize=(11, 5))

nx.draw(G, with_labels=True, font_size=10, node_size=200, ax=subs[0])  # 바벨 그래프 시각화
subs[0].set_title(&quot;바벨 그래프&quot;)

for x in G.nodes():
    name = str(x)
    V = encoder.wv.get_vector(name)
    v0, v1 = V[0], V[1]
    
    subs[1].scatter(v0, v1, s=200)
    subs[1].annotate(name, (v0, v1), fontsize=10, ha=&quot;center&quot;, va=&quot;center&quot;)
subs[1].set_title(&quot;노드 투 벡터 결과&quot;)

plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;872&quot; data-origin-height=&quot;449&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bij9Eq/btsFOF8s9UW/g08mIX7YS11ymt2K7amBA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bij9Eq/btsFOF8s9UW/g08mIX7YS11ymt2K7amBA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bij9Eq/btsFOF8s9UW/g08mIX7YS11ymt2K7amBA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbij9Eq%2FbtsFOF8s9UW%2Fg08mIX7YS11ymt2K7amBA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;872&quot; height=&quot;449&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;872&quot; data-origin-height=&quot;449&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.2. 엣지 투 벡터(Edge to Vector)&lt;/h3&gt;
&lt;pre id=&quot;code_1710461208563&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import networkx as nx
from node2vec import Node2Vec
from node2vec.edges import HadamardEmbedder
import matplotlib.pyplot as plt
plt.rc(&quot;font&quot;, family=&quot;Malgun Gothic&quot;)


G = nx.barbell_graph(m1=7, m2=4)  # 바벨 그래프(Barbell graph) 생성
encoder = Node2Vec(G, dimensions=2).fit(window=10)  # 2차원 노드 임베딩(Node-level embedding) 알고리즘
edge_embedding = HadamardEmbedder(keyed_vectors=encoder.wv)

fig, subs = plt.subplots(ncols=2, figsize=(11, 5))

nx.draw(G, with_labels=True, font_size=10, node_size=200, ax=subs[0])  # 바벨 그래프 시각화
subs[0].set_title(&quot;바벨 그래프&quot;)

for x in G.edges():
    V = edge_embedding[(str(x[0]), str(x[1]))]
    v0, v1 = V[0], V[1]

    subs[1].scatter(v0, v1, s=200)
    subs[1].annotate(str(x), (v0, v1), fontsize=10, ha=&quot;center&quot;, va=&quot;center&quot;)
subs[1].set_title(&quot;엣지 투 벡터 결과&quot;)

plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;872&quot; data-origin-height=&quot;449&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vnfS5/btsFPc6tRsE/8GDgDqk23idqpm3UmRhYik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vnfS5/btsFPc6tRsE/8GDgDqk23idqpm3UmRhYik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vnfS5/btsFPc6tRsE/8GDgDqk23idqpm3UmRhYik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvnfS5%2FbtsFPc6tRsE%2F8GDgDqk23idqpm3UmRhYik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;872&quot; height=&quot;449&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;872&quot; data-origin-height=&quot;449&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.3. 그래프 투 벡터(Graph to Vector)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* karateclub 라이브러리 설치&lt;/p&gt;
&lt;pre id=&quot;code_1710476617814&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install karateclub&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1710477359342&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import random
from karateclub import Graph2Vec
import matplotlib.pyplot as plt
plt.rc(&quot;font&quot;, family=&quot;Malgun Gothic&quot;)


def generate_watts_strogatz_graph():  # Watts-Strogatz 그래프 랜덤 생성
    n = random.randint(5, 20)
    k = random.randint(5, n)
    p = random.uniform(0, 1)
    return nx.watts_strogatz_graph(n, k, p)


Gs = [generate_watts_strogatz_graph() for i in range(20)]
encoder = Graph2Vec(dimensions=2)  # 2차원 그래프 임베딩(Graph-level embedding) 알고리즘
encoder.fit(Gs)
graph_embedding = encoder.get_embedding()

fig, subs = plt.subplots(nrows=4, ncols=5, figsize=(15, 12))  # Watts-Strogatz 그래프 시각화
for i, (G, sub) in enumerate(zip(Gs, subs.flatten())):
    nx.draw(G, node_size=200, ax=sub)  # 그래프 시각화
    sub.text(sub.get_xlim()[0], sub.get_ylim()[-1], i, ha=&quot;left&quot;, va=&quot;top&quot;, fontsize=20)
plt.show()

fig, sub = plt.subplots(figsize=(5, 5))  # 그래프 투 벡터 임베딩 결과 시각화
for i, V in enumerate(graph_embedding):
    v0, v1 = V[0], V[1]
    sub.scatter(v0, v1, s=200)
    sub.annotate(str(i), (v0, v1), fontsize=10, ha=&quot;center&quot;, va=&quot;center&quot;)
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;1182&quot; data-origin-height=&quot;944&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDEtyU/btsFOeqKEPg/tGkLjqKCfeDnCZHdLYK27k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDEtyU/btsFOeqKEPg/tGkLjqKCfeDnCZHdLYK27k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDEtyU/btsFOeqKEPg/tGkLjqKCfeDnCZHdLYK27k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDEtyU%2FbtsFOeqKEPg%2FtGkLjqKCfeDnCZHdLYK27k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1182&quot; height=&quot;944&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;1182&quot; data-origin-height=&quot;944&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;427&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmbM8Y/btsFOdZE5Sg/zS2gEMmg1Et6jXoLYyaLJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmbM8Y/btsFOdZE5Sg/zS2gEMmg1Et6jXoLYyaLJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmbM8Y/btsFOdZE5Sg/zS2gEMmg1Et6jXoLYyaLJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmbM8Y%2FbtsFOdZE5Sg%2FzS2gEMmg1Et6jXoLYyaLJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;444&quot; height=&quot;427&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;427&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>인공지능/그래프</category>
      <category>그래프</category>
      <category>그래프임베딩</category>
      <category>머신러닝</category>
      <category>얕은임베딩</category>
      <author>백관구</author>
      <guid isPermaLink="true">https://data-science-note.tistory.com/97</guid>
      <comments>https://data-science-note.tistory.com/97#entry97comment</comments>
      <pubDate>Fri, 15 Mar 2024 13:39:57 +0900</pubDate>
    </item>
    <item>
      <title>[그래프 ML] 그래프 분석 라이브러리 - 파이썬 NetworkX, SNAP, igraph, graph-tool, NetworKit</title>
      <link>https://data-science-note.tistory.com/95</link>
      <description>&lt;div class=&quot;book-toc&quot;&gt;
  &lt;p&gt;목차&lt;/p&gt;
  &lt;ul id=&quot;toc_list&quot;&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;※ 이전 글 참고&lt;/b&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1710382264345&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[그래프 ML] 파이썬 networkx 시작하기&quot; data-og-description=&quot;※ 출처 : 그래프 머신러닝 (클라우디오 스타밀레 외, 김기성&amp;middot;장기식 옮김) 1. 그래프(Graph) 뜻 * 개체 간의 관계를 설명하는 데 사용되는 수학적 구조 * 소셜 네트워크(팔로우), 지도(길로 이어진 &quot; data-og-host=&quot;data-science-note.tistory.com&quot; data-og-source-url=&quot;https://data-science-note.tistory.com/89&quot; data-og-url=&quot;https://data-science-note.tistory.com/89&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dlx6bw/hyVxB5fdUg/U95TDjf9Pe7z8mOLJRIIk0/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/ckdevj/hyVxxPilAX/PJkBJBLrYRK86QyKX4umfK/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/4TBil/hyVAKzsc40/GOaiNUkwlWqLRZBMuQKQI1/img.png?width=660&amp;amp;height=499&amp;amp;face=0_0_660_499&quot;&gt;&lt;a href=&quot;https://data-science-note.tistory.com/89&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://data-science-note.tistory.com/89&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dlx6bw/hyVxB5fdUg/U95TDjf9Pe7z8mOLJRIIk0/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/ckdevj/hyVxxPilAX/PJkBJBLrYRK86QyKX4umfK/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/4TBil/hyVAKzsc40/GOaiNUkwlWqLRZBMuQKQI1/img.png?width=660&amp;amp;height=499&amp;amp;face=0_0_660_499');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[그래프 ML] 파이썬 networkx 시작하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;※ 출처 : 그래프 머신러닝 (클라우디오 스타밀레 외, 김기성&amp;middot;장기식 옮김) 1. 그래프(Graph) 뜻 * 개체 간의 관계를 설명하는 데 사용되는 수학적 구조 * 소셜 네트워크(팔로우), 지도(길로 이어진&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;data-science-note.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;☆★ 요약 ★☆&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;b&gt;작업 규모 및 목적&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;b&gt;적절한 라이브러리&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;b&gt;소규모 네트워크 분석&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;NetworkX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;b&gt;대규모 네트워크 및 고성능 분석&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;SNAP, igraph, graph-tool, NetworKit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;b&gt;시각화 기능&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;graph-tool, NetworKit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;b&gt;신규 알고리즘 생성&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;NetworKit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 102px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 12.2093%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;라이브러리&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.6744%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;주요 특징&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.0001%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.1162%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 12.2093%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;NetworkX&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.6744%; height: 17px;&quot;&gt;- 표준 그래프 이론 알고리즘 구현&lt;br /&gt;- 내장 시각화 기능&lt;br /&gt;- 간편한 코드 작성&lt;br /&gt;- 활발한 커뮤니티 및 문서화&lt;/td&gt;
&lt;td style=&quot;width: 30.0001%; height: 17px;&quot;&gt;- 사용법이 간단&lt;br /&gt;- 많은 예제와 문서&lt;br /&gt;- 다양한 알고리즘 제공&lt;/td&gt;
&lt;td style=&quot;width: 30.1162%; height: 17px;&quot;&gt;-&amp;nbsp;대규모&amp;nbsp;네트워크&amp;nbsp;처리&amp;nbsp;성능&amp;nbsp;낮음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 12.2093%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;SNAP&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.6744%; height: 17px;&quot;&gt;&lt;span style=&quot;color: #29261b; text-align: start;&quot;&gt;-&amp;nbsp;대규모&amp;nbsp;네트워크&amp;nbsp;처리&amp;nbsp;능력&lt;br /&gt;- 고성능 계산&lt;br /&gt;- 다양한 네트워크 파일 형식 지원&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.0001%; height: 17px;&quot;&gt;- 대규모 네트워크 처리 최적화&lt;br /&gt;- 알고리즘 성능 뛰어남&lt;/td&gt;
&lt;td style=&quot;width: 30.1162%; height: 17px;&quot;&gt;-&amp;nbsp;사용법이&amp;nbsp;NetworkX에&amp;nbsp;비해&amp;nbsp;복잡함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 12.2093%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;igraph&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.6744%; height: 17px;&quot;&gt;- 빠른 계산 속도&lt;br /&gt;- 다양한 파일 형식 지원&lt;br /&gt;- 시각화 기능&lt;/td&gt;
&lt;td style=&quot;width: 30.0001%; height: 17px;&quot;&gt;- 대규모 네트워크 처리 가능&lt;br /&gt;- 고급 네트워크 분석 기능 제공&lt;/td&gt;
&lt;td style=&quot;width: 30.1162%; height: 17px;&quot;&gt;- 개발 활동이 다소 적은 편&lt;br /&gt;- NetworkX에 비해 문서화 수준 낮음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 12.2093%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;graph-tool&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.6744%; height: 17px;&quot;&gt;- 대규모 네트워크 처리 능력&lt;br /&gt;- 내장 시각화 도구&lt;br /&gt;- 통합 그래프 분석 파이프라인&lt;/td&gt;
&lt;td style=&quot;width: 30.0001%; height: 17px;&quot;&gt;- 계산 성능과 메모리 효율성 뛰어남&lt;br /&gt;- 강력한 시각화 기능&lt;/td&gt;
&lt;td style=&quot;width: 30.1162%; height: 17px;&quot;&gt;- 코드가 다소 복잡함&lt;br /&gt;- 문서화 수준이 NetworkX보다 낮음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 12.2093%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;NetworKit&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.6744%; height: 17px;&quot;&gt;- 대규모 네트워크 처리 능력&lt;br /&gt;- 확장성과 유연성&lt;br /&gt;- 파이썬 인터페이스&lt;br /&gt;- 강력한 시각화 기능&lt;/td&gt;
&lt;td style=&quot;width: 30.0001%; height: 17px;&quot;&gt;- 계산 효율성 뛰어남&lt;br /&gt;- 알고리즘 다양성&lt;br /&gt;- 새로운 알고리즘 추가 용이&lt;/td&gt;
&lt;td style=&quot;width: 30.1162%; height: 17px;&quot;&gt;- 비교적 최근 개발된 라이브러리&lt;br /&gt;- 문서화 수준이 낮은 편&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. NetworkX&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 네트워크와 그래프 구조를 생성, 조작, 시각화하기 위한 라이브러리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;b&gt;중&amp;middot;소규모 네트워크 분석에 적합&lt;/b&gt;&lt;br /&gt;&amp;nbsp; - 대규모 네트워크는 SNAP, igraph, &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;graph-tool 라이브러리가 계산 효율성 측면에서 더 뛰어남&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1710390244419&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;NetworkX &amp;mdash; NetworkX  documentation&quot; data-og-description=&quot;NetworkX is a Python package for the creation, manipulation, and study of the structure, dynamics, and functions of complex networks. Software for complex networks Data structures for graphs, digraphs, and multigraphs Many standard graph algorithms Network&quot; data-og-host=&quot;networkx.org&quot; data-og-source-url=&quot;https://networkx.org/&quot; data-og-url=&quot;https://networkx.org/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://networkx.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://networkx.org/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;NetworkX &amp;mdash; NetworkX documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;NetworkX is a Python package for the creation, manipulation, and study of the structure, dynamics, and functions of complex networks. Software for complex networks Data structures for graphs, digraphs, and multigraphs Many standard graph algorithms Network&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;networkx.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.1396%; text-align: center;&quot;&gt;&lt;b&gt;주요 특징&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.8604%; text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.1396%; text-align: center;&quot;&gt;&lt;b&gt;다양한 네트워크 유형&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.8604%;&quot;&gt;* 무향/유향/가중/다중 간선 그래프 등 여러 유형의 네트워크를 지원&lt;br /&gt;* 클래스 객체로 생성하거나 외부 파일에서 데이터를 불러올 수 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.1396%; text-align: center;&quot;&gt;&lt;b&gt;네트워크 분석 알고리즘&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.8604%;&quot;&gt;* 최단경로, 연결성, 중심성, 트리, 플로우 등 다양한 알고리즘 제공&lt;br /&gt;* 이론 및 응용 분야에서 유용하게 사용됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.1396%; text-align: center;&quot;&gt;&lt;b&gt;시각화 기능&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.8604%;&quot;&gt;* 내장된 시각화 도구를 통해 네트워크를 시각화&lt;br /&gt;* Matplotlib, Graphviz와 통합을 통해 고급 시각화 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.1396%; text-align: center;&quot;&gt;&lt;b&gt;간단한 코드 작성&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.8604%;&quot;&gt;* 직관적이고 파이썬스러운(pythonic) 코드 구현 가능&lt;br /&gt;* 표준 데이터 구조와의 연동 용이&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.1396%; text-align: center;&quot;&gt;&lt;b&gt;활발한 커뮤니티와 문서화&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.8604%;&quot;&gt;* 꾸준한 유지보수&lt;br /&gt;* 방대한 커뮤니티와 예제가 갖추어져 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. SNAP (Stanford Network Analysis Platform)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 스탠포드 대학에서 개발된 오픈소스 라이브러리로, &lt;b&gt;대규모 네트워크 분석&lt;/b&gt;을 위한 다양한 알고리즘과 데이터 구조를 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* NetworkX는 사용법이 간단하고 시각화 기능이 풍부한 반면에, SNAP은 대규모 네트워크 처리에 최적화되어 있으며 알고리즘 성능이 뛰어남&lt;br /&gt;&amp;nbsp; - 작은 규모의 네트워크 분석은 NetworkX가 적합하지만, 대규모 네트워크 분석은 SNAP이 더 효율적임&lt;/p&gt;
&lt;figure id=&quot;og_1710381124560&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;SNAP: Stanford Network Analysis Project&quot; data-og-description=&quot;Stanford Network Analysis Project Stanford Network Analysis Platform (SNAP) is a general purpose network analysis and graph mining library. It is written in C++ and easily scales to massive networks with hundreds of millions of nodes, and billions of edges&quot; data-og-host=&quot;snap.stanford.edu&quot; data-og-source-url=&quot;https://snap.stanford.edu/index.html&quot; data-og-url=&quot;https://snap.stanford.edu/index.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/wogfn/hyVxxuY9UR/e4SzdBfBsaIqkbWt1A2oI0/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200&quot;&gt;&lt;a href=&quot;https://snap.stanford.edu/index.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://snap.stanford.edu/index.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/wogfn/hyVxxuY9UR/e4SzdBfBsaIqkbWt1A2oI0/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;SNAP: Stanford Network Analysis Project&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Stanford Network Analysis Project Stanford Network Analysis Platform (SNAP) is a general purpose network analysis and graph mining library. It is written in C++ and easily scales to massive networks with hundreds of millions of nodes, and billions of edges&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;snap.stanford.edu&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.1396%; text-align: center;&quot;&gt;&lt;b&gt;주요 특징&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.8604%; text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.1396%; text-align: center;&quot;&gt;&lt;b&gt;대규모&amp;nbsp;네트워크&amp;nbsp;처리&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.8604%;&quot;&gt;* 수억 개의 노드와 간선을 가진 대규모 네트워크를 효율적으로 처리 &lt;br /&gt;* 메모리&amp;nbsp;효율을&amp;nbsp;고려한&amp;nbsp;데이터&amp;nbsp;구조와&amp;nbsp;병렬&amp;nbsp;알고리즘&amp;nbsp;사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.1396%; text-align: center;&quot;&gt;&lt;b&gt;다양한 네트워크 유형&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.8604%;&quot;&gt;* 무향/유향/가중/다중 간선 그래프 등 여러 유형의 네트워크를 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.1396%; text-align: center;&quot;&gt;&lt;b&gt;네트워크 분석 알고리즘&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.8604%;&quot;&gt;* 연결 요소, 단절 집합, 최단경로, 중심성 등 다양한 분석 알고리즘 제공&lt;br /&gt;* 커뮤니티 탐지, 링크 예측, 시각화 기능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.1396%; text-align: center;&quot;&gt;&lt;b&gt;고성능 연산&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.8604%;&quot;&gt;* C++로 작성되어 높은 계산 성능&lt;br /&gt;* Python, Java, C# 언어에서도 사용 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.1396%; text-align: center;&quot;&gt;&lt;b&gt;다양한 네트워크 파일 형식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.8604%;&quot;&gt;* 간선 목록, 행렬, 페이스북 데이터 등 여러 파일 형식을 읽기/쓰기 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. igraph&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 네트워크 분석을 위한 오픈소스 라이브러리로, &lt;b&gt;C 라이브러리인 igraph의 핵심 기능&lt;/b&gt;을 Python에서 사용할 수 있도록 래핑한 라이브러리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* NetworkX와 유사한 점이 많지만, igraph는 대규모 네트워크 처리 성능이 더 뛰어나고 고급 분석 기능을 제공&lt;br /&gt;&amp;nbsp; - 다만, NetworkX에 비해 커뮤니티 활동이 다소 적은 편임&lt;/p&gt;
&lt;figure id=&quot;og_1710381107478&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;igraph &amp;ndash; Network analysis software&quot; data-og-description=&quot;igraph &amp;ndash; The network analysis package igraph is a collection of network analysis tools with the emphasis on efficiency, portability and ease of use. igraph is open source and free. igraph can be programmed in R, Python, Mathematica and&amp;nbsp;C/C++. igraph R p&quot; data-og-host=&quot;igraph.org&quot; data-og-source-url=&quot;https://igraph.org/&quot; data-og-url=&quot;https://igraph.org/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://igraph.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://igraph.org/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;igraph &amp;ndash; Network analysis software&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;igraph &amp;ndash; The network analysis package igraph is a collection of network analysis tools with the emphasis on efficiency, portability and ease of use. igraph is open source and free. igraph can be programmed in R, Python, Mathematica and&amp;nbsp;C/C++. igraph R p&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;igraph.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;table style=&quot;color: #333333; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.1395%; text-align: center;&quot;&gt;&lt;b&gt;주요 특징&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.8605%; text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.1395%; text-align: center;&quot;&gt;&lt;b&gt;다양한 네트워크 유형&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.8605%;&quot;&gt;* 무향/유향/가중 그래프 등 여러 유형의 네트워크를 지원&lt;br /&gt;* 대규모의 희소 행렬도 효율적으로 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.1395%; text-align: center;&quot;&gt;&lt;b&gt;네트워크 분석 알고리즘&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.8605%;&quot;&gt;* 연결성, 중심성, 커뮤니티 탐지, 레이아웃, 랜덤 네트워크 모델 등 광범위한 분석 알고리즘 제공&lt;br /&gt;* 다중 모드 네트워크, 계층 네트워크, 동적 네트워크 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.1395%; text-align: center;&quot;&gt;&lt;b&gt;고성능 연산&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.8605%;&quot;&gt;* C 라이브러리 기반으로 높은 계산 성능&lt;br /&gt;* 대규모 네트워크 분석에 적합&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.1395%; text-align: center;&quot;&gt;&lt;b&gt;다양한 네트워크 파일 형식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.8605%;&quot;&gt;* GEXF, GraphML, LGL, Pajek 등 여러 파일 형식을 읽기/쓰기 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.1395%; text-align: center;&quot;&gt;&lt;b&gt;시각화 기능&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.8605%;&quot;&gt;* 고급 시각화를 위해 Cairo, Matplotlib과 통합 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. graph-tool&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 효율적인 그래프 자료구조와 알고리즘을 제공하는 오픈소스 라이브러리로, &lt;b&gt;C++로 작성되어 높은 계산 성능&lt;/b&gt;을 가지며 파이썬에서 사용할 수 있도록 래핑됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* NetworkX보다 코드가 복잡할 수 있지만, graph-tool은 계산 성능과 메모리 효율성이 뛰어나 대규모 네트워크 분석에 적합하며 시각화 도구도 SNAP, igraph보다 강력함&lt;/p&gt;
&lt;figure id=&quot;og_1710381164093&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;graph-tool: Efficent network analysis with python&quot; data-og-description=&quot;Extensive Features An extensive array of features is included, such as support for arbitrary vertex, edge or graph properties, efficient &amp;quot;on the fly&amp;quot; filtering of vertices and edges, powerful graph I/O using the GraphML, GML and dot file formats, graph pic&quot; data-og-host=&quot;graph-tool.skewed.de&quot; data-og-source-url=&quot;https://graph-tool.skewed.de/&quot; data-og-url=&quot;https://graph-tool.skewed.de/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://graph-tool.skewed.de/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://graph-tool.skewed.de/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;graph-tool: Efficent network analysis with python&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Extensive Features An extensive array of features is included, such as support for arbitrary vertex, edge or graph properties, efficient &quot;on the fly&quot; filtering of vertices and edges, powerful graph I/O using the GraphML, GML and dot file formats, graph pic&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;graph-tool.skewed.de&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;table style=&quot;color: #333333; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.1395%; text-align: center;&quot;&gt;&lt;b&gt;주요 특징&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.8605%; text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.1395%; text-align: center;&quot;&gt;&lt;b&gt;대규모 네트워크 처리&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.8605%;&quot;&gt;* 수억 개의 노드와 간선을 가진 대규모 네트워크도 효율적으로 처리&lt;br /&gt;* 메모리 효율을 고려한 자료구조와 병렬 알고리즘을 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.1395%; text-align: center;&quot;&gt;&lt;b&gt;다양한 네트워크 유형&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.8605%;&quot;&gt;* 무향/유향/가중 그래프, 트리 등 여러 유형의 네트워크를 지원&lt;br /&gt;* 노드와 간선에 임의 속성을 부여 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.1395%; text-align: center;&quot;&gt;&lt;b&gt;네트워크 분석 알고리즘&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.8605%;&quot;&gt;* 연결성, 중심성, 커뮤니티 탐지, 레이아웃, 랜덤 네트워크 모델 등 광범위한 분석 알고리즘 제공&lt;br /&gt;* 다중 모드 네트워크, 계층 네트워크, 동적 네트워크 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.1395%; text-align: center;&quot;&gt;&lt;b&gt;시각화 기능&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.8605%;&quot;&gt;* 그래프 시각화 도구와 레이아웃 알고리즘을 내장&lt;br /&gt;* 대화형(Interactive) 시각화 및 3D 렌더링 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.1395%; text-align: center;&quot;&gt;&lt;b&gt;통합 그래프 분석 파이프라인&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.8605%;&quot;&gt;* 데이터 불러오기, 전처리, 알고리즘 실행, 결과 시각화까지 통합된 파이프라인 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. NetworKit&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 대규모 네트워크 분석을 위한 오픈소스 라이브러리로, C++로 작성되어 연산 효율이 뛰어나며 파이썬 인터페이스도 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 비교적 &lt;b&gt;최근에 개발된 라이브러리&lt;/b&gt;이며, NetworkX나 igraph에 비해 문서화 수준이 낮지만 지속적인 업데이트를 통해 점차 발전할 것으로 기대됨&lt;/p&gt;
&lt;figure id=&quot;og_1710381206785&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;NetworKit&quot; data-og-description=&quot;NetworKit is a growing open-source toolkit for large-scale network analysis. Its aim is to provide tools for the analysis of large networks in the size range from thousands to billions of edges. For this purpose, it implements efficient graph algorithms, m&quot; data-og-host=&quot;networkit.github.io&quot; data-og-source-url=&quot;https://networkit.github.io/&quot; data-og-url=&quot;https://networkit.github.io/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/opWRB/hyVxAeaTk1/3ZgZWw3ImUQSvPqAFDgLo0/img.png?width=1450&amp;amp;height=410&amp;amp;face=0_0_1450_410&quot;&gt;&lt;a href=&quot;https://networkit.github.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://networkit.github.io/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/opWRB/hyVxAeaTk1/3ZgZWw3ImUQSvPqAFDgLo0/img.png?width=1450&amp;amp;height=410&amp;amp;face=0_0_1450_410');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;NetworKit&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;NetworKit is a growing open-source toolkit for large-scale network analysis. Its aim is to provide tools for the analysis of large networks in the size range from thousands to billions of edges. For this purpose, it implements efficient graph algorithms, m&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;networkit.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;table style=&quot;color: #333333; text-align: start; border-collapse: collapse; width: 100%; height: 220px;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.1395%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;주요 특징&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.8605%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 33.1395%; text-align: center; height: 40px;&quot;&gt;&lt;b&gt;대규모 네트워크 처리&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.8605%; height: 40px;&quot;&gt;* 수억 개의 노드와 간선을 가진 대규모 네트워크도 효율적으로 처리&lt;br /&gt;* 메모리 효율을 고려한 자료구조와 병렬 알고리즘을 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 60px;&quot;&gt;
&lt;td style=&quot;width: 33.1395%; text-align: center; height: 60px;&quot;&gt;&lt;b&gt;네트워크 분석 알고리즘&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.8605%; height: 60px;&quot;&gt;* 연결성, 중심성, 커뮤니티 탐지, 링크 예측, 동적 네트워크 등 광범위한 분석 알고리즘 제공&lt;br /&gt;* 최신 연구 결과를 반영한 알고리즘도 포함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 33.1395%; text-align: center; height: 40px;&quot;&gt;&lt;b&gt;확장성과 유연성&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.8605%; height: 40px;&quot;&gt;* 새로운 알고리즘이나 데이터 구조를 쉽게 추가할 수 있는 모듈식 디자인&lt;br /&gt;* 다양한 입출력 형식을 지원하며, 사용자 정의 형식도 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.1395%; text-align: center;&quot;&gt;&lt;b&gt;파이썬 인터페이스&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.8605%;&quot;&gt;* 직관적인 파이썬 인터페이스를 제공&lt;br /&gt;* Jupyter Notebook과 통합도 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 33.1395%; text-align: center; height: 40px;&quot;&gt;&lt;b&gt;시각화 기능&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.8605%; height: 40px;&quot;&gt;* 그래프 시각화 도구와 레이아웃 알고리즘을 내장&lt;br /&gt;* 대화형(Interactive) 시각화 및 애니메이션 기능 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>인공지능/그래프</category>
      <category>graph-tool</category>
      <category>igraph</category>
      <category>NetworKit</category>
      <category>networkx</category>
      <category>snap</category>
      <category>그래프</category>
      <category>라이브러리</category>
      <category>머신러닝</category>
      <category>파이썬</category>
      <author>백관구</author>
      <guid isPermaLink="true">https://data-science-note.tistory.com/95</guid>
      <comments>https://data-science-note.tistory.com/95#entry95comment</comments>
      <pubDate>Thu, 14 Mar 2024 18:07:11 +0900</pubDate>
    </item>
    <item>
      <title>[그래프 ML] 에고 그래프 - 파이썬 NetworkX, Gephi</title>
      <link>https://data-science-note.tistory.com/94</link>
      <description>&lt;div class=&quot;book-toc&quot;&gt;
  &lt;p&gt;목차&lt;/p&gt;
  &lt;ul id=&quot;toc_list&quot;&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;※ 출처 : 그래프 머신러닝 (클라우디오 스타밀레 외, 김기성&amp;middot;장기식 옮김)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;※ 이전 글 참고&lt;/b&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1710375021849&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[그래프 ML] 그래프 데이터셋 - networkx, Network Repository, SNAP&quot; data-og-description=&quot;※ 출처 : 그래프 머신러닝 (클라우디오 스타밀레 외, 김기성&amp;middot;장기식 옮김) 1. networkx Graph generators &amp;mdash; NetworkX 3.2.1 documentation [0] D.G. Corneil, H. Lerchs, L.Stewart Burlingham, &amp;ldquo;Complement reducible graphs&amp;rdquo;, Discrete&quot; data-og-host=&quot;data-science-note.tistory.com&quot; data-og-source-url=&quot;https://data-science-note.tistory.com/93&quot; data-og-url=&quot;https://data-science-note.tistory.com/93&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/l4Xtn/hyVAD79DLQ/eBgl3AMTqafRztCDllk4f1/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/bYoUqs/hyVAIBCkrM/cSobkS6uK8LHxGLkKE8qXK/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/bBuIeK/hyVxDaUD8k/0gKCLk1Ki5xJCZNc9qKMbk/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://data-science-note.tistory.com/93&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://data-science-note.tistory.com/93&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/l4Xtn/hyVAD79DLQ/eBgl3AMTqafRztCDllk4f1/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/bYoUqs/hyVAIBCkrM/cSobkS6uK8LHxGLkKE8qXK/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/bBuIeK/hyVxDaUD8k/0gKCLk1Ki5xJCZNc9qKMbk/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[그래프 ML] 그래프 데이터셋 - networkx, Network Repository, SNAP&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;※ 출처 : 그래프 머신러닝 (클라우디오 스타밀레 외, 김기성&amp;middot;장기식 옮김) 1. networkx Graph generators &amp;mdash; NetworkX 3.2.1 documentation [0] D.G. Corneil, H. Lerchs, L.Stewart Burlingham, &amp;ldquo;Complement reducible graphs&amp;rdquo;, Discrete&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;data-science-note.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 파이썬 NetworkX 활용&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 특정 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;노드의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;에고 그래프(ego graph)&lt;/b&gt;를 그리려면 어떻게 해야할까?&lt;br /&gt;&amp;nbsp; - 근방 노드들을 모두 그릴수도 있지만, 개수가 많은 경우 관계를 파악하기 어려울 수 있기 때문에 아래와 같은 방법이 주로 사용됨&lt;br /&gt;&amp;nbsp; - &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;근방을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;임의&lt;/b&gt;로 선택 &lt;br /&gt;&amp;nbsp; - &lt;b&gt;중심성이 높은&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;근방을 선택&lt;/span&gt; &lt;br /&gt;&amp;nbsp; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;지역 군집 계수가 높은&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;근방을 선택&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1710375327735&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np
import matplotlib.pyplot as plt
plt.rc(&quot;font&quot;, family=&quot;Malgun Gothic&quot;)


n_top = round(len(neighbors) * 0.1)  # 근방 노드 중 10% 추출
idx = {
    &quot;랜덤&quot;: np.random.choice(neighbors, n_top ,replace=False),  # 임의로 선택
    &quot;중심성&quot;: stats.loc[neighbors].sort_values(&quot;betweenness_centrality&quot;, ascending=False).index[:n_top],  # 중심성 높은 근방 선택
    &quot;지역 군집 계수&quot;: stats.loc[neighbors].sort_values(&quot;C_i&quot;, ascending=False).index[:n_top]  # 지역 군집 계수 높은 근방 선택
}

fig, subs = plt.subplots(ncols=3, figsize=(15, 5))
for method, sub in zip([&quot;랜덤&quot;, &quot;중심성&quot;, &quot;지역 군집 계수&quot;], subs.flatten()):
    subgraph = nx.subgraph(G, list(idx[method]) + [5502])  # 부분그래프 추출
    nx.draw(subgraph, pos=nx.kamada_kawai_layout(subgraph),
            node_size=50,  # 노드 크기
            node_color=[&quot;k&quot;]*n_top+[&quot;r&quot;],  # 노드 색상(5502번만 red 색상)
            width=0.5,  # 간선 너비
            edge_color=&quot;grey&quot;,  # 간선 색상
            ax=sub)
    sub.set_title(method)  # 제목 설정&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;1182&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSSmpW/btsFIlcrS21/KVGk6jvaxoIdwnafmbHW71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSSmpW/btsFIlcrS21/KVGk6jvaxoIdwnafmbHW71/img.png&quot; data-alt=&quot;ASTRO-PH 5502번 에고 그래프(ego graph). 10% 추출 방식(랜덤, 중심성, 지역 군집 계수)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSSmpW/btsFIlcrS21/KVGk6jvaxoIdwnafmbHW71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSSmpW%2FbtsFIlcrS21%2FKVGk6jvaxoIdwnafmbHW71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1182&quot; height=&quot;426&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;1182&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ASTRO-PH 5502번 에고 그래프(ego graph). 10% 추출 방식(랜덤, 중심성, 지역 군집 계수)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. Gephi 활용&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* mtx 파일을 Gephi에서 사용하기 위해 데이터를 Gephi에서 인식할 수 있는 파일 형식(&lt;b&gt;GEXF; Graph Exchange XML Format&lt;/b&gt;)으로 내보내야 함&lt;/p&gt;
&lt;pre id=&quot;code_1710375404989&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;nx.write_gexf(G, &quot;astro_ph.gexf&quot;)  # GEXF 형식으로 내보내기&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1. Gephi 실행&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;① Welcome 화면에서 &quot;Open Graph File&quot;을 클릭&lt;br /&gt;② 위에서 저장한 &quot;astro_ph.gexf&quot; 파일을 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;371&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLpGBd/btsFJyI6QLx/dKKkddzOuIzN9GabRpWaY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLpGBd/btsFJyI6QLx/dKKkddzOuIzN9GabRpWaY0/img.png&quot; data-alt=&quot;초기화면에서 &amp;quot;Open Graph FIle&amp;quot; 선택&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLpGBd/btsFJyI6QLx/dKKkddzOuIzN9GabRpWaY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLpGBd%2FbtsFJyI6QLx%2FdKKkddzOuIzN9GabRpWaY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;335&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;371&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;초기화면에서 &quot;Open Graph FIle&quot; 선택&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;639&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vHSMh/btsFHrRIeT1/dhUwi6kbCWzIZenMrIj8o1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vHSMh/btsFHrRIeT1/dhUwi6kbCWzIZenMrIj8o1/img.png&quot; data-alt=&quot;&amp;quot;astro_ph.gexf&amp;quot; 파일 열기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vHSMh/btsFHrRIeT1/dhUwi6kbCWzIZenMrIj8o1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvHSMh%2FbtsFHrRIeT1%2FdhUwi6kbCWzIZenMrIj8o1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;423&quot; data-origin-width=&quot;639&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;&quot;astro_ph.gexf&quot; 파일 열기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccEpbT/btsFGVldFuq/Cmo7reUaG4zv2C5rGcI8b0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccEpbT/btsFGVldFuq/Cmo7reUaG4zv2C5rGcI8b0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccEpbT/btsFGVldFuq/Cmo7reUaG4zv2C5rGcI8b0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccEpbT%2FbtsFGVldFuq%2FCmo7reUaG4zv2C5rGcI8b0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;450&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오른쪽 위에 있는 [Context] 탭을 통해 16,706개 노드(Nodes)와 121,251개 간선(Edges)으로 구성된 그래프임을 확인 가능합니다. 이제 위에서 NetworkX를 활용해 작업했던 것처럼, 차수가 가장 높은 노드의 에고 그래프를 그리는 작업에 대해 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.2. 노드 차수 계산&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;① [Statistics] 탭 ▶ [Network Overview] ▶ &quot;Average Degree&quot;의 [Run] 실행&lt;br /&gt;② 좌측 상단 [Data Laboratory] 탭 ▶ &quot;Degree&quot; 열 클릭하여 내림차순 정렬하여 가장 높은 차수의 노드 Id 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bobr14/btsFJpljUUX/lWQMQCuknXXzuS3bot8Rs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bobr14/btsFJpljUUX/lWQMQCuknXXzuS3bot8Rs0/img.png&quot; data-alt=&quot;Average Degree 실행&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bobr14/btsFJpljUUX/lWQMQCuknXXzuS3bot8Rs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbobr14%2FbtsFJpljUUX%2FlWQMQCuknXXzuS3bot8Rs0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;466&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;640&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Average Degree 실행&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/on1uh/btsFJKpf9XP/Om4qaOPnk4l96dI2MERKK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/on1uh/btsFJKpf9XP/Om4qaOPnk4l96dI2MERKK1/img.png&quot; data-alt=&quot;Data Laboratory&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/on1uh/btsFJKpf9XP/Om4qaOPnk4l96dI2MERKK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fon1uh%2FbtsFJKpf9XP%2FOm4qaOPnk4l96dI2MERKK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;450&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Data Laboratory&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.3. 에고 그래프(Ego graph) 생성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;① [Filters] 탭 ▶ [Topology] ▶ &quot;Giant Component&quot; 필터를 아래 Queries로 드래그&lt;br /&gt;② &quot;Ego Network&quot; 필터를 아래 Giant Component의 &quot;subfilter&quot;로 드래그&lt;br /&gt;③ Ego Network를 클릭하여 &quot;Node ID&quot;에 5502 입력하고 &quot;OK&quot; 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMsAXg/btsFGNgeJyU/8iOIyMymUEzJKNC06dixIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMsAXg/btsFGNgeJyU/8iOIyMymUEzJKNC06dixIk/img.png&quot; data-alt=&quot;5502번 노드의 에고 그래프(ego graph)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMsAXg/btsFGNgeJyU/8iOIyMymUEzJKNC06dixIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMsAXg%2FbtsFGNgeJyU%2F8iOIyMymUEzJKNC06dixIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;450&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;5502번 노드의 에고 그래프(ego graph)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.4. 가시성 개선 : 노드/간선 색상, 노드 크기 변경&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 노드 색상을 모듈성 기준으로, 간선 색상을 단일 색상인 회색으로 변경&lt;br /&gt;* 노드 크기를 차수 기준으로 변경 &lt;br /&gt;① [Statistics] 탭 ▶ [Community Detection] 탭 ▶ &quot;Modularity&quot;의 [Run] 실행&lt;br /&gt;② [Appearance] 탭 ▶ [Nodes] 팔레트(Color) 아이콘 ▶ [Partition]에서 &quot;Modularity Class&quot; 선택하고 [Apply] 적용&lt;br /&gt;③ &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;[Edges]&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;팔레트(Color) 아이콘 ▶&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;[Unique]에서 회색 선택하고 [Apply] 적용&lt;br /&gt;④ [Nodes] 동심원(Size) 아이콘 ▶ [Ranking]에서 &quot;Degree&quot; 선택하고 Max size에 50 입력 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYwyqm/btsFGNmZmpZ/Kd51ByCLmozOEjzu2cuoJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYwyqm/btsFGNmZmpZ/Kd51ByCLmozOEjzu2cuoJK/img.png&quot; data-alt=&quot;노드 색상 변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYwyqm/btsFGNmZmpZ/Kd51ByCLmozOEjzu2cuoJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYwyqm%2FbtsFGNmZmpZ%2FKd51ByCLmozOEjzu2cuoJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;450&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;노드 색상 변경&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cG58YA/btsFJyvEyzi/k0e8iFMAcfur4Lx3n8IKj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cG58YA/btsFJyvEyzi/k0e8iFMAcfur4Lx3n8IKj0/img.png&quot; data-alt=&quot;간선 색상 변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cG58YA/btsFJyvEyzi/k0e8iFMAcfur4Lx3n8IKj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcG58YA%2FbtsFJyvEyzi%2Fk0e8iFMAcfur4Lx3n8IKj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;450&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;간선 색상 변경&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boSM1I/btsFIjeQGOO/zEKG2HRu8jtYCXEbJVZLsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boSM1I/btsFIjeQGOO/zEKG2HRu8jtYCXEbJVZLsK/img.png&quot; data-alt=&quot;노드 크기 변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boSM1I/btsFIjeQGOO/zEKG2HRu8jtYCXEbJVZLsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboSM1I%2FbtsFIjeQGOO%2FzEKG2HRu8jtYCXEbJVZLsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;450&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;노드 크기 변경&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.5. 가시성 개선 : 레이아웃 변경&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 레이아웃을 Fruchterman Reingold로 변경&lt;br /&gt;① [Layout] 탭 ▶ &quot;Fruchterman Reingold&quot; 선택하고 [Run] 실행&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xGIwT/btsFHuucCGU/kQMnHI4PbVEjKizKklDV0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xGIwT/btsFHuucCGU/kQMnHI4PbVEjKizKklDV0k/img.png&quot; data-alt=&quot;레이아웃 변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xGIwT/btsFHuucCGU/kQMnHI4PbVEjKizKklDV0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxGIwT%2FbtsFHuucCGU%2FkQMnHI4PbVEjKizKklDV0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;450&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;레이아웃 변경&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.6. 가시성 개선 : 노드 라벨 추가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 노드 라벨을 추가하고, 글자 크기를 차수 기준으로 변경&lt;br /&gt;① 화면 하단 T 아이콘(Show Node Labels) 클릭&lt;br /&gt;② [Appearance] 탭 ▶ [Nodes] TT (Label Size) 아이콘 ▶ [Ranking]에서 &quot;Degree&quot; 선택하고 Min size 0.5, Max size 1 입력&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsfloe/btsFI6l5hny/d3V29lEU5UU5P0OrtVl8C1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsfloe/btsFI6l5hny/d3V29lEU5UU5P0OrtVl8C1/img.png&quot; data-alt=&quot;노드 라벨 추가&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsfloe/btsFI6l5hny/d3V29lEU5UU5P0OrtVl8C1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdsfloe%2FbtsFI6l5hny%2Fd3V29lEU5UU5P0OrtVl8C1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;450&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;노드 라벨 추가&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>인공지능/그래프</category>
      <category>Gephi</category>
      <category>networkx</category>
      <category>그래프</category>
      <category>머신러닝</category>
      <category>에고그래프</category>
      <category>파이썬</category>
      <author>백관구</author>
      <guid isPermaLink="true">https://data-science-note.tistory.com/94</guid>
      <comments>https://data-science-note.tistory.com/94#entry94comment</comments>
      <pubDate>Thu, 14 Mar 2024 17:28:47 +0900</pubDate>
    </item>
    <item>
      <title>[그래프 ML] 그래프 데이터셋 - NetworkX, Network Repository, SNAP (Stanford Network Analysis Platform), OGB (Open Graph Benchmark)</title>
      <link>https://data-science-note.tistory.com/93</link>
      <description>&lt;div class=&quot;book-toc&quot;&gt;
  &lt;p&gt;목차&lt;/p&gt;
  &lt;ul id=&quot;toc_list&quot;&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;※ 출처 : 그래프 머신러닝 (클라우디오 스타밀레 외, 김기성&amp;middot;장기식 옮김)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. NetworkX&lt;/b&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1710138751826&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Graph generators &amp;mdash; NetworkX 3.2.1 documentation&quot; data-og-description=&quot;[0] D.G. Corneil, H. Lerchs, L.Stewart Burlingham, &amp;ldquo;Complement reducible graphs&amp;rdquo;, Discrete Applied Mathematics, Volume 3, Issue 3, 1981, Pages 163-174, ISSN 0166-218X.&quot; data-og-host=&quot;networkx.org&quot; data-og-source-url=&quot;https://networkx.org/documentation/stable/reference/generators.html&quot; data-og-url=&quot;https://networkx.org/documentation/stable/reference/generators.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://networkx.org/documentation/stable/reference/generators.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://networkx.org/documentation/stable/reference/generators.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Graph generators &amp;mdash; NetworkX 3.2.1 documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;[0] D.G. Corneil, H. Lerchs, L.Stewart Burlingham, &amp;ldquo;Complement reducible graphs&amp;rdquo;, Discrete Applied Mathematics, Volume 3, Issue 3, 1981, Pages 163-174, ISSN 0166-218X.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;networkx.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 네트워크 저장소(Network Repository)&lt;/b&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1710138920622&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Network Data Repository | The First Interactive Network Data Repository&quot; data-og-description=&quot;The first interactive network dataset repository with interactive graph visualization and analytics&quot; data-og-host=&quot;networkrepository.com&quot; data-og-source-url=&quot;https://networkrepository.com/&quot; data-og-url=&quot;https://networkrepository.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/vkH2i/hyVxw9Yn9b/JNIBn0deD0m2IUZ5Zqsi2k/img.png?width=402&amp;amp;height=407&amp;amp;face=0_0_402_407&quot;&gt;&lt;a href=&quot;https://networkrepository.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://networkrepository.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/vkH2i/hyVxw9Yn9b/JNIBn0deD0m2IUZ5Zqsi2k/img.png?width=402&amp;amp;height=407&amp;amp;face=0_0_402_407');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Network Data Repository | The First Interactive Network Data Repository&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The first interactive network dataset repository with interactive graph visualization and analytics&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;networkrepository.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 여기서는 &lt;b&gt;ASTRO-PH 그래프 데이터셋&lt;/b&gt;을 살펴보겠습니다. ASTRO-PH 그래프는 1993년 1월부터 2003년 4월까지 천체 물리학 분야에 게시된 arXiv 저장소에서 확인할 수 있는 과학 논문을 사용해 생성되었습니다. 위 링크를 따라 접속한 후, 검색 박스에 &quot;ASTRO-PH&quot;를 검색합니다. 아래와 같은 화면에서 압축파일(ZIP)을 다운로드 받고 작업할 폴더에 압축 해제를 진행합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;967&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O0orV/btsFGjTx1hR/GOxtkUkHG7L4pDXkdyNT3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O0orV/btsFGjTx1hR/GOxtkUkHG7L4pDXkdyNT3K/img.png&quot; data-alt=&quot;ASTRO-PH 데이터셋&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O0orV/btsFGjTx1hR/GOxtkUkHG7L4pDXkdyNT3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO0orV%2FbtsFGjTx1hR%2FGOxtkUkHG7L4pDXkdyNT3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;428&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;967&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ASTRO-PH 데이터셋&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;89&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csDuGb/btsFEZ2c1lZ/Iv4ZHXeJHVxr9KJbTVAw20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csDuGb/btsFEZ2c1lZ/Iv4ZHXeJHVxr9KJbTVAw20/img.png&quot; data-alt=&quot;ASTRO-PH 압축 해제&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csDuGb/btsFEZ2c1lZ/Iv4ZHXeJHVxr9KJbTVAw20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsDuGb%2FbtsFEZ2c1lZ%2FIv4ZHXeJHVxr9KJbTVAw20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;350&quot; height=&quot;84&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;89&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ASTRO-PH 압축 해제&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 압축파일을 풀면 위 화면과 같이 &quot;astro-ph.mtx&quot;라는 파일이 보입니다. 우선 이 파일은 제껴두고 아래 readme.html 파일부터 열어보겠습니다. 만약 이 데이터셋을 사용하여 출처를 밝혀야 할 일이 있을 때, 아래와 같이 작성하라는 가이드가 들어있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czuKc9/btsFGL9Ivsz/3gM1nfUC7yvicAKauqptSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czuKc9/btsFGL9Ivsz/3gM1nfUC7yvicAKauqptSk/img.png&quot; data-alt=&quot;readme.html&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czuKc9/btsFGL9Ivsz/3gM1nfUC7yvicAKauqptSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczuKc9%2FbtsFGL9Ivsz%2F3gM1nfUC7yvicAKauqptSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;421&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;444&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;readme.html&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 이번에는 &lt;b&gt;astro-ph.mtx&lt;/b&gt; 파일을 열어볼 차례입니다. 먼저, 윈도우에서 제공하는 워드패드를 사용해 파일을 열어보겠습니다. 상당히 많은 행(줄)으로 데이터가 입력되어 있습니다. 이 mtx 형식의 파일을 파이썬에서 어떻게 읽고 작업할 수 있는지 알아보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;341&quot; data-origin-height=&quot;126&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xTeFu/btsFE3jfqtq/RKXqVBkzgJUWvbumRzcN4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xTeFu/btsFE3jfqtq/RKXqVBkzgJUWvbumRzcN4k/img.png&quot; data-alt=&quot;astro-ph.mtx 일부&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xTeFu/btsFE3jfqtq/RKXqVBkzgJUWvbumRzcN4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxTeFu%2FbtsFE3jfqtq%2FRKXqVBkzgJUWvbumRzcN4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;111&quot; data-origin-width=&quot;341&quot; data-origin-height=&quot;126&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;astro-ph.mtx 일부&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1. MTX (Matrix Market Exchange Format) 파일 형식&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;b&gt;ASCII (American Standard Code for Information Interchange)&lt;/b&gt; 형식의 텍스트 파일을 통해 실수나 복소수 행렬, 희소 행렬을 지정하기 위한 파일 형식&lt;br /&gt;&amp;nbsp; - 헤더에는 아래와 같이 시작 부분에 &lt;b&gt;%%&lt;/b&gt;가 위치함&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;%%MatrixMarket matrix coordinate real symmetric&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 파이썬의 &lt;b&gt;Scipy&lt;/b&gt; 라이브러리를 사용해 읽을 수 있음&lt;/p&gt;
&lt;pre id=&quot;code_1710141098739&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from scipy.io import mmread
import networkx as nx


matrix = mmread(&quot;../data/network_repository/astro-ph/astro-ph.mtx&quot;)  # mtx 파일 읽기
G = nx.from_scipy_sparse_array(matrix)  # scipy matrix를 networkx 형식으로 변환

print(f&quot;그래프 위수 (노드 개수): {G.order()}&quot;)
print(f&quot;그래프 크기 (간선 개수): {G.size()}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;그래프 위수 (노드 개수): 16706&lt;br /&gt;그래프 크기 (간선 개수): 121251&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.2. 측정지표 분석&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;① 매개 중심성(Betweenness Centrality), 지역 군집 계수(Local Clustering Coefficient), 노드 차수(Degree) 연산&lt;/p&gt;
&lt;pre id=&quot;code_1710205561505&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;betweenness_centrality = nx.centrality.betweenness_centrality(G)  # 매개 중심성
clustering = nx.clustering(G)  # 지역 군집 계수
degree = dict(nx.degree(G))  # 노드 차수

print(f&quot;매개 중심성: {betweenness_centrality}&quot;)
print(f&quot;지역 군집 계수: {clustering}&quot;)
print(f&quot;노드 차수: {degree}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;매개 중심성: {0: 0.003160341116179179, 1: 0.0, 2: 0.0002895806033400033, 3: 0.0003601880676500333, 4: 0.0001708166540733188, 5: 0.00050286583593598, ...}&lt;br /&gt;&lt;br /&gt;지역 군집 계수: {0: 0.06031746031746032, 1: 0, 2: 0.2, 3: 0.16666666666666666, 4: 0.49166666666666664, 5: 0.08088235294117647, ...}&lt;br /&gt;&lt;br /&gt;노드 차수: {0: 36, 1: 1, 2: 5, 3: 4, 4: 16, 5: 17, ...}&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;② pandas.DataFrame으로 변환&lt;/p&gt;
&lt;pre id=&quot;code_1710206315947&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os
import pandas as pd


stats = pd.DataFrame({
    &quot;betweenness_centrality&quot;: betweenness_centrality,
    &quot;C_i&quot;: clustering,
    &quot;degree&quot;: degree
})

os.makedirs(&quot;04_read_mtx&quot;, exist_ok=True)  # 저장할 디렉토리 생성
stats.to_csv(&quot;astro_ph_metrics.csv&quot;)  # CSV 형식으로 파일 저장
stats&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;betweenness_centrality&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;C_i degree &lt;br /&gt;0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.003160 0.060317&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 36 &lt;br /&gt;1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.000000 0.000000&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1 &lt;br /&gt;2&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.000290 0.200000&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 5 &lt;br /&gt;3&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.000360 0.166667&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 4 &lt;br /&gt;4&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.000171 0.491667&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 16 &lt;br /&gt;...&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;...&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;...&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;... &lt;br /&gt;16701&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.000000 0.000000&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0 &lt;br /&gt;16702&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.000000 1.000000&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 10 &lt;br /&gt;16703&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.000000 1.000000&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 10 &lt;br /&gt;16704&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.000000 1.000000&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 10 &lt;br /&gt;16705&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.000000 1.000000&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 10 &lt;br /&gt;16706&amp;nbsp;rows&amp;nbsp;&amp;times;&amp;nbsp;3&amp;nbsp;columns&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;③ 차수 기준 내림차순 정렬&lt;br /&gt;&amp;nbsp; - 가장 큰 차수를 가진 5502번 노드가 360개의 근방으로 연결되는 것을 통해, 이 분야에서 핵심적인 인물이라는 것을 유추할 수 있음&lt;/p&gt;
&lt;pre id=&quot;code_1710208103870&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;stats.sort_values(&quot;degree&quot;, ascending=False).head()&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;betweenness_centrality&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; C_i degree&lt;br /&gt;5502&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.011944 0.100155&amp;nbsp; &amp;nbsp; &amp;nbsp;360&lt;br /&gt;912&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.016902 0.100856&amp;nbsp; &amp;nbsp; &amp;nbsp;353&lt;br /&gt;1231&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.015462 0.092242&amp;nbsp; &amp;nbsp; &amp;nbsp;329&lt;br /&gt;5507&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.008890 0.121367&amp;nbsp; &amp;nbsp; &amp;nbsp;299 &lt;br /&gt;6197&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.008748 0.116170&amp;nbsp; &amp;nbsp; &amp;nbsp;296&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 스탠포드 네트워크 분석 플랫폼(SNAP; Stanford Network Analysis Platform)&lt;/b&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1710229831254&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;SNAP: Stanford Network Analysis Project&quot; data-og-description=&quot;Stanford Network Analysis Project Stanford Network Analysis Platform (SNAP) is a general purpose network analysis and graph mining library. It is written in C++ and easily scales to massive networks with hundreds of millions of nodes, and billions of edges&quot; data-og-host=&quot;snap.stanford.edu&quot; data-og-source-url=&quot;https://snap.stanford.edu/&quot; data-og-url=&quot;https://snap.stanford.edu/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bZ2tA7/hyVxoxKSoz/otkzmG0xXA0KE0PQXNHft1/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200&quot;&gt;&lt;a href=&quot;https://snap.stanford.edu/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://snap.stanford.edu/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bZ2tA7/hyVxoxKSoz/otkzmG0xXA0KE0PQXNHft1/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;SNAP: Stanford Network Analysis Project&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Stanford Network Analysis Project Stanford Network Analysis Platform (SNAP) is a general purpose network analysis and graph mining library. It is written in C++ and easily scales to massive networks with hundreds of millions of nodes, and billions of edges&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;snap.stanford.edu&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1243&quot; data-origin-height=&quot;880&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tD80B/btsFMISgweJ/hmuSMgZv1pIwFJkdZ4loSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tD80B/btsFMISgweJ/hmuSMgZv1pIwFJkdZ4loSK/img.png&quot; data-alt=&quot;SNAP 홈페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tD80B/btsFMISgweJ/hmuSMgZv1pIwFJkdZ4loSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtD80B%2FbtsFMISgweJ%2FhmuSMgZv1pIwFJkdZ4loSK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;425&quot; data-origin-width=&quot;1243&quot; data-origin-height=&quot;880&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SNAP 홈페이지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 여기서는 &quot;amazon0302&quot; 데이터셋을 다운로드 받아 사용하겠습니다. SNAP 홈페이지 좌측 탭 중 [SNAP Datasets]를 클릭합니다. 그리고 &quot;Amazon networks&quot;를 선택하면 Amazon과 관련된 여러 데이터셋을 볼 수 있습니다. 그 중 &quot;amazon0302&quot;를 클릭하고, 아래와 같은 페이지 하단에 있는 압축파일(.gz)을 다운로드해 압축을 풀어줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;879&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bk8RVp/btsFKNN4bwq/xaEgKK5iewOzrBFPKZVjKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bk8RVp/btsFKNN4bwq/xaEgKK5iewOzrBFPKZVjKk/img.png&quot; data-alt=&quot;amazon0302 데이터셋 설명&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bk8RVp/btsFKNN4bwq/xaEgKK5iewOzrBFPKZVjKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk8RVp%2FbtsFKNN4bwq%2FxaEgKK5iewOzrBFPKZVjKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;448&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;879&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;amazon0302 데이터셋 설명&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;76&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n3VbG/btsFJ6AiOus/HIMhRoBURznwWBcDp2I9L1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n3VbG/btsFJ6AiOus/HIMhRoBURznwWBcDp2I9L1/img.png&quot; data-alt=&quot;amazon0302 압축 해제&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n3VbG/btsFJ6AiOus/HIMhRoBURznwWBcDp2I9L1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn3VbG%2FbtsFJ6AiOus%2FHIMhRoBURznwWBcDp2I9L1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;350&quot; height=&quot;73&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;76&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;amazon0302 압축 해제&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 이번에는 텍스트 파일 형식(txt)으로 그래프 데이터가 구성되어 있습니다. 워드패드를 통해 파일을 열어보겠습니다. 데이터에 대한 설명과 간단한 그래프 정보가 포함되어 있습니다. 0&amp;nbsp; &amp;nbsp; 1, 0&amp;nbsp; &amp;nbsp; 2 부분은 간선 정보를 가리킵니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;547&quot; data-origin-height=&quot;200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8zTwm/btsFMOETqZ5/UdFOOKfF8j8zS3mkn4vs20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8zTwm/btsFMOETqZ5/UdFOOKfF8j8zS3mkn4vs20/img.png&quot; data-alt=&quot;amazon0302.txt&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8zTwm/btsFMOETqZ5/UdFOOKfF8j8zS3mkn4vs20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8zTwm%2FbtsFMOETqZ5%2FUdFOOKfF8j8zS3mkn4vs20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;183&quot; data-origin-width=&quot;547&quot; data-origin-height=&quot;200&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;amazon0302.txt&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1. 파이썬 NetworkX 사용해 읽기&lt;/h3&gt;
&lt;pre id=&quot;code_1710378368421&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import networkx as nx


G = nx.read_edgelist(&quot;amazon0302.txt&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.2. 파이썬 SNAP 사용해 읽기&lt;/h3&gt;
&lt;pre id=&quot;code_1710378429259&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; python -m pip install snap-stanford&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 아래의 코드를 실행하면 SNAP 라이브러리의 무향 그래프(PNGraph) 객체를 받게 되지만, 이 객체에서 NetworkX의 기능들을 사용할 수 없습니다. 따라서 NetworkX 기능을 사용하려면, SNAP 그래프 객체를 NetworkX 그래프 객체로 변환해야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1710379408536&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import snap


snap_G = snap.LoadEdgeList(snap.PNGraph,  # 생성할 그래프 유형(PNGraph: 무향 그래프, TNGraph: 유향 그래프)
                      &quot;amazon0302.txt&quot;,  # 간선 목록이 포함된 입력 파일
                      SrcColId=0, DstColId=1,  # SrcColId / DstColId: 근원(Src)/타겟(Dst) 노드 ID가 있는 열의 인덱스
                      Separator=&quot;\t&quot;)  # Separator: 입력 파일에서 필드를 구분하는 기호&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.3. 파이썬 SNAP 그래프를 NetworkX 그래프로 변환&lt;/h3&gt;
&lt;pre id=&quot;code_1710380194978&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def snap2networkx(snap_G):
    &quot;&quot;&quot;
    snap 그래프를 networkx 그래프로 변환하는 함수
    
    Args:
        snap_G: snap 그래프 객체 (snap.PNGraph, snap.TNGraph 등)
    
    Returns:
        nx_G: networkx 그래프 객체
    &quot;&quot;&quot;
    
    # networkx 그래프 객체 생성
    if isinstance(snap_G, snap.TNGraph):  # 유향 그래프
        nx_G = nx.DiGraph()
    else:  # 무향 그래프
        nx_G = nx.Graph()
    
    # 노드 추가
    for node in snap_G.Nodes():
        nx_G.add_node(node.GetId())
    
    # 간선 추가
    for edge in snap_G.Edges():
        nx_G.add_edge(edge.GetSrcNId(), edge.GetDstNId())  # 근원(Src)/타겟(Dst) 노드 ID (NId)
    
    return nx_G


nx_G = snap2networkx(snap_G)  # snap_G: snap 그래프, nx_G: networkx 그래프&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 오픈 그래프 벤치마크(OGB; Open Graph Benchmark)&lt;/b&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1710380345903&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Open Graph Benchmark&quot; data-og-description=&quot;A collection of benchmark datasets, data-loaders and evaluators for graph machine learning in PyTorch.&quot; data-og-host=&quot;ogb.stanford.edu&quot; data-og-source-url=&quot;https://ogb.stanford.edu/&quot; data-og-url=&quot;https://snap-stanford.github.io/ogb-web/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/edSk1c/hyVxASLDug/2orbVqelNUGvutcyp3KKk1/img.png?width=1868&amp;amp;height=380&amp;amp;face=0_0_1868_380,https://scrap.kakaocdn.net/dn/rL5Ma/hyVAyMyiut/2tYARdI1WyTwbvVTgbDSWK/img.png?width=1945&amp;amp;height=283&amp;amp;face=0_0_1945_283,https://scrap.kakaocdn.net/dn/pQt11/hyVxsHeGWO/SnkTllL4cP5C0oKKS6nATk/img.png?width=855&amp;amp;height=541&amp;amp;face=0_0_855_541&quot;&gt;&lt;a href=&quot;https://ogb.stanford.edu/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ogb.stanford.edu/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/edSk1c/hyVxASLDug/2orbVqelNUGvutcyp3KKk1/img.png?width=1868&amp;amp;height=380&amp;amp;face=0_0_1868_380,https://scrap.kakaocdn.net/dn/rL5Ma/hyVAyMyiut/2tYARdI1WyTwbvVTgbDSWK/img.png?width=1945&amp;amp;height=283&amp;amp;face=0_0_1945_283,https://scrap.kakaocdn.net/dn/pQt11/hyVxsHeGWO/SnkTllL4cP5C0oKKS6nATk/img.png?width=855&amp;amp;height=541&amp;amp;face=0_0_855_541');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Open Graph Benchmark&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A collection of benchmark datasets, data-loaders and evaluators for graph machine learning in PyTorch.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ogb.stanford.edu&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>인공지능/그래프</category>
      <category>MTX</category>
      <category>Network Repository</category>
      <category>networkx</category>
      <category>OGB</category>
      <category>snap</category>
      <category>그래프</category>
      <category>데이터셋</category>
      <category>머신러닝</category>
      <author>백관구</author>
      <guid isPermaLink="true">https://data-science-note.tistory.com/93</guid>
      <comments>https://data-science-note.tistory.com/93#entry93comment</comments>
      <pubDate>Tue, 12 Mar 2024 17:53:07 +0900</pubDate>
    </item>
    <item>
      <title>[그래프 ML] 그래프 생성 - 파이썬 NetworkX</title>
      <link>https://data-science-note.tistory.com/92</link>
      <description>&lt;div class=&quot;book-toc&quot;&gt;
  &lt;p&gt;목차&lt;/p&gt;
  &lt;ul id=&quot;toc_list&quot;&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;※ 출처 : 그래프 머신러닝 (클라우디오 스타밀레 외, 김기성&amp;middot;장기식 옮김)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;※ 이전 글 참고&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://data-science-note.tistory.com/89&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2024.03.08 - [인공지능/그래프] - [그래프 ML] 파이썬 networkx 시작하기&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://data-science-note.tistory.com/91&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2024.03.11 - [인공지능/그래프] - [그래프 ML] 그래프 속성 - 파이썬 networkx&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 간단한 그래프&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.1. 완전 연결 무향 그래프(Fully Connected Undirected Graph)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* $n$개의 노드일 때, $\frac{n(n-1)}{2}$개의 간선과 군집 계수 $C=1$을 가짐&lt;br /&gt;* 더 큰 그래프를 구성하는 &lt;b&gt;기본 구성 요소(building block)&lt;/b&gt;&lt;br /&gt;&amp;nbsp; - $n$개의 노드로 구성된 완전 연결 부분그래프를 크기가 $n$인 &lt;b&gt;클리크(clique)&lt;/b&gt;라 함&lt;br /&gt;&amp;nbsp; - 클리크를 찾는 작업(clique problem)은 컴퓨터 공학에서 연구되는 비결정적 다항시간 완전(NP-complete) 문제로 밝혀짐&lt;/p&gt;
&lt;pre id=&quot;code_1710131256859&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import networkx as nx


fully_connected_undirected_G = nx.complete_graph(n=7)
nx.draw(fully_connected_undirected_G, with_labels=True)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;499&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKsxye/btsFF0GsaRi/g7a3EjbikXZUenVmzRmUAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKsxye/btsFF0GsaRi/g7a3EjbikXZUenVmzRmUAk/img.png&quot; data-alt=&quot;완전 연결 무향 그래프(Fully Connected Undirected Graph)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKsxye/btsFF0GsaRi/g7a3EjbikXZUenVmzRmUAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKsxye%2FbtsFF0GsaRi%2Fg7a3EjbikXZUenVmzRmUAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;454&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;499&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;완전 연결 무향 그래프(Fully Connected Undirected Graph)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.2. 롤리팝 그래프(Lollipop Graph)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 크기가 $m$인 클리크와 $n$개 노드의 가지(branch)가 있는 그래프&lt;/p&gt;
&lt;pre id=&quot;code_1710132331842&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;lollipop_G = nx.lollipop_graph(m=7, n=3)  # m: 클리크 크기, n: 가지의 노드 개수
nx.draw(lollipop_G, with_labels=True)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;499&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blqDaQ/btsFGAUOIoW/aBJC98KvQPtKdDFM76yi5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blqDaQ/btsFGAUOIoW/aBJC98KvQPtKdDFM76yi5k/img.png&quot; data-alt=&quot;롤리팝 그래프(Lollipop Graph)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blqDaQ/btsFGAUOIoW/aBJC98KvQPtKdDFM76yi5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblqDaQ%2FbtsFGAUOIoW%2FaBJC98KvQPtKdDFM76yi5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;454&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;499&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;롤리팝 그래프(Lollipop Graph)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.3. 바벨 그래프(Barbell Graph)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 크기가 $m1$인 클리크 2개가 $m2$개 노드의 가지로 연결된 그래프&lt;/p&gt;
&lt;pre id=&quot;code_1710132661947&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;barbell_G = nx.barbell_graph(m1=7, m2=4)  # m1: 클리크 크기, m2: 가지의 노드 개수
nx.draw(barbell_G, with_labels=True)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;499&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sPDFm/btsFGqdvGnu/wdxt1lP4nTXiLz1j6lppC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sPDFm/btsFGqdvGnu/wdxt1lP4nTXiLz1j6lppC0/img.png&quot; data-alt=&quot;바벨 그래프(Barbell Graph)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sPDFm/btsFGqdvGnu/wdxt1lP4nTXiLz1j6lppC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsPDFm%2FbtsFGqdvGnu%2Fwdxt1lP4nTXiLz1j6lppC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;454&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;499&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;바벨 그래프(Barbell Graph)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.4. 그래프 병합&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* networkx.disjoint_union_all 함수 사용&lt;/p&gt;
&lt;pre id=&quot;code_1710133835241&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np


all_G = nx.disjoint_union_all([fully_connected_undirected_G, lollipop_G, barbell_G])
for _ in range(2):  # 임의의 간선 추가
    all_G.add_edge(np.random.choice(all_G.nodes), np.random.choice(all_G.nodes))

nx.draw(all_G, with_labels=True)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;499&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lazhQ/btsFGVdqZmW/3Z1Z3op2OItxBWXW1JrE3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lazhQ/btsFGVdqZmW/3Z1Z3op2OItxBWXW1JrE3k/img.png&quot; data-alt=&quot;완전 연결 무향 그래프, 롤리팝 그래프, 바벨 그래프 병합&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lazhQ/btsFGVdqZmW/3Z1Z3op2OItxBWXW1JrE3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlazhQ%2FbtsFGVdqZmW%2F3Z1Z3op2OItxBWXW1JrE3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;454&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;499&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;완전 연결 무향 그래프, 롤리팝 그래프, 바벨 그래프 병합&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 그래프 생성 모델&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 그래프가 자동으로 성장하는 확률 모델(probabilistic model)과 생성 모델(generative model)로 그래프를 구성할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1. 와츠-스트로가츠 모델(Watts-Strogatz Model; 1998)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;b&gt;작은세상 네트워크(Small-world network)&lt;/b&gt;를 생성하는 대표적인 그래프 생성 모델&lt;br /&gt;&amp;nbsp; - 작은세상 네트워크(Small-world network) : 높은 군집화 계수, 짧은 평균 경로 길이를 갖는 네트워크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 생성 과정&lt;br /&gt;&amp;nbsp; 1. 고리 격자(Ring lattice) 구조의 정규 그래프를 생성&lt;br /&gt;&amp;nbsp; &amp;nbsp; . 각 노드는 양쪽으로 일정 거리 이내의 노드들과 연결됨&lt;br /&gt;&amp;nbsp; 2. 각 간선에 대해 일정 재배선 확률(rewiring probability; $p$)로 한쪽 끝을 다른 임의의 노드로 재배선&lt;/p&gt;
&lt;pre id=&quot;code_1710135089798&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;G = nx.watts_strogatz_graph(n=20, k=5, p=0.2)  # n: 노드 개수, k: 이웃 노드 개수(n의 절반보다 작아야 함), p: 재배선 확률(0~1)
nx.draw(G)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;499&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgz5tM/btsFGj0dT1Y/OX3PrMUF5zAiR8KpGgqco0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgz5tM/btsFGj0dT1Y/OX3PrMUF5zAiR8KpGgqco0/img.png&quot; data-alt=&quot;와츠-스트로가츠 모델(Watts-Strogatz Model; 1998)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgz5tM/btsFGj0dT1Y/OX3PrMUF5zAiR8KpGgqco0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdgz5tM%2FbtsFGj0dT1Y%2FOX3PrMUF5zAiR8KpGgqco0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;454&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;499&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;와츠-스트로가츠 모델(Watts-Strogatz Model; 1998)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.2. 바라바시-알베르트 모델(Barabasi-Albert Model; 1999)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;b&gt;척도없는 네트워크(Scale-free network)&lt;/b&gt;를 생성하는 대표적인 그래프 생성 모델&lt;br /&gt;&amp;nbsp; - 척도없는 네트워크(Scale-free network) : 노드 차수 분포가 멱함수 분포를 따르는 네트워크&lt;br /&gt;&amp;nbsp; &amp;nbsp; . 소수의 노드가 매우 높은 차수를 갖고, 대다수의 노드는 작은 차수를 가짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 생성 과정&lt;br /&gt;&amp;nbsp; 1. 초기에 $n0$개 노드로 구성된 작은 그래프를 생성&lt;br /&gt;&amp;nbsp; 2. 새로운 노드를 하나씩 추가하며, 새 노드를 기존 노드들과 $m$개의 간선으로 연결&lt;br /&gt;&amp;nbsp; 3. 새 노드와 기존 노드를 연결할 때, 기존 노드 $i$가 가진 차수 $k_i$에 비례하는 확률 $p_i$로 연결&lt;br /&gt;$$p_i = \frac{k_i}{\sum k_j}$$&lt;br /&gt;&amp;nbsp; &amp;nbsp; . 부가적 선호 연결(Preferential attachment) 원리&lt;/p&gt;
&lt;pre id=&quot;code_1710136488455&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;G = nx.extended_barabasi_albert_graph(n=20, m=1, p=0.2, q=0.2)  # n: 최종 노드 개수, m: 각 새 노드가 연결될 간선 개수, p: 부가적 선호 연결 확률, q: 노드 생성 확률 
nx.draw(G)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;499&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZDkoI/btsFGkkx1OW/pZFM6kLD9Y5F7vC7kAKB20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZDkoI/btsFGkkx1OW/pZFM6kLD9Y5F7vC7kAKB20/img.png&quot; data-alt=&quot;바라바시-알베르트 모델(Barabasi-Albert Model; 1999)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZDkoI/btsFGkkx1OW/pZFM6kLD9Y5F7vC7kAKB20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZDkoI%2FbtsFGkkx1OW%2FpZFM6kLD9Y5F7vC7kAKB20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;454&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;499&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;바라바시-알베르트 모델(Barabasi-Albert Model; 1999)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>인공지능/그래프</category>
      <category>networkx</category>
      <category>간단한그래프</category>
      <category>그래프</category>
      <category>그래프생성모델</category>
      <category>머신러닝</category>
      <category>파이썬</category>
      <author>백관구</author>
      <guid isPermaLink="true">https://data-science-note.tistory.com/92</guid>
      <comments>https://data-science-note.tistory.com/92#entry92comment</comments>
      <pubDate>Mon, 11 Mar 2024 17:10:36 +0900</pubDate>
    </item>
    <item>
      <title>[그래프 ML] 그래프 속성 - 파이썬 NetworkX</title>
      <link>https://data-science-note.tistory.com/91</link>
      <description>&lt;div class=&quot;book-toc&quot;&gt;
  &lt;p&gt;목차&lt;/p&gt;
  &lt;ul id=&quot;toc_list&quot;&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;※ 출처 : 그래프 머신러닝 (클라우디오 스타밀레 외, 김기성&amp;middot;장기식 옮김)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;※ 이전 글 참고&lt;/b&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1710122820239&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[그래프 ML] 파이썬 networkx 시작하기&quot; data-og-description=&quot;※ 출처 : 그래프 머신러닝 (클라우디오 스타밀레 외, 김기성&amp;middot;장기식 옮김) 1. 그래프(Graph) 뜻 * 개체 간의 관계를 설명하는 데 사용되는 수학적 구조 * 소셜 네트워크(팔로우), 지도(길로 이어진 &quot; data-og-host=&quot;data-science-note.tistory.com&quot; data-og-source-url=&quot;https://data-science-note.tistory.com/89&quot; data-og-url=&quot;https://data-science-note.tistory.com/89&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dexy4i/hyVxrt1ujQ/qHwwLpxsD80KdZNmG9uch1/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/ckWWTJ/hyVxqPnS8j/iUy9AY7rqAZvpKjfryfYtk/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/NtY0x/hyVxsTZaCv/DfLK7Cb8vgUanbnUkUQoH0/img.png?width=660&amp;amp;height=499&amp;amp;face=0_0_660_499&quot;&gt;&lt;a href=&quot;https://data-science-note.tistory.com/89&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://data-science-note.tistory.com/89&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dexy4i/hyVxrt1ujQ/qHwwLpxsD80KdZNmG9uch1/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/ckWWTJ/hyVxqPnS8j/iUy9AY7rqAZvpKjfryfYtk/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/NtY0x/hyVxsTZaCv/DfLK7Cb8vgUanbnUkUQoH0/img.png?width=660&amp;amp;height=499&amp;amp;face=0_0_660_499');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[그래프 ML] 파이썬 networkx 시작하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;※ 출처 : 그래프 머신러닝 (클라우디오 스타밀레 외, 김기성&amp;middot;장기식 옮김) 1. 그래프(Graph) 뜻 * 개체 간의 관계를 설명하는 데 사용되는 수학적 구조 * 소셜 네트워크(팔로우), 지도(길로 이어진&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;data-science-note.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 그래프 속성이란&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 모든 그래프는 고유한 속성을 가지며, 이러한 속성은 &lt;b&gt;측정지표(metrics)로 정량화&lt;/b&gt;할 수 있음&lt;br /&gt;&amp;nbsp; - 그래프 &lt;b&gt;전체 / 지역(local) / 전역(global)&lt;/b&gt; 측면을 특성화 함&lt;br /&gt;&amp;nbsp; - 간단한 속성 : 노드 및 간선의 개수 &amp;rarr; 복잡한 그래프를 표현하기 힘듦&lt;br /&gt;&amp;nbsp; - &lt;b&gt;통합(Integration), 분리(Segregation), 중심성(Centrality), 탄력성(Resilience) 측정지표&lt;/b&gt;를 사용해 그래프의 속성을 보다 잘 표현할 수 있음&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 120px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;종류&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;통합 측정지표(Integration Metrics)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;노드가 상호 연결되는 경향을 측정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;분리 측정지표(Segregation Metrics)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;상호 연결된 노드 그룹의 존재를 측정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;중심성 측정지표(Centrality Metrics)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;개별 노드의 중요성을 측정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 40px;&quot;&gt;&lt;b&gt;탄력성 측정지표(Resilience Metrics)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 40px; text-align: center;&quot;&gt;노드 및 간선 추가/제거, 속성 변화 등 변화에 그래프가 얼마나 기능을 유지하는지 측정&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 통합 측정지표(Integration Metrics)&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1. 거리(Distance), 경로(Path), 최단경로(Shortest Path), 지름(Diameter)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;b&gt;거리(Distance)&lt;/b&gt;&lt;br /&gt;&amp;nbsp; - 근원 노드(Source node)에서 목표 노드(Target node)에 도달하기 위해 거쳐야 하는 간선의 개수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;b&gt;경로(Path)&lt;/b&gt;&lt;br /&gt;&amp;nbsp; - 근원 노드와 목표 노드를 연결하는 간선의 집합&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;b&gt;최단경로(Shortest Path)&lt;/b&gt;&lt;br /&gt;&amp;nbsp; - 근원 노드와 목표 노드 사이의 가능한 모든 경로에 대해 간선의 수가 가장 적은 경로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;b&gt;지름(Diameter)&lt;/b&gt;&lt;br /&gt;&amp;nbsp; - 그래프 내 가능한 모든 최단경로 중 가장 긴 최단경로에 포함된 간선의 수&lt;/p&gt;
&lt;pre id=&quot;code_1709878958713&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import networkx as nx


G = nx.Graph()
nodes = {0: &quot;서울&quot;, 1: &quot;부산&quot;, 2: &quot;인천&quot;, 3: &quot;대구&quot;, 4: &quot;대전&quot;, 5: &quot;광주&quot;, 6: &quot;수원&quot;}
G.add_nodes_from(nodes.keys())
G.add_edges_from([(0, 2), (0, 6), (1, 3), (2, 5), (2, 6), (3, 4), (4, 5), (4, 6)])

shortest_path = nx.shortest_path(G, source=0, target=1)  # 0: 서울, 1: 부산
print(f&quot;최단경로: {shortest_path}&quot;)

nx.draw(G, with_labels=True)  # 그래프 시각화&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;최단경로: [0, 6, 4, 3, 1]&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_download.png&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;499&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boT2yV/btsFFYAnNgp/qp3kX04DwB1U7L6nugTZ21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boT2yV/btsFFYAnNgp/qp3kX04DwB1U7L6nugTZ21/img.png&quot; data-alt=&quot;라이언(0)이 어피치(1)를 찾아가는 최단 경로는 0, 6, 4, 3, 1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boT2yV/btsFFYAnNgp/qp3kX04DwB1U7L6nugTZ21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboT2yV%2FbtsFFYAnNgp%2Fqp3kX04DwB1U7L6nugTZ21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;454&quot; data-filename=&quot;edited_download.png&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;499&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;라이언(0)이 어피치(1)를 찾아가는 최단 경로는 0, 6, 4, 3, 1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.2. 특성 경로 길이(Characteristic Path Length)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 정보가 네트워크를 통해 &lt;b&gt;얼마나 효율적으로 분산&lt;/b&gt;되는지 측정하는 방법&lt;br /&gt;&amp;nbsp; - 특성 경로 길이가 짧은 네트워크는 정보를 빠르게 전송할 수 있어 비용 절감에 유리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 가능한 모든 노드 쌍 사이의 &lt;b&gt;모든 최단경로 길이의 평균&lt;/b&gt;&lt;br /&gt;$$\frac{1}{q(q-1)} \sum_{i \in V} l_i$$&lt;br /&gt;&amp;nbsp; - $l_i$ : 노드 $i$와 다른 모든 노드 사이의 평균 경로 길이&lt;br /&gt;&amp;nbsp; - $V$ : 그래프 노드의 집합&lt;br /&gt;&amp;nbsp; - $q = |V|$ : 그래프의 위수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;b&gt;문제점&lt;/b&gt; : 연결이 끊긴 그래프에서는 모든 노드 간의 경로를 계산할 수 없기 때문에, 항상 측정할 수는 없음&lt;/p&gt;
&lt;pre id=&quot;code_1709880721120&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(f&quot;특성 경로 길이: {nx.average_shortest_path_length(G)}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;특성 경로 길이: 2.0&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.3. 전역 효율성(Global Efficiency)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 네트워크를 통해 정보가 얼마나 효율적으로 교환되는지에 대한 척도&lt;br /&gt;&amp;nbsp; - 그래프가 &lt;b&gt;완전히 연결됐을 때 효율성 최대&lt;/b&gt;, 완전히 &lt;b&gt;연결이 끊긴 그래프는 효율성이 최소&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 모든 노드 쌍에 대한 역최단경로(inverse shortest path) 길이의 평균&lt;br /&gt;&amp;nbsp; - 역최단경로(Inverse shortest path) : 목표 노드에서 다른 모든 노드까지의 최단 거리(일반적인 최단경로와 반대로)&lt;br /&gt;$$\frac{1}{q(q-1)} \sum \frac{1}{l_{ij}}$$&lt;br /&gt;&amp;nbsp; - $l_{ij}$ : 노드 $i$와 $j$ 간의 역최단경로&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style11&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;완전 연결 그래프(Fully Connected Graph)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;원형 그래프(Circulant Graph)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;각 노드는 다른 노드에서 모두 도달할 수 있으므로,&lt;br /&gt;정보가 네트워크를 통해 빠르게 교환됨&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;각 노드에 도달하기 위해서는 여러 노드를 통과해야 하므로,&lt;br /&gt;효율성이 떨어짐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;전역 효율성 &amp;uarr;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;전역 효율성 &amp;darr;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre id=&quot;code_1710112461551&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fully_connected_G = nx.complete_graph(7)  # 완전 연결 그래프
print(f&quot;완전 연결 그래프의 전역 효율성: {nx.global_efficiency(fully_connected_G)}&quot;)
nx.draw(fully_connected_G, with_labels=True)  # 그래프 시각화&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;완전 연결 그래프의 전역 효율성: 1.0&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;499&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ClkGa/btsFHm9fRlS/u1HS7Tutmw9xklOKdaXcK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ClkGa/btsFHm9fRlS/u1HS7Tutmw9xklOKdaXcK1/img.png&quot; data-alt=&quot;완전 연결 그래프(Fully Connected Graph)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ClkGa/btsFHm9fRlS/u1HS7Tutmw9xklOKdaXcK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FClkGa%2FbtsFHm9fRlS%2Fu1HS7Tutmw9xklOKdaXcK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;454&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;499&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;완전 연결 그래프(Fully Connected Graph)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1710113022438&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;circulant_G = nx.circulant_graph(7, offsets=[1])  # 원형 그래프
print(f&quot;원형 그래프의 전역 효율성: {nx.global_efficiency(circulant_G)}&quot;)
nx.draw(circulant_G, with_labels=True)  # 그래프 시각화&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;원형 그래프의 전역 효율성: 0.6111111111111109&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;499&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7FBsS/btsFGLVK785/xH9AldKgFAptKfthhGFVbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7FBsS/btsFGLVK785/xH9AldKgFAptKfthhGFVbk/img.png&quot; data-alt=&quot;원형 그래프(Circulant Graph)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7FBsS/btsFGLVK785/xH9AldKgFAptKfthhGFVbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7FBsS%2FbtsFGLVK785%2FxH9AldKgFAptKfthhGFVbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;454&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;499&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;원형 그래프(Circulant Graph)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 분리 측정지표(Segregation Metrics)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 그래프 내 그룹의 존재에 대한 정보&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1. 군집 계수(Clustering Coefficient)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 그래프에서 노드들이 서로 얼마나 잘 묶여있는지를 측정하는 지표&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 군집 계수가 &lt;b&gt;높은&lt;/b&gt; 경우&lt;br /&gt;&amp;nbsp; - 노드들이 서로 밀집되어 있고 삼각형 구조가 많이 형성됨&lt;br /&gt;&amp;nbsp; - 지역 커뮤니티, 모듈성이 강한 구조를 가진 네트워크&lt;br /&gt;&amp;nbsp; - 생물학에서 기능적으로 연관된 단백질&lt;br /&gt;&amp;nbsp; &amp;rarr; 정보 전파, 전염병 확산이 빠르게 일어날 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 군집 계수가 &lt;b&gt;낮은&lt;/b&gt; 경우&lt;br /&gt;&amp;nbsp; - 노드들이 분산되어 있고 삼각형 구조가 적음&lt;br /&gt;&amp;nbsp; - 허브 노드를 중심으로 방사형 구조를 가진 네트워크&lt;br /&gt;&amp;nbsp; - 인터넷(www) 같은 복잡한 네트워크&lt;br /&gt;&amp;nbsp; &amp;rarr; 다양한 정보 유입에 유연하게 대처 가능하며, 취약성이 낮음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;b&gt;전역 군집 계수(Global Clustering Coefficient)&lt;/b&gt;&lt;br /&gt;&amp;nbsp; - 그래프 전체에 대해 계산&lt;br /&gt;&amp;nbsp; - 삼각형(3개 노드와 3개 간선)으로 이뤄진 완전 부분그래프(complete subgraph) 개수를 그래프에 존재할 수 있는 최대 삼각형 개수로 나눈 비율&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;b&gt;지역 군집 계수(Local Clustering Coefficient)&lt;/b&gt;&lt;br /&gt;&amp;nbsp; - 각 노드에 대해 계산&lt;br /&gt;&amp;nbsp; - 한 노드의 이웃 노드들 사이에 연결된 간선 수를 가능한 최대 간선 수로 나눈 비율&lt;/p&gt;
&lt;pre id=&quot;code_1710114270822&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;G = nx.Graph()
nodes = {0: &quot;서울&quot;, 1: &quot;부산&quot;, 2: &quot;인천&quot;, 3: &quot;대구&quot;, 4: &quot;대전&quot;, 5: &quot;광주&quot;, 6: &quot;수원&quot;}
G.add_nodes_from(nodes.keys())
G.add_edges_from([(0, 2), (0, 6), (1, 3), (2, 5), (2, 6), (3, 4), (4, 5), (4, 6)])

print(f&quot;전역 군집 계수: {nx.average_clustering(G)}&quot;)
print(f&quot;지역 군집 계수: {nx.clustering(G)}&quot;)

nx.draw(G, with_labels=True, node_size=list(map(lambda x: 500*x, nx.clustering(G).values())))  # 그래프 시각화&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;전역 군집 계수: 0.23809523809523808 &lt;br /&gt;지역 군집 계수: {0: 1.0, 1: 0, 2: 0.3333333333333333, 3: 0, 4: 0, 5: 0, 6: 0.3333333333333333}&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;499&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beyUqN/btsFDBtLorI/1ZoZkwtRqLeRtWklsB82J0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beyUqN/btsFDBtLorI/1ZoZkwtRqLeRtWklsB82J0/img.png&quot; data-alt=&quot;지역 군집 계수(Local Clustering Coefficient)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beyUqN/btsFDBtLorI/1ZoZkwtRqLeRtWklsB82J0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeyUqN%2FbtsFDBtLorI%2F1ZoZkwtRqLeRtWklsB82J0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;454&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;499&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;지역 군집 계수(Local Clustering Coefficient)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.2. 전이성(Transitivity)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 0과 1 사이의 값을 가지며, 1에 가까울수록 삼각형 구조가 많아 군집화된 구조임을 의미&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;b&gt;닫힌 트리플렛&lt;/b&gt;(Closed triplet; 3개 노드와 2개 간선으로 구성된 완전 부분그래프)의 개수와 그래프에서 가능한 닫힌 트리플렛의 최대 개수의 비율&lt;/p&gt;
&lt;pre id=&quot;code_1710114702997&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(f&quot;전이성: {nx.transitivity(G)}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;전이성: 0.25&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;※ 군집 계수(Clustering Coefficient) vs. 전이성(Transitivity)&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 88px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 13.8372%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 42.6746%; height: 20px; text-align: center;&quot;&gt;&lt;b&gt;군집 계수(Clustering Coefficient)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.4882%; height: 20px; text-align: center;&quot;&gt;&lt;b&gt;전이성(Transitivity)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.8372%; height: 17px; text-align: center;&quot;&gt;정의&lt;/td&gt;
&lt;td style=&quot;width: 42.6746%; height: 17px; text-align: center;&quot;&gt;한 노드의 이웃 노드들 사이에 존재하는 간선의 비율&lt;/td&gt;
&lt;td style=&quot;width: 43.4882%; height: 17px; text-align: center;&quot;&gt;전체 그래프에서 연결된 삼각형의 상대적 빈도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.8372%; height: 17px; text-align: center;&quot;&gt;계산 방식&lt;/td&gt;
&lt;td style=&quot;width: 42.6746%; height: 17px; text-align: center;&quot;&gt;개별 노드에 대해 계산&lt;/td&gt;
&lt;td style=&quot;width: 43.4882%; height: 17px; text-align: center;&quot;&gt;그래프 전체에 대해 하나의 값&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.8372%; height: 17px; text-align: center;&quot;&gt;범위&lt;/td&gt;
&lt;td style=&quot;width: 42.6746%; height: 17px; text-align: center;&quot;&gt;0 ~ 1&lt;/td&gt;
&lt;td style=&quot;width: 43.4882%; height: 17px; text-align: center;&quot;&gt;0 ~ 1&lt;br /&gt;삼각형이 있어야만 0이 아닌 값을 가짐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.8372%; height: 17px; text-align: center;&quot;&gt;활용&lt;/td&gt;
&lt;td style=&quot;width: 42.6746%; height: 17px; text-align: center;&quot;&gt;개별 노드의 군집화 정도를 파악&lt;/td&gt;
&lt;td style=&quot;width: 43.4882%; height: 17px; text-align: center;&quot;&gt;전체 네트워크의 전역적인 군집화 수준을 파악&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.3. 모듈성(Modularity)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 서로 연결된 노드 집합의 네트워크 분할을 집계하도록 설계됨&lt;br /&gt;&amp;nbsp; - 높은 모듈성을 가진 그래프는 &lt;b&gt;모듈 내에서 밀집된 연결&lt;/b&gt;을 보여주고 &lt;b&gt;모듈 간의 연결이 희박&lt;/b&gt;함&lt;/p&gt;
&lt;pre id=&quot;code_1710118699017&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(f&quot;모듈성: {nx.algorithms.community.modularity(G, communities=[{0, 2, 6}, {1, 3, 4, 5}])}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;모듈성: 0.25&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 중심성 측정지표(Centrality Metrics)&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.1. 연결 중심성(Degree Centrality)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 노드의 &lt;b&gt;차수&lt;/b&gt;와 특정 노드의 &lt;b&gt;입사 간선(incident edge)의 개수&lt;/b&gt;와 연관됨&lt;br /&gt;&amp;nbsp; - 노드가 다른 노드에 많이 연결될수록 해당 노드의 연결 중심성은 높은 값을 가짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 유향 그래프라면 들어오는 간선과 나가는 간선의 수와 관련해 각 노드에 대한 &lt;b&gt;내차중심성&lt;/b&gt;과 &lt;b&gt;외차중심성&lt;/b&gt;을 고려해야 함&lt;/p&gt;
&lt;pre id=&quot;code_1710119118361&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(f&quot;연결 중심성: {nx.degree_centrality(G)}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;연결 중심성: {0: 0.3333333333333333, 1: 0.16666666666666666, 2: 0.5, 3: 0.3333333333333333, 4: 0.5, 5: 0.3333333333333333, 6: 0.5}&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.2. 근접 중심성(Closeness Centrality)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 노드가 &lt;b&gt;다른 노드와 얼마나 잘 연결&lt;/b&gt;되어 있는지를 정량화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 다른 모든 노드까지의 평균 거리&lt;br /&gt;$$\frac{1}{\sum_{i \in V, i != j} l_{ij}}$$&lt;br /&gt;&amp;nbsp; - $l_{ij}$ : 노드 $i$와 $j$ 간의 최단경로 길이&lt;br /&gt;&amp;nbsp; - $V$ : 노드의 집합&lt;/p&gt;
&lt;pre id=&quot;code_1710119459954&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(f&quot;근접 중심성: {nx.closeness_centrality(G)}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;근접 중심성: {0: 0.46153846153846156, 1: 0.35294117647058826, 2: 0.5, 3: 0.5, 4: 0.6666666666666666, 5: 0.5454545454545454, 6: 0.6}&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.3. 매개 중심성(Betweenness Centrality)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 노드가 다른 노드 간의 &lt;b&gt;다리&lt;/b&gt; 역할을 하는 정도&lt;br /&gt;&amp;nbsp; - 해당 노드를 통과하는 최단경로 개수가 많을수록 매개 중심성 값이 높아짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\sum_{w != i != j} \frac{L_{wj}(i)}{L_{wj}}$$&lt;br /&gt;&amp;nbsp; - $L_{wj}$ : 노드 $w$와 $j$ 사이의 최단경로 개수&lt;br /&gt;&amp;nbsp; - $L_{wj}(i)$ : 노드 $i$를 통과하는 $w$와 $j$ 간의 최단경로 개수&lt;/p&gt;
&lt;pre id=&quot;code_1710119952295&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(f&quot;매개 중심성: {nx.betweenness_centrality(G)}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;매개 중심성: {0: 0.0, 1: 0.0, 2: 0.1, 3: 0.3333333333333333, 4: 0.5666666666666667, 5: 0.1, 6: 0.3}&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;※ 중심성 측정지표 비교&lt;/h3&gt;
&lt;pre id=&quot;code_1710120316344&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import matplotlib.pyplot as plt
plt.rc(&quot;font&quot;, family=&quot;Malgun Gothic&quot;)


fig, subs = plt.subplots(ncols=3, figsize=(9, 3))

nx.draw(G, with_labels=True, node_size=list(map(lambda x: 500*x, nx.degree_centrality(G).values())), ax=subs[0])  # 연결 중심성
subs[0].set_title(&quot;연결 중심성&quot;)

nx.draw(G, with_labels=True, node_size=list(map(lambda x: 500*x, nx.closeness_centrality(G).values())), ax=subs[1])  # 근접 중심성
subs[1].set_title(&quot;근접 중심성&quot;)

nx.draw(G, with_labels=True, node_size=list(map(lambda x: 500*x, nx.betweenness_centrality(G).values())), ax=subs[2])  # 매개 중심성
subs[2].set_title(&quot;매개 중심성&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;272&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KXT8d/btsFGDqdWf1/LlfI9DCEIVqn87wy2dv3f1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KXT8d/btsFGDqdWf1/LlfI9DCEIVqn87wy2dv3f1/img.png&quot; data-alt=&quot;중심성 측정지표 비교&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KXT8d/btsFGDqdWf1/LlfI9DCEIVqn87wy2dv3f1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKXT8d%2FbtsFGDqdWf1%2FLlfI9DCEIVqn87wy2dv3f1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;717&quot; height=&quot;272&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;272&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;중심성 측정지표 비교&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. 탄력성 측정지표(Resilience Metrics)&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5.1. 동류성(Assortativity)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 그래프에서 &lt;b&gt;연결된 노드들의 유사성&lt;/b&gt; 정도를 측정하는 지표로, 특히 노드의 &lt;b&gt;차수가 비슷한 노드&lt;/b&gt;들이 서로 연결되어 있는 경향을 파악&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 동류성 계수(Assortativity coefficient)는 &lt;b&gt;-1 ~ 1&lt;/b&gt; 사이의 값을 가짐 (∵ &lt;b&gt;피어슨 상관계수&lt;/b&gt;를 사용)&lt;br /&gt;&amp;nbsp; - 양의 계수 : 유사한 차수를 가진 노드들이 서로 연결되는 경향 (&lt;b&gt;동종 연결&lt;/b&gt;)&lt;br /&gt;&amp;nbsp; - 0 : 노드 연결에 특별한 경향 없음&lt;br /&gt;&amp;nbsp; - 음의 계수 : 차수가 다른 노드들이 서로 연결되는 경향 (&lt;b&gt;이종 연결&lt;/b&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 동류성이 &lt;b&gt;높은&lt;/b&gt; 경우&lt;br /&gt;&amp;nbsp; - 소셜 네트워크에서 인플루언서끼리 연결되는 경향&lt;br /&gt;&amp;nbsp; - 생태계에서 비슷한 크기의 종들이 상호작용하는 경향&lt;br /&gt;&amp;nbsp; - 이론적으로 동류 네트워크는 노드의 차수 분포가 멱함수 분포를 보이며 견고성이 높음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 동류성이 &lt;b&gt;낮은&lt;/b&gt; 경우&lt;br /&gt;&amp;nbsp; - 핵심 노드(허브)와 주변 노드가 연결된 구조&lt;br /&gt;&amp;nbsp; - 정보 전달이나 확산에 취약&lt;br /&gt;&amp;nbsp; - 이론적으로 노드의 차수 분포가 지수 분포를 보이며 중심성이 높은 노드에 집중됨&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPZYE2/btsFGnnj8Iq/pP2mjkGQbJxbdtGN7uQRb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPZYE2/btsFGnnj8Iq/pP2mjkGQbJxbdtGN7uQRb1/img.png&quot; data-alt=&quot;멱함수 분포와 지수함수 분포 비교. (a) 정상 스케일, (b) 로그 스케일.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPZYE2/btsFGnnj8Iq/pP2mjkGQbJxbdtGN7uQRb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPZYE2%2FbtsFGnnj8Iq%2FpP2mjkGQbJxbdtGN7uQRb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;841&quot; height=&quot;364&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;364&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;멱함수 분포와 지수함수 분포 비교. (a) 정상 스케일, (b) 로그 스케일.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1710120778744&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(f&quot;동류성: {nx.degree_pearson_correlation_coefficient(G)}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;동류성: -2.7755575615628914e-17&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>인공지능/그래프</category>
      <category>networkx</category>
      <category>그래프</category>
      <category>그래프속성</category>
      <category>그래프측정지표</category>
      <category>머신러닝</category>
      <category>파이썬</category>
      <author>백관구</author>
      <guid isPermaLink="true">https://data-science-note.tistory.com/91</guid>
      <comments>https://data-science-note.tistory.com/91#entry91comment</comments>
      <pubDate>Mon, 11 Mar 2024 17:05:43 +0900</pubDate>
    </item>
    <item>
      <title>[그래프 ML] Gephi 시작하기</title>
      <link>https://data-science-note.tistory.com/90</link>
      <description>&lt;div class=&quot;book-toc&quot;&gt;
  &lt;p&gt;목차&lt;/p&gt;
  &lt;ul id=&quot;toc_list&quot;&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;※ 출처 : 그래프 머신러닝 (클라우디오 스타밀레 외, 김기성&amp;middot;장기식 옮김)&lt;/span&gt;&lt;/b&gt; &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. Gephi 다운로드 및 설치&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 복잡한 그래프 시각화 작업에 활용&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;* 아래&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://gephi.org/&quot;&gt;https://gephi.org/&lt;/a&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;접속 ▶ [Download FREE] 클릭 ▶ OS에 맞는 파일 다운로드&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;(Windows, Mac OS, Linux)&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1709854473506&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Gephi - The Open Graph Viz Platform&quot; data-og-description=&quot;The Open Graph Viz Platform Gephi is the leading visualization and exploration software for all kinds of graphs and networks. Gephi is open-source and free. Runs on Windows, Mac OS X and Linux. Learn More on Gephi Platform &amp;raquo; Support us! We are non-profit.&quot; data-og-host=&quot;gephi.org&quot; data-og-source-url=&quot;https://gephi.org/&quot; data-og-url=&quot;https://gephi.org/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/d8oFbH/hyVunss0bT/oCwczoi6jyJibGfY45Cp60/img.jpg?width=580&amp;amp;height=358&amp;amp;face=0_0_580_358,https://scrap.kakaocdn.net/dn/oRcb4/hyVukP2UnF/84w8LHgcrKqiSM9m4Tfn8k/img.png?width=200&amp;amp;height=260&amp;amp;face=0_0_200_260&quot;&gt;&lt;a href=&quot;https://gephi.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://gephi.org/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/d8oFbH/hyVunss0bT/oCwczoi6jyJibGfY45Cp60/img.jpg?width=580&amp;amp;height=358&amp;amp;face=0_0_580_358,https://scrap.kakaocdn.net/dn/oRcb4/hyVukP2UnF/84w8LHgcrKqiSM9m4Tfn8k/img.png?width=200&amp;amp;height=260&amp;amp;face=0_0_200_260');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Gephi - The Open Graph Viz Platform&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The Open Graph Viz Platform Gephi is the leading visualization and exploration software for all kinds of graphs and networks. Gephi is open-source and free. Runs on Windows, Mac OS X and Linux. Learn More on Gephi Platform &amp;raquo; Support us! We are non-profit.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;gephi.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. Gephi 실행&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gephi를 실행하면, 아래 화면이 처음에 나타납니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXPxt1/btsFFkQSB3d/SbM0YKurNKuKijy3jEPQL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXPxt1/btsFFkQSB3d/SbM0YKurNKuKijy3jEPQL1/img.png&quot; data-alt=&quot;Gephi 실행 초기화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXPxt1/btsFFkQSB3d/SbM0YKurNKuKijy3jEPQL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXPxt1%2FbtsFFkQSB3d%2FSbM0YKurNKuKijy3jEPQL1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Gephi 실행 초기화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gephi 사용법을 익히기 위해, 프로그램에서 제공하는 샘플 그래프 &lt;b&gt;Les Miserables.gexf&lt;/b&gt;를 사용하도록 합니다. Les Miserables.gexf 그래프를 불러오기 위해서는 초기화면에서 아래 부분을 선택합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;371&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dB0ssq/btsFEulYWzj/tq8shqRK3MFHYLh6jqVkR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dB0ssq/btsFEulYWzj/tq8shqRK3MFHYLh6jqVkR1/img.png&quot; data-alt=&quot;[Samples] ▶ Les Miserables.gexf 그래프 불러오기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dB0ssq/btsFEulYWzj/tq8shqRK3MFHYLh6jqVkR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdB0ssq%2FbtsFEulYWzj%2Ftq8shqRK3MFHYLh6jqVkR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;335&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;371&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Samples] ▶ Les Miserables.gexf 그래프 불러오기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;639&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buR9qU/btsFAtWOYfO/CdXCGl71n5pomWijiruAaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buR9qU/btsFAtWOYfO/CdXCGl71n5pomWijiruAaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buR9qU/btsFAtWOYfO/CdXCGl71n5pomWijiruAaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuR9qU%2FbtsFAtWOYfO%2FCdXCGl71n5pomWijiruAaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;423&quot; data-origin-width=&quot;639&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csauup/btsFC2p9P27/0Rf29pFFlqNLm1Nj2ZH9Pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csauup/btsFC2p9P27/0Rf29pFFlqNLm1Nj2ZH9Pk/img.png&quot; data-alt=&quot;Les Miserables.gexf 그래프&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csauup/btsFC2p9P27/0Rf29pFFlqNLm1Nj2ZH9Pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcsauup%2FbtsFC2p9P27%2F0Rf29pFFlqNLm1Nj2ZH9Pk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Les Miserables.gexf 그래프&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. Gephi 인터페이스&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서는 Gephi를 구성하는 인터페이스 &lt;b&gt;Graph (그래프), Appearance (외관), Layout (레이아웃), Context (환경), Filters / Statistics (필터/통계)&lt;/b&gt;에 대해 알아보도록 합니다. 이외 모든 기능에 대한 설명은 &lt;a href=&quot;https://gephi.org/users/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Gephi 공식 가이드&lt;/a&gt;를 참고해 주세요.&lt;/p&gt;
&lt;figure id=&quot;og_1709872345689&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Learn how to use Gephi&quot; data-og-description=&quot;Welcome to Gephi! Gephi is an open-source software for visualizing and analysing large networks graphs. Gephi uses a 3D render engine to display graphs in real-time and speed up the exploration. You can use it to explore, analyse, spatialise, filter, clute&quot; data-og-host=&quot;gephi.org&quot; data-og-source-url=&quot;https://gephi.org/users/&quot; data-og-url=&quot;https://gephi.org/users/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://gephi.org/users/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://gephi.org/users/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Learn how to use Gephi&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Welcome to Gephi! Gephi is an open-source software for visualizing and analysing large networks graphs. Gephi uses a 3D render engine to display graphs in real-time and speed up the exploration. You can use it to explore, analyse, spatialise, filter, clute&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;gephi.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1. 그래프(Graph)&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1392&quot; data-origin-height=&quot;987&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zVKgu/btsFB7SZVEG/vqbwFh4KIDw9JmrecUuOtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zVKgu/btsFB7SZVEG/vqbwFh4KIDw9JmrecUuOtK/img.png&quot; data-alt=&quot;Graph (그래프)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zVKgu/btsFB7SZVEG/vqbwFh4KIDw9JmrecUuOtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzVKgu%2FbtsFB7SZVEG%2FvqbwFh4KIDw9JmrecUuOtK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;425&quot; data-origin-width=&quot;1392&quot; data-origin-height=&quot;987&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Graph (그래프)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 그래프가 표현되는 부분&lt;br /&gt;* 그래프 옵션을 변경할 때마다 그래프 이미지가 자동으로 업데이트 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.2. 외관(Appearance)&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;266&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/APizL/btsFA676g2J/WxKvDZwRbmi3IJmlAcdG4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/APizL/btsFA676g2J/WxKvDZwRbmi3IJmlAcdG4k/img.png&quot; data-alt=&quot;Appearance (외관)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/APizL/btsFA676g2J/WxKvDZwRbmi3IJmlAcdG4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAPizL%2FbtsFA676g2J%2FWxKvDZwRbmi3IJmlAcdG4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;266&quot; height=&quot;432&quot; data-origin-width=&quot;266&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Appearance (외관)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 노드(Nodes), 간선(Edges)의 스타일(색상, 크기, 라벨)을 지정&lt;br /&gt;* 지정 후 [Apply] 버튼 클릭하여 그래프에 적용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 노드, 간선의 색상(Color)&lt;br /&gt;&amp;nbsp; - 팔레트 아이콘 클릭&lt;br /&gt;&amp;nbsp; - &lt;b&gt;고유 색상(Unique), 파티션(Partition), 색상 순위(Ranking)&lt;/b&gt; 방식 선택&lt;br /&gt;&amp;nbsp; &amp;nbsp; . 파티션과 색상 순위의 경우, 드롭다운 메뉴에서 색상 범위에 참조할 그래프 속성을 선택해야 함&lt;br /&gt;&amp;nbsp; &amp;nbsp; . Statistics에서 계산된 그래프 속성도 사용 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 노드의 크기(Size)&lt;br /&gt;&amp;nbsp; - 동심원 아이콘 클릭&lt;br /&gt;&amp;nbsp; - 고유 크기(Unique), 크기 순위(Ranking) 방식 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;867&quot; data-origin-height=&quot;858&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DQ7ot/btsFEvSOLZL/mjBZIiU4Hvv33gB9Lnj8N1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DQ7ot/btsFEvSOLZL/mjBZIiU4Hvv33gB9Lnj8N1/img.png&quot; data-alt=&quot;Appearance 변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DQ7ot/btsFEvSOLZL/mjBZIiU4Hvv33gB9Lnj8N1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDQ7ot%2FbtsFEvSOLZL%2FmjBZIiU4Hvv33gB9Lnj8N1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;396&quot; data-origin-width=&quot;867&quot; data-origin-height=&quot;858&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Appearance 변경&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 노드, 간선의 라벨 색상(Label Color)&lt;br /&gt;&amp;nbsp; - A 아이콘 클릭&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; -&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;고유 색상(Unique), 파티션(Partition), 색상 순위(Ranking)&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;방식 선택&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;* 노드, 간선의 라벨 크기(Label Size)&lt;br /&gt;&amp;nbsp; - TT 아이콘 클릭&lt;br /&gt;&amp;nbsp; - 고유 크기(Unique), 크기 순위(Ranking) 방식 선택 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.3. 레이아웃(Layout)&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;262&quot; data-origin-height=&quot;449&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSPAAy/btsFEh1rMcB/sXWTkgQ6v6gWMhgVDsxjG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSPAAy/btsFEh1rMcB/sXWTkgQ6v6gWMhgVDsxjG0/img.png&quot; data-alt=&quot;Layout (레이아웃)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSPAAy/btsFEh1rMcB/sXWTkgQ6v6gWMhgVDsxjG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSPAAy%2FbtsFEh1rMcB%2FsXWTkgQ6v6gWMhgVDsxjG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;200&quot; height=&quot;343&quot; data-origin-width=&quot;262&quot; data-origin-height=&quot;449&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Layout (레이아웃)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 노드 레이아웃을 선택해 그래프의 노드 위치를 조정할 수 있음&lt;br /&gt;* &lt;b&gt;Contraction, Expansion, Force Atlas, Force Atlas2, Fruchterman Reingold, Label Adjust, Noverlap, OpenOrd, Random Layout, Rotate, Yifan Hu, Yifan Hu Proportional&lt;/b&gt; 기능 지원&lt;br /&gt;* 사용할 레이아웃 선택 후, [Run] 버튼 클릭하여 적용 (실행 후 그래프가 변경되면&amp;nbsp; [Stop] 버튼 클릭)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1900&quot; data-origin-height=&quot;659&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vIiEK/btsFEOY0j1n/l5cxuwrosl98nsBX4Y2vE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vIiEK/btsFEOY0j1n/l5cxuwrosl98nsBX4Y2vE0/img.png&quot; data-alt=&quot;레이아웃 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vIiEK/btsFEOY0j1n/l5cxuwrosl98nsBX4Y2vE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvIiEK%2FbtsFEOY0j1n%2Fl5cxuwrosl98nsBX4Y2vE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1900&quot; height=&quot;659&quot; data-origin-width=&quot;1900&quot; data-origin-height=&quot;659&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;레이아웃 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.4. 환경(Context)&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;268&quot; data-origin-height=&quot;265&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boFIr7/btsFEM7VNSf/TbGbkkqJbf2xSMuHULNWlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boFIr7/btsFEM7VNSf/TbGbkkqJbf2xSMuHULNWlk/img.png&quot; data-alt=&quot;Context (환경)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boFIr7/btsFEM7VNSf/TbGbkkqJbf2xSMuHULNWlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboFIr7%2FbtsFEM7VNSf%2FTbGbkkqJbf2xSMuHULNWlk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;268&quot; height=&quot;265&quot; data-origin-width=&quot;268&quot; data-origin-height=&quot;265&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Context (환경)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 노드(Nodes), 간선(Edges)의 개수와 그래프 유형(유향/무향) 정보를 표현&lt;br /&gt;&amp;nbsp; - 필터 기능 사용 시, 필터링 된 노드와 간선 비율(%)도 표시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.5. 필터(Filters) / 통계(Statistics)&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;1123&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PRBUO/btsFB3QN1Rc/xKTyRm5IDOOsN2W6n3uN7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PRBUO/btsFB3QN1Rc/xKTyRm5IDOOsN2W6n3uN7k/img.png&quot; data-alt=&quot;Filters (필터)와 Statistics (통계)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PRBUO/btsFB3QN1Rc/xKTyRm5IDOOsN2W6n3uN7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPRBUO%2FbtsFB3QN1Rc%2FxKTyRm5IDOOsN2W6n3uN7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;369&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;1123&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Filters (필터)와 Statistics (통계)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Statistics 탭을 사용해 계산한 집합 속성에 따라 그래프의 특정 하위 영역을 필터링하고 시각화 함&lt;br /&gt;* 계산된 측정 지표를 속성으로 사용해 노드, 간선의 모양을 지정하거나 그래프 하위 영역을 필터링 할 수 있음 &lt;br /&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;* 그래프 계산에 사용할 수 있는 그래프 측정 지표를 [Run] 버튼을 클릭해 연산&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1591&quot; data-origin-height=&quot;985&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clSuvl/btsFFK9SvYT/IUb0jFF3Llut0DGdqVUlI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clSuvl/btsFFK9SvYT/IUb0jFF3Llut0DGdqVUlI0/img.png&quot; data-alt=&quot;차수 범위(Degree Range)가 9 이상&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clSuvl/btsFFK9SvYT/IUb0jFF3Llut0DGdqVUlI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclSuvl%2FbtsFFK9SvYT%2FIUb0jFF3Llut0DGdqVUlI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;433&quot; data-origin-width=&quot;1591&quot; data-origin-height=&quot;985&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;차수 범위(Degree Range)가 9 이상&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>인공지능/그래프</category>
      <category>Gephi</category>
      <category>공부</category>
      <category>그래프</category>
      <category>머신러닝</category>
      <author>백관구</author>
      <guid isPermaLink="true">https://data-science-note.tistory.com/90</guid>
      <comments>https://data-science-note.tistory.com/90#entry90comment</comments>
      <pubDate>Fri, 8 Mar 2024 17:42:41 +0900</pubDate>
    </item>
    <item>
      <title>[그래프 ML] 파이썬 NetworkX 시작하기</title>
      <link>https://data-science-note.tistory.com/89</link>
      <description>&lt;div class=&quot;book-toc&quot;&gt;
  &lt;p&gt;목차&lt;/p&gt;
  &lt;ul id=&quot;toc_list&quot;&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;※ 출처 : 그래프 머신러닝 (클라우디오 스타밀레 외, 김기성&amp;middot;장기식 옮김)&lt;/span&gt;&lt;/b&gt; &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 그래프(Graph) 뜻&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 개체 간의 관계를 설명하는 데 사용되는 수학적 구조&lt;br /&gt;* 소셜 네트워크(팔로우), 지도(길로 이어진 도시), 생물학적 구조, 웹 페이지, 프로세스 등 여러 분야에 사용됨&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 라이브러리 설치&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;jupyter, networkx, snap-stanford, matplotlib, pandas, scipy&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 단순무향그래프(Simple Undirected Graph)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$G = (V, E)$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* $V$ : &lt;b&gt;꼭지점(vertex)&lt;/b&gt; 또는 &lt;b&gt;노드(node)&lt;/b&gt;의 집합&lt;br /&gt;$$V = \{v_1, ..., v_n\}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* $E$ : 두 꼭지점 간의 연결을 나타내는 &lt;b&gt;간선(edge)&lt;/b&gt;으로 순서가 없는 순서쌍의 집합&lt;br /&gt;$$E = \{(v_k, v_w), ..., (v_i, v_j)\}$$&lt;br /&gt;&amp;nbsp; - 각 간선 간에 순서가 없으므로, $(v_k, v_w), (v_w, v_k)$는 같은 간선을 나타냄&lt;/p&gt;
&lt;pre id=&quot;code_1709783183376&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import networkx as nx

G = nx.Graph()  # 무향그래프
V = {&quot;서울&quot;, &quot;부산&quot;, &quot;인천&quot;, &quot;대구&quot;}  # 문자열, 클래스, 다른 networkx 그래프와 같이 해시가능한 객체
E = [
    (&quot;서울&quot;, &quot;부산&quot;),
    (&quot;서울&quot;, &quot;인천&quot;),
    (&quot;서울&quot;, &quot;대구&quot;),
    (&quot;부산&quot;, &quot;대구&quot;)
]
G.add_nodes_from(V)
G.add_edges_from(E)

print(f&quot;V = {G.nodes}&quot;)
print(f&quot;E = {G.edges}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;V = ['부산', '서울', '대구', '인천'] &lt;br /&gt;E = [('부산', '서울'), ('부산', '대구'), ('서울', '인천'), ('서울', '대구')]&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1. 기본 속성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 그래프 &lt;b&gt;위수(order)&lt;/b&gt; $|V|$&lt;br /&gt;&amp;nbsp; - 노드의 개수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 그래프 &lt;b&gt;크기(size)&lt;/b&gt; $|E|$&lt;br /&gt;&amp;nbsp; - 간선의 개수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 노드 &lt;b&gt;차수(degree)&lt;/b&gt;&lt;br /&gt;&amp;nbsp; - 해당 노드에 연결된 간선의 개수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 노드 &lt;b&gt;근방(neighbor)&lt;/b&gt;&lt;br /&gt;&amp;nbsp; - 노드에 연결된 모든 노드&amp;nbsp; $V$의 부분집합&lt;/p&gt;
&lt;pre id=&quot;code_1709783936685&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(f&quot;그래프 위수: {G.number_of_nodes()}&quot;)
print(f&quot;그래프 크기: {G.number_of_edges()}&quot;)
print(f&quot;노드 차수: { {v: G.degree(v) for v in G.nodes} }&quot;)
print(f&quot;노드 근방: { {v: list(G.neighbors(v)) for v in G.nodes} }&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;그래프 위수: 4&lt;br /&gt;그래프 크기: 4&lt;br /&gt;노드 차수: {'부산': 2, '서울': 3, '대구': 2, '인천': 1}&lt;br /&gt;노드 근방: {'부산': ['서울', '대구'], '서울': ['부산', '인천', '대구'], '대구': ['서울', '부산'], '인천': ['서울']}&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 노드 &lt;b&gt;근방그래프(neighborhood graph)&lt;/b&gt; 또는 &lt;b&gt;에고그래프(ego graph)&lt;/b&gt;&lt;br /&gt;&amp;nbsp; - 노드에 연결된 노드와 연결된 모든 변으로 구성된 $G$의 부분그래프(subgraph)&lt;/p&gt;
&lt;pre id=&quot;code_1709784114646&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;neighborhood_graph_busan = nx.ego_graph(G, &quot;부산&quot;)

print(f&quot;노드: {neighborhood_graph_busan.nodes}&quot;)
print(f&quot;간선: {neighborhood_graph_busan.edges}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노드: ['부산', '서울', '대구']&lt;br /&gt;간선: [('부산', '서울'), ('부산', '대구'), ('서울', '대구')]&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 그래프 종류&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;b&gt;유향그래프(Directed Graph)&lt;/b&gt;&lt;br /&gt;&lt;b&gt;다이그래프(Digraph)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;b&gt;가중그래프(Weighted Graph)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;b&gt;다중그래프(Multigraph)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.1. 유향그래프(Directed Graph)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$G = (V, E)$$&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;* $V$ :&lt;span&gt;&amp;nbsp;&lt;/span&gt;꼭지점&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;노드의 집합&lt;br /&gt;$$V = \{v_1, ..., v_n\}$$&lt;br /&gt;&amp;nbsp; - 머리(Head) : 출발 노드&lt;br /&gt;&amp;nbsp; - 꼬리(Tail) : 도착 노드&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;* $E$ : 두 꼭지점 간의 연결을 나타내는&lt;span&gt;&amp;nbsp;&lt;/span&gt;간선으로 &lt;b&gt;순서가 있는&lt;/b&gt; 순서쌍의 집합&lt;br /&gt;$$E = \{(v_k, v_w), ..., (v_i, v_j)\}$$&lt;br /&gt;&amp;nbsp; - 각 간선 간에 순서가 있으므로, $(v_k, v_w), (v_w, v_k)$는 다른 간선을 나타냄&lt;br /&gt;&amp;nbsp; &amp;nbsp; . $(v_k, v_w)$ : $v_k$ &amp;rarr; $v_w$&lt;br /&gt;&amp;nbsp; &amp;nbsp; . $(v_w, v_k)$ : $v_w$ &amp;rarr; $v_k$&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;* 노드 차수&lt;br /&gt;&amp;nbsp; - &lt;b&gt;입력차수(Indegree) $deg^{-}(v)$&lt;/b&gt; : 노드로 도착하는 간선의 개수&lt;br /&gt;&amp;nbsp; - &lt;b&gt;출력차수(Outdegree) $deg^{+}(v)$&lt;/b&gt; : 노드에서 출발하는 간선의 개수&lt;/p&gt;
&lt;pre id=&quot;code_1709786897691&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;G = nx.DiGraph()  # 유향그래프
V = {&quot;서울&quot;, &quot;부산&quot;, &quot;인천&quot;, &quot;대구&quot;}
E = [
    (&quot;부산&quot;, &quot;서울&quot;),
    (&quot;인천&quot;, &quot;서울&quot;),
    (&quot;대구&quot;, &quot;서울&quot;),
    (&quot;부산&quot;, &quot;인천&quot;),
    (&quot;대구&quot;, &quot;부산&quot;),
    (&quot;대구&quot;, &quot;인천&quot;)
]
G.add_nodes_from(V)
G.add_edges_from(E)

print(f&quot;입력차수: { {v: G.in_degree(v) for v in G.nodes} }&quot;)
print(f&quot;출력차수: { {v: G.out_degree(v) for v in G.nodes} }&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;입력차수: {'부산': 1, '서울': 3, '대구': 0, '인천': 2}&lt;br /&gt;출력차수: {'부산': 2, '서울': 0, '대구': 3, '인천': 1}&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.2. 다중그래프(Multigraph)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 한 노드에서 출발해서 같은 노드로 도착하는 간선이 여러 개인 다중 간선이 있는 그래프&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$G = (V, E)$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* $V$ : 노드의 집합&lt;br /&gt;* $E$ : 간선의 다중집합&lt;br /&gt;&amp;nbsp; ※ 다중집합 : 집합의 각 원소에 다중 인스턴스를 허용하는 집합&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;b&gt;유향다중그래프(Directed Multigraph)&lt;/b&gt;&lt;br /&gt;&amp;nbsp; - $E$ 순서가 있는 순서쌍의 다중집합&lt;br /&gt;* &lt;b&gt;무향다중그래프(Undirected Multigraph)&lt;/b&gt;&lt;br /&gt;&amp;nbsp; - $E$ 순서가 없는 순서쌍의 다중집합&lt;/p&gt;
&lt;pre id=&quot;code_1709787856299&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;directed_multi_graph = nx.MultiDiGraph()  # 유향다중그래프
undirected_multi_graph = nx.MultiGraph()  # 무향다중그래프

V = {&quot;서울&quot;, &quot;부산&quot;, &quot;인천&quot;, &quot;대구&quot;}
E = [
    (&quot;부산&quot;, &quot;서울&quot;),
    (&quot;부산&quot;, &quot;서울&quot;),
    (&quot;인천&quot;, &quot;서울&quot;),
    (&quot;대구&quot;, &quot;서울&quot;),
    (&quot;대구&quot;, &quot;서울&quot;),
    (&quot;부산&quot;, &quot;인천&quot;),
    (&quot;대구&quot;, &quot;부산&quot;),
    (&quot;대구&quot;, &quot;인천&quot;)
]
directed_multi_graph.add_nodes_from(V)
undirected_multi_graph.add_nodes_from(V)
directed_multi_graph.add_edges_from(E)
undirected_multi_graph.add_edges_from(E)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.3. 가중그래프(Weighted Graph)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;b&gt;간선가중그래프(Edge-weighted Graph)&lt;/b&gt;&lt;br /&gt;&amp;nbsp; - 일반적인 가중그래프 &lt;br /&gt;$$G = (V, E, w)$$&lt;br /&gt;&amp;nbsp; - $V$ : 노드의 집합&lt;br /&gt;&amp;nbsp; - $E$ : 간선의 집합&lt;br /&gt;&amp;nbsp; - $w:E \to \mathbb{R}$ : 각 간선 $e \in E$를 실수 가중값으로 대응시키는 가중 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;b&gt;노드가중그래프(Node-weighted Graph)&lt;/b&gt;&lt;br /&gt;$$G = (V, E, w)$$&lt;br /&gt;&amp;nbsp; - $V$ : 노드의 집합&lt;br /&gt;&amp;nbsp; - $E$ : 간선의 집합&lt;br /&gt;&amp;nbsp; - $w:V \to \mathbb{R}$ : 각 노드 $v \in V$를 실수 가중값으로 대응시키는 가중 함수&lt;/p&gt;
&lt;pre id=&quot;code_1709788989370&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;G = nx.DiGraph()
V = {&quot;서울&quot;, &quot;부산&quot;, &quot;인천&quot;, &quot;대구&quot;}
E = [
    (&quot;부산&quot;, &quot;서울&quot;, 13),
    (&quot;인천&quot;, &quot;서울&quot;, 7),
    (&quot;대구&quot;, &quot;서울&quot;, 10),
    (&quot;부산&quot;, &quot;인천&quot;, 17),
    (&quot;대구&quot;, &quot;부산&quot;, 5),
    (&quot;대구&quot;, &quot;인천&quot;, 15)
]
G.add_nodes_from(V)
G.add_weighted_edges_from(E)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. 다분그래프(Multipartite Graph)&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5.1. k분그래프(kth-partite Graph)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* k개의 노드 집합으로 분할할 수 있는 그래프&lt;br /&gt;* 간선은 서로 다른 집합에 대해서만 허용되며, 같은 집합에 속한 노드 안에서는 허용되지 않음&lt;br /&gt;* 응용 예시&lt;br /&gt;&amp;nbsp; - 신용카드 거래 그래프 분석&lt;br /&gt;&amp;nbsp; - 문서와 그 안의 개체들을 이용한 이분그래프(bipartite graph)로 문서를 처리하고 정보를 구조화&lt;/p&gt;
&lt;pre id=&quot;code_1709790245953&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import pandas as pd
import numpy as np

n_nodes = 10
n_edges = 12

bottom_nodes = [ith for ith in range(n_nodes) if ith%2==0]  # [0, 2, 4, 6, 8]
top_nodes = [ith for ith in range(n_nodes) if ith%2==1]  # [1, 3, 5, 7, 9]
iter_edges = zip(
    np.random.choice(bottom_nodes, n_edges),
    np.random.choice(top_nodes, n_edges)
)
edges = pd.DataFrame([{&quot;source&quot;: a, &quot;target&quot;: b} for a, b in iter_edges])

B = nx.Graph()
B.add_nodes_from(bottom_nodes, bipartite=0)
B.add_nodes_from(top_nodes, bipartite=1)
B.add_edges_from([tuple(x) for x in edges.values])

from networkx.drawing.layout import bipartite_layout  # 그래프 그리기

pos = bipartite_layout(B, bottom_nodes)
nx.draw_networkx(B, pos=pos)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;389&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byGqDK/btsFDBrVGOY/SqRkrmJQ07ADxVRQBU5SY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byGqDK/btsFDBrVGOY/SqRkrmJQ07ADxVRQBU5SY1/img.png&quot; data-alt=&quot;이분그래프(Bipartite Graph)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byGqDK/btsFDBrVGOY/SqRkrmJQ07ADxVRQBU5SY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyGqDK%2FbtsFDBrVGOY%2FSqRkrmJQ07ADxVRQBU5SY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;515&quot; height=&quot;389&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;389&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이분그래프(Bipartite Graph)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. 인접행렬(Adjacency Matrix)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 원소 $M_{ij}$의 값은 노드 $i$에서 노드 $j$로 가는 간선이 있을 때에는 1, 없을 때에는 0인&amp;nbsp; 정방행렬($|V| \times |V|$)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 무향그래프&lt;br /&gt;&amp;nbsp; - 간선의 방향이 없기 때문에 대칭이 됨&lt;/p&gt;
&lt;pre id=&quot;code_1709792147295&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;G = nx.Graph()  # 무향그래프
V = {&quot;서울&quot;, &quot;부산&quot;, &quot;인천&quot;, &quot;대구&quot;}  # 문자열, 클래스, 다른 networkx 그래프와 같이 해시가능한 객체
E = [
    (&quot;서울&quot;, &quot;부산&quot;),
    (&quot;서울&quot;, &quot;인천&quot;),
    (&quot;서울&quot;, &quot;대구&quot;),
    (&quot;부산&quot;, &quot;대구&quot;)
]
G.add_nodes_from(V)
G.add_edges_from(E)

print(&quot;Pandas DataFrame:\n&quot;, nx.to_pandas_adjacency(G))  # Pandas DataFrame 인접행렬
print(&quot;Numpy Array:\n&quot;, nx.to_numpy_array(G))  # Numpy Array 인접행렬&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Pandas DataFrame:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 부산 서울 대구 인천&lt;br /&gt;부산 0.0&amp;nbsp; &amp;nbsp;1.0&amp;nbsp; &amp;nbsp;1.0&amp;nbsp; &amp;nbsp;0.0&lt;br /&gt;서울 1.0&amp;nbsp; &amp;nbsp;0.0&amp;nbsp; &amp;nbsp;1.0&amp;nbsp; &amp;nbsp;1.0&lt;br /&gt;대구 1.0&amp;nbsp; &amp;nbsp;1.0&amp;nbsp; &amp;nbsp;0.0&amp;nbsp; &amp;nbsp;0.0&lt;br /&gt;인천 0.0&amp;nbsp; &amp;nbsp;1.0&amp;nbsp; &amp;nbsp;0.0&amp;nbsp; &amp;nbsp;0.0&lt;br /&gt;Numpy Array:&lt;br /&gt;[[0. 1. 1. 0.]&lt;br /&gt;&amp;nbsp;[1. 0. 1. 1.]&lt;br /&gt;&amp;nbsp;[1. 1. 0. 0.]&lt;br /&gt;&amp;nbsp;[0. 1. 0. 0.]]&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 유향그래프&lt;br /&gt;&amp;nbsp; - 대칭이 보장되지 않음&lt;/p&gt;
&lt;pre id=&quot;code_1709792398695&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;G = nx.DiGraph()  # 유향그래프
V = {&quot;서울&quot;, &quot;부산&quot;, &quot;인천&quot;, &quot;대구&quot;}
E = [
    (&quot;부산&quot;, &quot;서울&quot;),
    (&quot;인천&quot;, &quot;서울&quot;),
    (&quot;대구&quot;, &quot;서울&quot;),
    (&quot;부산&quot;, &quot;인천&quot;),
    (&quot;대구&quot;, &quot;부산&quot;),
    (&quot;대구&quot;, &quot;인천&quot;)
]
G.add_nodes_from(V)
G.add_edges_from(E)

print(&quot;Pandas DataFrame:\n&quot;, nx.to_pandas_adjacency(G))  # Pandas DataFrame 인접행렬
print(&quot;Numpy Array:\n&quot;, nx.to_numpy_array(G))  # Numpy Array 인접행렬&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Pandas DataFrame:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 부산 서울 대구 인천&lt;br /&gt;부산 0.0&amp;nbsp; &amp;nbsp;1.0&amp;nbsp; &amp;nbsp;0.0&amp;nbsp; &amp;nbsp;1.0&lt;br /&gt;서울 0.0&amp;nbsp; &amp;nbsp;0.0&amp;nbsp; &amp;nbsp;0.0&amp;nbsp; &amp;nbsp;0.0&lt;br /&gt;대구 1.0&amp;nbsp; &amp;nbsp;1.0&amp;nbsp; &amp;nbsp;0.0&amp;nbsp; &amp;nbsp;1.0&lt;br /&gt;인천 0.0&amp;nbsp; &amp;nbsp;1.0&amp;nbsp; &amp;nbsp;0.0&amp;nbsp; &amp;nbsp;0.0&lt;br /&gt;Numpy Array:&lt;br /&gt;[[0. 1. 0. 1.]&lt;br /&gt;&amp;nbsp;[0. 0. 0. 0.]&lt;br /&gt;&amp;nbsp;[1. 1. 0. 1.]&lt;br /&gt;&amp;nbsp;[0. 1. 0. 0.]]&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 다중그래프&lt;br /&gt;&amp;nbsp; - 같은 노드 쌍을 연결하는 간선이 여러 개 있을 수 있으므로, 1보다 큰 값을 가질 수 있음&lt;/p&gt;
&lt;pre id=&quot;code_1709792675526&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;G = nx.MultiDiGraph()  # 유향다중그래프
V = {&quot;서울&quot;, &quot;부산&quot;, &quot;인천&quot;, &quot;대구&quot;}
E = [
    (&quot;부산&quot;, &quot;서울&quot;),
    (&quot;부산&quot;, &quot;서울&quot;),
    (&quot;인천&quot;, &quot;서울&quot;),
    (&quot;대구&quot;, &quot;서울&quot;),
    (&quot;대구&quot;, &quot;서울&quot;),
    (&quot;부산&quot;, &quot;인천&quot;),
    (&quot;대구&quot;, &quot;부산&quot;),
    (&quot;대구&quot;, &quot;인천&quot;)
]
G.add_nodes_from(V)
G.add_edges_from(E)

print(&quot;Pandas DataFrame:\n&quot;, nx.to_pandas_adjacency(G))  # Pandas DataFrame 인접행렬
print(&quot;Numpy Array:\n&quot;, nx.to_numpy_array(G))  # Numpy Array 인접행렬&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Pandas DataFrame:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 부산 서울 대구 인천&lt;br /&gt;부산 0.0&amp;nbsp; &amp;nbsp;2.0&amp;nbsp; &amp;nbsp;0.0&amp;nbsp; &amp;nbsp;1.0&lt;br /&gt;서울 0.0&amp;nbsp; &amp;nbsp;0.0&amp;nbsp; &amp;nbsp;0.0&amp;nbsp; &amp;nbsp;0.0&lt;br /&gt;대구 1.0&amp;nbsp; &amp;nbsp;2.0&amp;nbsp; &amp;nbsp;0.0&amp;nbsp; &amp;nbsp;1.0&lt;br /&gt;인천 0.0&amp;nbsp; &amp;nbsp;1.0&amp;nbsp; &amp;nbsp;0.0&amp;nbsp; &amp;nbsp;0.0&lt;br /&gt;Numpy Array:&lt;br /&gt;[[0. 2. 0. 1.]&lt;br /&gt;&amp;nbsp;[0. 0. 0. 0.]&lt;br /&gt;&amp;nbsp;[1. 2. 0. 1.]&lt;br /&gt;&amp;nbsp;[0. 1. 0. 0.]]&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 가중그래프&lt;br /&gt;&amp;nbsp; - 인접행렬의 값이 두 노드를 연결하는 간선의 가중값과 같음&lt;/p&gt;
&lt;pre id=&quot;code_1709792794952&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;G = nx.DiGraph()
V = {&quot;서울&quot;, &quot;부산&quot;, &quot;인천&quot;, &quot;대구&quot;}
E = [
    (&quot;부산&quot;, &quot;서울&quot;, 13),
    (&quot;인천&quot;, &quot;서울&quot;, 7),
    (&quot;대구&quot;, &quot;서울&quot;, 10),
    (&quot;부산&quot;, &quot;인천&quot;, 17),
    (&quot;대구&quot;, &quot;부산&quot;, 5),
    (&quot;대구&quot;, &quot;인천&quot;, 15)
]
G.add_nodes_from(V)
G.add_weighted_edges_from(E)

print(&quot;Pandas DataFrame:\n&quot;, nx.to_pandas_adjacency(G))  # Pandas DataFrame 인접행렬
print(&quot;Numpy Array:\n&quot;, nx.to_numpy_array(G))  # Numpy Array 인접행렬&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Pandas DataFrame:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 부산 서울 대구 인천&lt;br /&gt;부산 0.0&amp;nbsp; 13.0&amp;nbsp; 0.0&amp;nbsp; 17.0&lt;br /&gt;서울 0.0&amp;nbsp; &amp;nbsp; 0.0&amp;nbsp; 0.0&amp;nbsp; &amp;nbsp; 0.0&lt;br /&gt;대구 5.0&amp;nbsp; 10.0&amp;nbsp; 0.0&amp;nbsp; 15.0&lt;br /&gt;인천 0.0&amp;nbsp; &amp;nbsp; 7.0&amp;nbsp; 0.0&amp;nbsp; &amp;nbsp; 0.0&lt;br /&gt;Numpy Array:&lt;br /&gt;[[ 0. 13. 0. 17.]&lt;br /&gt;&amp;nbsp;[ 0.&amp;nbsp; &amp;nbsp;0. 0.&amp;nbsp; &amp;nbsp;0.]&lt;br /&gt;&amp;nbsp;[ 5. 10. 0. 15.]&lt;br /&gt;&amp;nbsp;[ 0.&amp;nbsp; &amp;nbsp;7. 0.&amp;nbsp; &amp;nbsp;0.]]&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;7. 간선 리스트(Edge List)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 변 $|E|$의 크기에 대한 리스트&lt;br /&gt;* 각 원소는 간선이 출발하는 노드와 도착하는 노드의 쌍으로 표현&lt;/p&gt;
&lt;pre id=&quot;code_1709793367918&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;G = nx.DiGraph()
V = {&quot;서울&quot;, &quot;부산&quot;, &quot;인천&quot;, &quot;대구&quot;}
E = [
    (&quot;부산&quot;, &quot;서울&quot;, 13),
    (&quot;인천&quot;, &quot;서울&quot;, 7),
    (&quot;대구&quot;, &quot;서울&quot;, 10),
    (&quot;부산&quot;, &quot;인천&quot;, 17),
    (&quot;대구&quot;, &quot;부산&quot;, 5),
    (&quot;대구&quot;, &quot;인천&quot;, 15)
]
G.add_nodes_from(V)
G.add_weighted_edges_from(E)

print(nx.to_pandas_edgelist(G))&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&amp;nbsp; &amp;nbsp;source target weight&lt;br /&gt;0 부산&amp;nbsp; &amp;nbsp; 서울&amp;nbsp; &amp;nbsp;13&lt;br /&gt;1 부산&amp;nbsp; &amp;nbsp; 인천&amp;nbsp; &amp;nbsp;17&lt;br /&gt;2 대구&amp;nbsp; &amp;nbsp; 서울&amp;nbsp; &amp;nbsp;10&lt;br /&gt;3 대구&amp;nbsp; &amp;nbsp; 부산&amp;nbsp; &amp;nbsp; &amp;nbsp;5&lt;br /&gt;4 대구&amp;nbsp; &amp;nbsp; 인천&amp;nbsp; &amp;nbsp;15&lt;br /&gt;5 인천&amp;nbsp; &amp;nbsp; 서울&amp;nbsp; &amp;nbsp; &amp;nbsp;7&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;8. 그래프 그리기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 노드는 원으로, 간선은 두 노드를 연결하는 선으로 표현&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8.1. NetworkX&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* networkx.draw 함수를 통해 그래프 개체를 그릴 수 있음&lt;/p&gt;
&lt;pre id=&quot;code_1709795586668&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import networkx as nx


def draw_graph(graph, nodes_position: dict, weight):  # nodes_position: {노드 이름: 노드의 위치 좌표(직교좌표계의 2개의 값을 갖는 배열)}
    nx.draw(graph, nodes_position,
            with_labels=True, font_family=&quot;Malgun Gothic&quot;, font_size=10,  # 각 노드에 이름을 표시
            node_size=400,  # 노드의 크기
            edge_color=&quot;grey&quot;,  # 간선의 색상
            arrowsize=30)  # 간선의 화살표 크기(유향그래프인 경우)
    if weight:
        edge_labels = nx.get_edge_attributes(graph, &quot;weight&quot;)
        nx.draw_networkx_edge_labels(graph, nodes_position, edge_labels=edge_labels)


G = nx.DiGraph()
V = {&quot;서울&quot;, &quot;부산&quot;, &quot;인천&quot;, &quot;대구&quot;}
E = [
    (&quot;부산&quot;, &quot;서울&quot;, 13),
    (&quot;인천&quot;, &quot;서울&quot;, 7),
    (&quot;대구&quot;, &quot;서울&quot;, 10),
    (&quot;부산&quot;, &quot;인천&quot;, 17),
    (&quot;대구&quot;, &quot;부산&quot;, 5),
    (&quot;대구&quot;, &quot;인천&quot;, 15)
]
G.add_nodes_from(V)
G.add_weighted_edges_from(E)

nodes_position = {
    &quot;서울&quot;: [1, 1],
    &quot;부산&quot;: [1, 0],
    &quot;인천&quot;: [0, 1],
    &quot;대구&quot;: [0.5, 0]
}
draw_graph(G, nodes_position, True)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;499&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4U7Cr/btsFDXuXrel/5X4rvnddJry5Seii5xOLNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4U7Cr/btsFDXuXrel/5X4rvnddJry5Seii5xOLNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4U7Cr/btsFDXuXrel/5X4rvnddJry5Seii5xOLNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4U7Cr%2FbtsFDXuXrel%2F5X4rvnddJry5Seii5xOLNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;660&quot; height=&quot;499&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;499&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 노드 &lt;b&gt;레이아웃&lt;/b&gt; 종류&lt;br /&gt;&amp;nbsp; - NetworkX는 레이아웃에 따라 각 노드의 위치를 자동으로 계산하는 기능 지원&lt;br /&gt;&amp;nbsp; - networkx.drawing.layout 라이브러리에 있는 &lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;bipartite_layout, circular_layout, kamada_kawai_layout, planar_layout, random_layout, spring_layout, shell_layout, spectral_layout, spiral_layout&lt;/span&gt;&lt;/b&gt; 레이아웃 활용 가능&lt;br /&gt;&amp;nbsp; - 복잡한 그래프는 Gephi를 사용하는 것을 추천!&lt;/p&gt;
&lt;pre id=&quot;code_1709853273554&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import networkx as nx
from networkx.drawing.layout import bipartite_layout, circular_layout, kamada_kawai_layout, planar_layout, random_layout, spring_layout, shell_layout, spectral_layout, spiral_layout


n_nodes = 10
n_edges = 20
nodes = np.arange(n_nodes)  # [0, ..., 9]

fig, subs = plt.subplots(nrows=3, ncols=3, figsize=(9, 9))
for sub, layout in zip(subs.flatten(),
                       [bipartite_layout, circular_layout, kamada_kawai_layout, planar_layout, random_layout, spring_layout, shell_layout, spectral_layout, spiral_layout]):
    iter_edges = zip(
        np.random.choice(nodes[:5], n_edges),
        np.random.choice(nodes[5:], n_edges)
    )
    edges = pd.DataFrame([{&quot;source&quot;: a, &quot;target&quot;: b} for a, b in iter_edges])
    
    G = nx.Graph()
    G.add_nodes_from(nodes)
    G.add_edges_from([tuple(x) for x in edges.values])
    
    if layout.__name__==&quot;bipartite_layout&quot;:
        pos = layout(G, nodes=nodes[:5])
    else:
        pos = layout(G)
    nx.draw(G, pos=pos, ax=sub, with_labels=True, font_size=10, node_size=100)
    sub.set_title(layout.__name__)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;735&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FEltM/btsFBMhhwJk/xrrO3ANbpG4c5RHH9PGrf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FEltM/btsFBMhhwJk/xrrO3ANbpG4c5RHH9PGrf0/img.png&quot; data-alt=&quot;NetworkX 그래프 레이아웃&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FEltM/btsFBMhhwJk/xrrO3ANbpG4c5RHH9PGrf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFEltM%2FbtsFBMhhwJk%2FxrrO3ANbpG4c5RHH9PGrf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;513&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;735&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;NetworkX 그래프 레이아웃&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>인공지능/그래프</category>
      <category>networkx</category>
      <category>그래프</category>
      <category>그래프그리기</category>
      <category>그래프종류</category>
      <category>머신러닝</category>
      <category>파이썬</category>
      <author>백관구</author>
      <guid isPermaLink="true">https://data-science-note.tistory.com/89</guid>
      <comments>https://data-science-note.tistory.com/89#entry89comment</comments>
      <pubDate>Fri, 8 Mar 2024 17:22:13 +0900</pubDate>
    </item>
  </channel>
</rss>