homogeneous graph(단순 노드, 엣지가 한가지 의미를 가지고 있는 그래프)에서 각 노드의 feature 정보를 표현하기 위해서는 ndata라는 속성을 이용하면 됩니다.
반대로 각 엣지의 feature 정보를 표현하기 위해서는 edata라는 속성이 있습니다.
예를 들어 인스타그램 팔로우 그래프를 만든다고 가정해봅시다.
아래 예시는 사용자는 총 6명이고, 각각의 팔로우 여부를 의미합니다. (*참고로 dgl에서 노드는 0번부터 연속적으로 생성이 됩니다. 중간에 비어있는 id도 노드가 생성이 됩니다.)
>>> src_ids = torch.tensor([0, 2, 3, 2, 1])
>>> dst_ids = torch.tensor([2, 3, 1, 5, 4])
>>> g = dgl.graph((src_ids, dst_ids))
만약 각 사용자의 '나이'라는 속성을 그래프에 저장하고 싶다면?
이때 ndata를 사용해주면 됩니다. (ndata는 node data입니다!)
>>> g.ndata['age'] = torch.tensor([20, 30, 24, 26, 38, 14])
그러면 각각 노드 순서대로(0번부터) 나이라는 속성을 하나씩 가지게 됩니다!
이렇게 ndata로 설정한 속성은 update함수를 통해 변경할 수도, del 함수를 통해 삭제할 수도 있습니다!
>>> g.ndata.update({'age' : torch.tensor([1, 2, 3, 4, 5, 6])})
>>> del g.ndata['age']
그렇다면 edge에 속성을 추가하고 싶다면?
바로 edata를 사용해주면 됩니다! (edge data)
만약에 인스타그램 데이터를 단순히 팔로우 여부가 아니라 "친밀도"여부로 표현한다면 같은 edge라도 친밀도라는 가중치 값이 생기게 될 것 입니다.
이때 이런 가중치 값을 edata로 표현해줄 수 있습니다! 간단하죠?
>>> g.edata['weight'] = torch.tensor([0.5, 0.8, 0.47, 0.12, 0.55])
그렇다면 srcdata와 dstdata도 감이 오시겠죠?
바로 source node에 대해 feature를 추가하는 것, destination node에 대해 feature를 추가하는 것입니다!
사용방법 역시 동일하니 한 번 응용해보시길 추천드립니다!
'DL & ML > Graph' 카테고리의 다른 글
[DGL] 기본 message passing layer 만들기 (0) | 2022.02.04 |
---|---|
[DGL] local_scope란? (0) | 2022.02.04 |
[DGL] Graph와 Heterogeneous Graph의 차이 (0) | 2022.02.04 |
[그래프와 추천 시스템] 페이지 랭크 계산하기 (0) | 2022.02.02 |
[그래프와 추천 시스템] 페이지 랭크 (0) | 2022.01.28 |