ITSTGCN-Tutorial

ST-GCN
Author

SEOYEON CHOI

Published

March 17, 2023

edit

import

import itstgcn 
import torch

예제1: vanilla STGCN

- 데이터

data_dict = itstgcn.load_data('./data/fivenodes.pkl')
loader = itstgcn.DatasetLoader(data_dict)
dataset = loader.get_dataset(lags=2)
train_dataset, test_dataset = itstgcn.utils.temporal_signal_split(dataset, train_ratio=0.8)

- 학습

lrnr = itstgcn.StgcnLearner(train_dataset,dataset_name='five_nodes')
/home/csy/Dropbox/blog/posts/GCN/itstgcn/learners.py:84: UserWarning: Creating a tensor from a list of numpy.ndarrays is extremely slow. Please consider converting the list to a single numpy.ndarray with numpy.array() before converting to a tensor. (Triggered internally at  /opt/conda/conda-bld/pytorch_1639180588308/work/torch/csrc/utils/tensor_new.cpp:201.)
  self.lags = torch.tensor(train_dataset.features).shape[-1]
lrnr.learn(filters=4,epoch=5)
5/5

- 적합값

#lrnr(train_dataset) 
#lrnr(test_dataset)
  • 실행하면 X,y,yhat 출력

- 모형 평가 및 시각화

evtor = itstgcn.Evaluator(lrnr,train_dataset,test_dataset)
fig = evtor.plot('--.',h=5,max_node=3,label='complete data',alpha=0.5) 
fig.set_figwidth(12)
fig.tight_layout()
fig

예제2: padding missing values

- 데이터

_data = itstgcn.load_data('./data/fivenodes.pkl')
_edges = torch.tensor(_data['edges']).nonzero().tolist()
_FX = _data['f'].tolist()
_node_ids = {'node1':0, 'node2':1, 'node3':2, 'node4':3, 'node5':4} 
data_dict = {'edges':_edges, 'node_ids':_node_ids, 'FX':_FX}
loader = itstgcn.DatasetLoader(data_dict)
dataset = loader.get_dataset(lags=2)
train_dataset, test_dataset = itstgcn.utils.temporal_signal_split(dataset, train_ratio=0.8)

- 임의로 결측치 발생

mindex = itstgcn.rand_mindex(train_dataset,mrate=0.5)
train_dataset_miss = itstgcn.miss(train_dataset,mindex=mindex,mtype='rand')
fig = itstgcn.plot(torch.tensor(train_dataset_miss.targets),'o')
fig 

- 적절한 method로 결측치를 채움 (default 는 linear)

train_dataset_padded = itstgcn.padding(train_dataset_miss) # padding(train_dataset_miss,method='linear'와 같음)
fig = itstgcn.plot(torch.tensor(train_dataset_miss.targets),'o')
itstgcn.plot_add(fig,torch.tensor(train_dataset_padded.targets),'--x',color='C1',alpha=0.5)

다른 method로 결측치를 채울수도 있음. 사용할 수 있는 방법들은 아래에 정리되어 있음

train_dataset_padded = itstgcn.padding(train_dataset_miss,interpolation_method='nearest')
fig = itstgcn.plot(torch.tensor(train_dataset_miss.targets),'o')
itstgcn.plot_add(fig,torch.tensor(train_dataset_padded.targets),'--x',color='C1',alpha=0.5)

train_dataset_padded = itstgcn.padding(train_dataset_miss,interpolation_method='quadratic')
fig = itstgcn.plot(torch.tensor(train_dataset_miss.targets),'o')
itstgcn.plot_add(fig,torch.tensor(train_dataset_padded.targets),'--x',color='C1',alpha=0.5)

train_dataset_padded = itstgcn.padding(train_dataset_miss,interpolation_method='cubic')
fig = itstgcn.utils.plot(torch.tensor(train_dataset_miss.targets),'o')
itstgcn.utils.plot_add(fig,torch.tensor(train_dataset_padded.targets),'--x',color='C1',alpha=0.5)

- 블락으로 결측치 발생

mindex = [list(range(10,100)),[],list(range(50,80)),[],[]]
train_dataset_miss = itstgcn.miss(train_dataset,mindex,mtype='block')
fig = itstgcn.utils.plot(torch.tensor(train_dataset_miss.targets),'o')
fig 

