https://github.com/hcui2/DIMSUM
Tip revision: 2a0214f000449bc12d2697bdb09ba6ab4b1a7a94 authored by Hongzhu Cui on 25 September 2019, 16:30:37 UTC
Initial Commit
Initial Commit
Tip revision: 2a0214f
network_prop.py
"""
-----------------------------------------------------------------------
Based on code by: Brin Rosenthal (sbrosenthal@ucsd.edu)
Adaped by Hongzhu Cui (hcui2@wpi.edu)
-----------------------------------------------------------------------
"""
import networkx as nx
import pandas as pd
import numpy as np
def normalized_adj_matrix(G,conserve_heat=False,weighted=False):
'''
This function returns normalized adjacency matrix.
Inputs:
- G: NetworkX graph from which to calculate normalized adjacency matrix
- conserve_heat:
- True: Heat will be conserved (sum of heat vector = 1). Graph asymmetric
- False: Heat will not be conserved. Graph symmetric.
'''
wvec=[]
for e in G.edges(data=True):
v1 = e[0]
v2 = e[1]
deg1 = G.degree(v1)
deg2 = G.degree(v2)
if weighted:
weight = e[2]['weight']
else:
weight=1
if conserve_heat:
wvec.append((v1,v2,weight/float(deg2))) #np.sqrt(deg1*deg2)))
wvec.append((v2,v1,weight/float(deg1)))
else:
wvec.append((v1,v2,weight/np.sqrt(deg1*deg2)))
if conserve_heat:
# if conserving heat, make G_weighted a di-graph (not symmetric)
G_weighted= nx.DiGraph()
else:
# if not conserving heat, make G_weighted a simple graph (symmetric)
G_weighted = nx.Graph()
G_weighted.add_weighted_edges_from(wvec)
Wprime = nx.to_numpy_matrix(G_weighted,nodelist=G.nodes())
Wprime = np.array(Wprime)
return Wprime
def network_propagation(G,Wprime,alpha=.5, num_its=20):
'''
This function implements network propagation, as detailed in:
Vanunu, Oron, et al. 'Associating genes and protein complexes with disease via network propagation.'
Inputs:
- G: NetworkX graph on which to run simulation
- Wprime: Normalized adjacency matrix (from normalized_adj_matrix)
- seed_genes: Genes on which to initialize the simulation.
- alpha: Heat dissipation coefficient. Default = 0.5
- num_its: Number of iterations (Default = 20. Convergence usually happens within 10)
Outputs:
- Fnew: heat vector after propagation
'''
nodes = G.nodes()
numnodes = len(nodes)
edges=G.edges()
numedges = len(edges)
Fold = np.zeros(numnodes)
Fold = pd.Series(Fold,index=G.nodes())
Y = np.zeros(numnodes)
Y = pd.Series(Y,index=G.nodes())
for g in nodes:
Y[g] = G.node[g]['norm_p']
Fold = Y.copy(deep=True)
for t in range(num_its):
Fnew = alpha*np.dot(Wprime,Fold) + np.multiply(1-alpha,Y)
Fold=Fnew
return Y, Fnew