gensimのPoincarē embedingでprotein-protein interaction networkを双曲空間に埋め込んでみた

#はじめに
genismのPoincarē embeddingを使って、protein-protein interactionのネットワークをポアンカレボールに埋め込んでみました。

1. 双曲空間
双曲空間は非ユークリッド空間の一つで、負の曲率を持った曲がった空間です。周辺部に行くほど空間が広がると言う性質を持ち、階層構造を持つネットワークなどを埋め込むのに適していると言われています。

2. ポアンカレボール
双曲空間のモデルの一つにポアンカレボールがあります。ポアンカレボール上では2点間の距離は$$d(u,v) = \mathrm{arccosh}\left(1+2\frac{||u-v||^{2}}{(1-||u||^{2})(1-||v||^{2})}\right).$$
と表現されます。ポアンカレボール上の距離に基づいて損失関数を次のように定義します。
$$\Theta'\leftarrow \mathrm{arg min}\mathcal{L}(\Theta)\;\;\;\mathrm{s.t.}\forall\theta_{i}\in\Theta:||\theta_{i}||<1.$$
Poincarē embeddingでは、この損失関数が最小となるよう座標を決めます。

#タンパク質間結合のネットワーク
1. Prote-protein interaction network  
生体内では様々なタンパクが機能していますが、それらの多くは単独ではなく、お互いに結合して機能を果たしています。結合するタンパク同士を結んで構築されたネットワークがprotein-protein interaction networkです。
2. protein-protein interaction networkの特徴  
タンパクはお互いに結合しますが、結合するパートナーの数は一様ではありません。ほとんどのタンパクは特定のタンパクとしか結合しません。ごく少数のタンパクが数多くのタンパクと結合します。その結果、タンパク間結合のネットワークは、少数のタンパクがネットワークのハブとなって大多数の末端のタンパクをつないだ構造となります。ネットワーク中の要素をnode、nodeを結んだ枝をedge、node毎のedge数をdegreeと呼びます。タンパク間結合のネットワークでは、degreeが偏って分布します。degreeの分布がべき則に従うようなネットワークはスケールフリー・ネットワークやスモールワールド・ネットワークなどと呼ばれます。スケールフリー・ネットワークは自然界に存在するネットワークで良く観察されます。タンパク間結合のネットワークもスケールフリー性を示すことが知られています。
3. データセット  
タンパク間結合に関する情報をデータベースから入手します。今回使用したのは[NURSA protein-protein interactions dataset](http://amp.pharm.mssm.edu/Harmonizome/dataset/NURSA+Protein-Protein+Interactions)です。この中の[Gene attribute Edge List](https://amp.pharm.mssm.edu/static/hdfs/harmonizome/data/nursappi/gene_attribute_edges.txt.gz)をダウンロードします。このファイルには結合するタンパク質のペアが列記されています。この情報から結合するタンパクを結んだネットワークを構築して、これをポアンカレボールに埋め込みます。

#gensimのPoincarē embedding
pythonの自然言語言語処理ライブラリgenismにはPoincarē embeddingが実装されているので、これを使います。単語のペアのリストを与えると、単語同士を結んでできるネットワークをポアンカレボールに埋め込んでくれます。

~~~python
#libraryのimport
import pandas as pd
import numpy as np
from gensim.models.poincare import PoincareModel
from genism.viz.poincare import poincare_2d_visualization
from plotly.offline import iplot
#データセットの読み込み
#gene_attribute_edges.txt.gzをダウンロードし解凍しておきます。
#この中のsourceとtargetの項に結合するタンパクのペアが列記してあります。
dataset = pd.read_csv('gene_attribute_edges.txt', delimiter = '\t', usecols = [0,3], skiprows = [1])
#結合タンパクペアのリストを作成
relations = []
for i in range(len(dataset)):
    relations.append((dataset.source[i], dataset.target[i]))
#ポアンカレモデルをタンパクペアに適用
#後で二次元で可視化するので、size = 2とします。
model = PoincareModel(relations, size = 2)
model.train(epochs = 1000)
#可視化
#タンパク質間の結合を全て線で結ぶと複雑すぎて図が解らなくなるので、線の数をnum_nodesで5本に制限しています。
map = poincare_2d_visualization(model = model, tree = relations, figure_title = 'PPI network', num_nodes = 5)
iplot(map)
~~~~
![PPI_10epochs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353039/2b25166c-fce0-9ba7-8005-59fe0fbffee8.png)
![PPI_100epochs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353039/812bf63a-d4ae-9505-f9c1-01c32e54ff44.png)
![PPI_1000epochs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353039/9d1ebad6-e46f-b777-335e-487eba8a30d5.png)

一つ一つの点がタンパクを表し、結合するタンパクが線で結んであります。epochsの値を徐々に増やしていくと学習が進み、損失関数が減少するに従って結合の少ないタンパクが周縁部に、ハブとなるタンパクは中心部に配置され、階層的な構造が得られます。

#結論
gensimのPoincarē embeddingを使ってタンパク質間結合のネットワークをポアンカレボールに埋め込んでみました。学習が進むにつれて結合の少ないタンパクは周縁部に配置されていくのに対して、ハブとなるタンパクは中心部に残り、階層構造が獲得されていくことが解りました。
スケールフリー性を示すネットワークを埋め込むのにPoincarē embeddingは良い手法のようです。

#参考
[Maximillian Nickel and Douwe Kiela, “Poincaré Embeddings for Learning Hierarchical Representations”](https://arxiv.org/abs/1705.08039)
[genism](https://radimrehurek.com/gensim/models/poincare.html)
[Nuclear Receptor Signaling Atlas](https://www.nursa.org/nursa/index.jsf)
[Malovannaya, A et al., "Analysis of the human endogenous coregulator complexome"](https://www.sciencedirect.com/science/article/pii/S0092867411005320?via%3Dihub)