예제3: vanilla STGCN with random missing

- data

_data = itstgcn.load_data('./data/fivenodes.pkl')
_edges = torch.tensor(_data['edges']).nonzero().tolist()
_FX = _data['f'].tolist()
_node_ids = {'node1':0, 'node2':1, 'node3':2, 'node4':3, 'node5':4} 
data_dict = {'edges':_edges, 'node_ids':_node_ids, 'FX':_FX}
loader = itstgcn.DatasetLoader(data_dict)
dataset = loader.get_dataset(lags=2)
train_dataset, test_dataset = itstgcn.utils.temporal_signal_split(dataset, train_ratio=0.8)
mindex = itstgcn.rand_mindex(train_dataset,mrate=0.5)
train_dataset_miss = itstgcn.miss(train_dataset,mindex,mtype='rand')
train_dataset_padded = itstgcn.padding(train_dataset_miss) # padding(train_dataset_miss,method='linear'와 같음)

- 학습

lrnr = itstgcn.learners.StgcnLearner(train_dataset_padded)
lrnr.learn(filters=4,epoch=5)
5/5

- 적합값

#lrnr(train_dataset_padded) 
#lrnr(test_dataset)
  • 실행하면 X,y,yhat 출력

- 모형 평가 및 시각화

evtor = itstgcn.Evaluator(lrnr,train_dataset_padded,test_dataset)
fig = evtor.plot('--.',h=5,max_node=5,label='complete data',alpha=0.5) # max_nodes 는 1보다 커야함
fig.set_figwidth(12)
fig.tight_layout()
fig

예제4: vanilla STGCN with block missing

- data

_data = itstgcn.load_data('./data/fivenodes.pkl')
_edges = torch.tensor(_data['edges']).nonzero().tolist()
_FX = _data['f'].tolist()
_node_ids = {'node1':0, 'node2':1, 'node3':2, 'node4':3, 'node5':4} 
data_dict = {'edges':_edges, 'node_ids':_node_ids, 'FX':_FX}
loader = itstgcn.DatasetLoader(data_dict)
dataset = loader.get_dataset(lags=2)
train_dataset, test_dataset = itstgcn.utils.temporal_signal_split(dataset, train_ratio=0.8)
mindex = [list(range(10,100)),[],list(range(50,80)),[],[]]
train_dataset_miss = itstgcn.miss(train_dataset,mindex,mtype='block')
train_dataset_padded = itstgcn.padding(train_dataset_miss) # padding(train_dataset_miss,method='linear'와 같음)

- 학습

lrnr = itstgcn.StgcnLearner(train_dataset_padded)
lrnr.learn(filters=4,epoch=5)
5/5

- 적합값

#lrnr(train_dataset_padded) 
#lrnr(test_dataset)
  • 실행하면 X,y,yhat 출력

- 모형 평가 및 시각화

evtor = itstgcn.Evaluator(lrnr,train_dataset_padded,test_dataset)
fig = evtor.plot('--.',h=5,max_node=5,label='complete data',alpha=0.5) # max_nodes 는 1보다 커야함
fig.set_figwidth(12)
fig.tight_layout()
fig

예제5: threshold example (random)

- data

_data = itstgcn.load_data('./data/fivenodes.pkl')
_edges = torch.tensor(_data['edges']).nonzero().tolist()
_FX = _data['f'].tolist()
_node_ids = {'node1':0, 'node2':1, 'node3':2, 'node4':3, 'node5':4} 
data_dict = {'edges':_edges, 'node_ids':_node_ids, 'FX':_FX}
loader = itstgcn.DatasetLoader(data_dict)
dataset = loader.get_dataset(lags=2)
train_dataset, test_dataset = itstgcn.utils.temporal_signal_split(dataset, train_ratio=0.8)

- 결측치 발생 및 패딩

mindex=itstgcn.rand_mindex(train_dataset,mrate=0.5)
train_dataset_miss = itstgcn.miss(train_dataset,mindex,mtype='rand')
train_dataset_padded = itstgcn.padding(train_dataset_miss)
f_miss,_ = itstgcn.convert_train_dataset(train_dataset_miss)
f_padded,_ = itstgcn.convert_train_dataset(train_dataset_padded)
fig = itstgcn.utils.plot(f_miss,'o')
itstgcn.utils.plot_add(fig,f_padded,'--x',alpha=0.5)

