一句话总结:将有共表达的基因对当作上下文(context),利用Skip-Gram模型做gene embedding。
问题背景
NLP的一个动机是希望把文本转换成带有语义信息的向量送入机器学习模型计算,这篇文章希望在仅得知基因名的情况下,预测基因间相互作用。
方法
- 数据集:从GEO导出的984个全转录组人类基因数据集,在每个data set中,选择Pearson系数高于0.9的基因对作为共表达基因。
- 输入和输出:输入是基因对(相当于一个sentence),每行两个基因,如下所示:
ERAP1 OR51S1
SPRR2B DIP2A
F2RL1 ADGRA1
AKAP11 STK4
ELANE TLR8
输出是表示每个基因embedding向量,源代码中作者设置维数为100。
-
模型结构:这篇论文直接调用了
gensim
库,这个包可以对输入的词做word embedding。使用两层的神经网络,提取从输入层到隐藏层的权重矩阵作为embedding向量。
-
目标函数:对迭代次数和embedding维数调参,变化范围分别为1~10和 50~300。希望最大化以下函数:
Q' :embedding之后的所有可能的基因对;
Q:在MSigDB中找到6729条pathways;
: 内积,两个向量间相似度。
这个函数反应的是embedding后的基因间功能关系的程度。 具体实现
dimension = 100 # dimension of the embedding
sg = 1 # sg =1, skip-gram, sg =0, CBOW
window_size = 1 # The maximum distance between the gene and predicted gene within a gene list
model = gensim.models.Word2Vec(gene_pairs, size=dimension, window=window_size, min_count=1, workers=num_workers, iter=1, sg=sg)
因为每个句子是一个基因对,所以skip-gram中滑动窗口大小只能是1。
实验结果
(1)绘制基因间共表达图谱
使用t-SNE降维可视化,如下图所示:
可以看到相似度高的基因聚类后距离也相对较近。
(2)设计三层的全连接网络,拼接embedding后的两个基因的向量来预测这两个基因间是否有相互作用。
输入是两个基因名,输出为0或1(无/有基因间相互作用),模型架构如下图所示:
可以看到,准确度达到0.720.
总结
- 由于作者只用了基因名去预测基因间共表达,说明分布式表达后的基因,包含丰富的语义信息。
- 思考基因context的定义,这里使用的是共表达基因,是否可以用其它属性定义基因上下文,比如在文献中基因名共出现次数,基因相互作用等。