본문 바로가기

DL & ML/Graph

[DGL] ndata, edata, srcdata, dstdata란?

728x90
반응형

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를 추가하는 것입니다!

사용방법 역시 동일하니 한 번 응용해보시길 추천드립니다!

728x90
반응형