- update by frequency thresholding

fig = itstgcn.plot(f_miss,'o',alpha=0.5)
itstgcn.plot_add(fig,f_padded,'--x',alpha=0.5)
f_updated = itstgcn.update_from_freq_domain(f_padded,train_dataset_padded.mindex)
itstgcn.plot_add(fig,f_updated,'-')

예제6: threshold example (block)

- data

_data = itstgcn.load_data('./data/fivenodes.pkl')
_edges = torch.tensor(_data['edges']).nonzero().tolist()
_FX = _data['f'].tolist()
_node_ids = {'node1':0, 'node2':1, 'node3':2, 'node4':3, 'node5':4} 
data_dict = {'edges':_edges, 'node_ids':_node_ids, 'FX':_FX}
loader = itstgcn.DatasetLoader(data_dict)
dataset = loader.get_dataset(lags=2)
train_dataset, test_dataset = itstgcn.temporal_signal_split(dataset, train_ratio=0.8)

- 결측치 발생 및 패딩

mindex=[list(range(10,100)),[],list(range(50,80)),[],[]]
train_dataset_miss = itstgcn.miss(train_dataset,mindex,mtype='block')
train_dataset_padded = itstgcn.padding(train_dataset_miss)
f_miss,_ = itstgcn.convert_train_dataset(train_dataset_miss)
f_padded,_ = itstgcn.convert_train_dataset(train_dataset_padded)
fig = itstgcn.plot(f_miss,'o')
itstgcn.plot_add(fig,f_padded,'--x',alpha=0.5)

- update by frequency thresholding

fig = itstgcn.plot(f_miss,'o',alpha=0.5)
itstgcn.plot_add(fig,f_padded,'--x',alpha=0.5)
f_updated = itstgcn.update_from_freq_domain(f_padded,train_dataset_padded.mindex)
itstgcn.plot_add(fig,f_updated,'-')

예제7: iterative thresholded STGCN (IT-STGCN) with random missing

- data

_data = itstgcn.load_data('./data/fivenodes.pkl')
_edges = torch.tensor(_data['edges']).nonzero().tolist()
_FX = _data['f'].tolist()
_node_ids = {'node1':0, 'node2':1, 'node3':2, 'node4':3, 'node5':4} 
data_dict = {'edges':_edges, 'node_ids':_node_ids, 'FX':_FX}
loader = itstgcn.DatasetLoader(data_dict)
dataset = loader.get_dataset(lags=2)
train_dataset, test_dataset = itstgcn.temporal_signal_split(dataset, train_ratio=0.8)
mindex = itstgcn.rand_mindex(train_dataset,mrate=0.5)
train_dataset_miss = itstgcn.miss(train_dataset,mindex,mtype='rand')
train_dataset_padded = itstgcn.padding(train_dataset_miss) # padding(train_dataset_miss,method='linear'와 같음)

- 학습

lrnr = itstgcn.ITStgcnLearner(train_dataset_padded)
lrnr.learn(filters=4,epoch=5)
5/5

- 적합값

#lrnr(train_dataset_padded) 
#lrnr(test_dataset)['yhat'].shape
  • 실행하면 X,y,yhat 출력

- 모형 평가 및 시각화

evtor = itstgcn.Evaluator(lrnr,train_dataset_padded,test_dataset)
fig = evtor.plot('--.',h=5,max_node=3,label='complete data',alpha=0.5) # max_nodes 는 1보다 커야함
fig.set_figwidth(12)
fig.tight_layout()
fig

예제8: iterative thresholded STGCN (IT-STGCN) with block missing

- data

_data = itstgcn.load_data('./data/fivenodes.pkl')
_edges = torch.tensor(_data['edges']).nonzero().tolist()
_FX = _data['f'].tolist()
_node_ids = {'node1':0, 'node2':1, 'node3':2, 'node4':3, 'node5':4} 
data_dict = {'edges':_edges, 'node_ids':_node_ids, 'FX':_FX}
loader = itstgcn.DatasetLoader(data_dict)
dataset = loader.get_dataset(lags=2)
train_dataset, test_dataset = itstgcn.temporal_signal_split(dataset, train_ratio=0.8)
mindex = [list(range(10,100)),[],list(range(50,80)),[],[]]
train_dataset_miss = itstgcn.miss(train_dataset,mindex,mtype='block')
train_dataset_padded = itstgcn.padding(train_dataset_miss) # padding(train_dataset_miss,method='linear'와 같음)

