@@ -110,35 +110,51 @@ def _graph_laplacian_sparse(graph, normed=False, return_diag=False):
110110 return lap
111111
112112
113- def _graph_laplacian_dense (graph , normed = False , return_diag = False ):
113+ def _graph_laplacian_dense (graph , normalize = None ):
114114 n_nodes = graph .shape [0 ]
115- lap = - graph .copy ()
116- lap .flat [::n_nodes + 1 ] = 0
117- w = - lap .sum (axis = 0 )
118- if normed :
119- w = np .sqrt (w )
120- w_zeros = w == 0
121- w [w_zeros ] = 1
122- lap /= w
123- lap /= w [:, np .newaxis ]
124- lap .flat [::n_nodes + 1 ] = 1 - w_zeros
125- else :
126- lap .flat [::n_nodes + 1 ] = w
127- if return_diag :
128- return lap , w
129- return lap
130-
131-
132- def graph_laplacian (graph , normed = False , return_diag = False ):
115+ L = - graph .copy ()
116+ d = - lap .sum (axis = 0 ) # Compute the degrees of each node
117+ L .flat [::n_nodes + 1 ] += d
118+ if normalize == 'sym' :
119+ Dinv = np .diag (1 / d )
120+ L = np .dot (np .sqrt (Dinv ), np .dot (L , np .sqrt (Dinv )))
121+ elif normalize == 'rw' :
122+ Dinv = np .diag (1 / d )
123+ L = np .dot (Dinv , L )
124+ elif not normalize is None :
125+ raise ValueError ('normalize must be one of None, "sym", "rw"' )
126+ return L
127+
128+
129+ def graph_laplacian (graph , normalize = None ):
133130 """ Return the Laplacian of the given graph.
131+
132+ Parameters
133+ ----------
134+ graph: [n, n]
135+ sparse or dense array representing a similarity matrix (symmetric,
136+ s_ij >=0)
137+ normalize: (None, 'sym', 'rw')
138+ return the normalized graph Laplacian
139+ None: $L = D - S$
140+ 'sym': $L_{sym} = D^{-1/2}S*D^{-1/2}$
141+ 'rw': $L_{rw} = D^{-1}*S$
142+
143+ Returns
144+ -------
145+ laplacian: [n, n]
146+ Laplacian of the input similarity matrix
147+
148+ Reference
149+ ---------
150+ .. [1]: Von Luxberg (2007). Stat Comput (2007) 17: 395–416
151+ http://dx.doi.org/10.1007/s11222-007-9033-z
134152 """
135- if normed and (np .issubdtype (graph .dtype , np .int )
136- or np .issubdtype (graph .dtype , np .uint )):
153+ if normalize is None and (np .issubdtype (graph .dtype , np .int )
154+ or np .issubdtype (graph .dtype , np .uint )):
137155 graph = graph .astype (np .float )
138156 if sparse .isspmatrix (graph ):
139- return _graph_laplacian_sparse (graph , normed = normed ,
140- return_diag = return_diag )
157+ return _graph_laplacian_sparse (graph , normalize = normalize )
141158 else :
142159 # We have a numpy array
143- return _graph_laplacian_dense (graph , normed = normed ,
144- return_diag = return_diag )
160+ return _graph_laplacian_dense (graph , normalize = normalize )
0 commit comments