DTINet实现所基于的假设为“guilt byassociation”,即两种药物或两种蛋白,其相似度越高,则其更有可能具有类似的作用,换一句话说,两个节点的拓扑结构越相似,其功能也越相似。通过将原始数据进行处理加工,最终转换成药物与蛋白的拓扑结构,然后通过已知的药物与蛋白的相互作用,便可学习得到药物与蛋白相互作用的模型,从而可以预测药物于蛋白之间新的相互作用。DTINet主要的步骤如下:
1.compute similarity
第一步需要将原始数据转化为similarity matrices,这里用到的是杰卡德相似指数(Jaccardsimilarity coefficient)。
杰卡德相似系数(Jaccard similarity coefficient),也称杰卡德指数(JaccardIndex),是用来衡量两个集合相似度的一种指标。而杰卡德距离(Jaccard distance)是用来衡量两个集合差异性的一种指标,它是杰卡德相似系数的补集,被定义为1减去Jaccard相似系数。
Jaccard相似指数被定义为两个集合交集的元素个数除以并集的元素个数:
Jaccard距离只适用于0-1矩阵,同时,其与汉明距离(Hamming distance)的区别为,Hamming距离关注0-0匹配,而Jaccard距离在计算时去除了0-0匹配,这也是为什么算法使用Jaccard距离而不是Hamming距离,例如两种药物都无法产生某种side-effect,但这并不一定代表其存在相似的信息。
在这里运用时是计算矩阵中每一行向量的Jaccard相似度,并转化为相似度矩阵,类似于相关系数矩阵,是一个对称矩阵。其python代码实现如下:
import pandas as pd
import numpy as np
from scipy.spatial.distance import pdist
from scipy.spatial.distance import squareform
import utils
Nets = ['mat_drug_drug', 'mat_drug_disease', 'mat_drug_se','mat_protein_protein', 'mat_protein_disease']
for net in Nets:
inputID='./data/'+net+'.txt'
M=pd.read_table(inputID,sep=' ', header=None)
# jaccard similarity
Sim=1-pdist(M,'jaccard')
Sim=squareform(Sim)
Sim=Sim+np.eye(len(Sim))
Sim=np.nan_to_num(Sim)
#output csv file
outputID='./data/Sim_'+net+'.csv'
utils.outputCSVfile(outputID,Sim)
#write chemical similarity to networks
M=pd.read_table('./data/Similarity_Matrix_Drugs.txt',sep=' ',header=None)
M=M.as_matrix(columns=None)
utils.outputCSVfile('./data/Sim_mat_drugs.csv',M)
#write sequence similarity to networks
M=pd.read_table('./data/Similarity_Matrix_Proteins.txt',sep=' ',header=None)
M=M.as_matrix(columns=None)
M=M/100
utils.outputCSVfile('./data/Sim_mat_proteins.csv',M)