- 학습

lrnr = itstgcn.ITStgcnLearner(train_dataset_padded)
lrnr.learn(filters=4,epoch=5)
5/5

- 적합값

#lrnr(train_dataset_padded) 
#lrnr(test_dataset)['yhat'].shape
  • 실행하면 X,y,yhat 출력

- 모형 평가 및 시각화

evtor = itstgcn.Evaluator(lrnr,train_dataset_padded,test_dataset)
fig = evtor.plot('--.',h=5,max_node=3,label='complete data',alpha=0.5) # max_nodes 는 1보다 커야함
fig.set_figwidth(12)
fig.tight_layout()
fig

예제9: GNAR (random missing)

_data = itstgcn.load_data('./data/fivenodes.pkl')
_edges = torch.tensor(_data['edges']).nonzero().tolist()
_FX = _data['f'].tolist()
_node_ids = {'node1':0, 'node2':1, 'node3':2, 'node4':3, 'node5':4} 
data_dict = {'edges':_edges, 'node_ids':_node_ids, 'FX':_FX}
loader = itstgcn.DatasetLoader(data_dict)
loader = itstgcn.DatasetLoader(data_dict)
dataset = loader.get_dataset(lags=2)
train_dataset, test_dataset = itstgcn.temporal_signal_split(dataset, train_ratio=0.8)
mindex=itstgcn.rand_mindex(train_dataset,mrate=0.5)
train_dataset_miss = itstgcn.miss(train_dataset,mindex,mtype='rand')
train_dataset_padded = itstgcn.padding(train_dataset_miss) # padding(train_dataset_miss,method='linear'와 같음)

- 학습

lrnr = itstgcn.GNARLearner(train_dataset_padded)
lrnr.learn()
WARNING: diagonal entries present in original matrix, these will be removed

- 적합값

#lrnr(train_dataset_padded) 
#lrnr(test_dataset)
  • 실행하면 X,y,yhat 출력

- 모형 평가 및 시각화

evtor = itstgcn.Evaluator(lrnr,train_dataset_padded,test_dataset)
WARNING: diagonal entries present in original matrix, these will be removed
WARNING: diagonal entries present in original matrix, these will be removed
fig = evtor.plot('--.',h=5,max_node=3,label='complete data',alpha=0.5) # max_nodes 는 1보다 커야함
fig.set_figwidth(12)
fig.tight_layout()
fig

예제10: GNAR (block missing)

_data = itstgcn.load_data('./data/fivenodes.pkl')
_edges = torch.tensor(_data['edges']).nonzero().tolist()
_FX = _data['f'].tolist()
_node_ids = {'node1':0, 'node2':1, 'node3':2, 'node4':3, 'node5':4} 
data_dict = {'edges':_edges, 'node_ids':_node_ids, 'FX':_FX}
loader = itstgcn.DatasetLoader(data_dict)
dataset = loader.get_dataset(lags=2)
train_dataset, test_dataset = itstgcn.temporal_signal_split(dataset, train_ratio=0.8)
mindex=[list(range(10,100)),[],list(range(50,80)),[],[]]
train_dataset_miss = itstgcn.miss(train_dataset,mindex,mtype='block')
train_dataset_padded = itstgcn.padding(train_dataset_miss) # padding(train_dataset_miss,method='linear'와 같음)

- 학습

lrnr = itstgcn.GNARLearner(train_dataset_padded)
lrnr.learn()
WARNING: diagonal entries present in original matrix, these will be removed

- 적합값

#lrnr(train_dataset_padded) 
#lrnr(test_dataset)
  • 실행하면 X,y,yhat 출력

- 모형 평가 및 시각화

evtor = itstgcn.Evaluator(lrnr,train_dataset_padded,test_dataset)
WARNING: diagonal entries present in original matrix, these will be removed
WARNING: diagonal entries present in original matrix, these will be removed
fig = evtor.plot('--.',h=5,max_node=3,label='complete data',alpha=0.5) # max_nodes 는 1보다 커야함
fig.set_figwidth(12)
fig.tight_layout()
fig