def divrank_scipy(G, alpha=0.25, d=0.85, personalization=None,
                  max_iter=100, tol=1.0e-6, nstart=None, weight='weight',
                  dangling=None):
    '''
    Returns the DivRank (Diverse Rank) of the nodes in the graph.
    This code is based on networkx.pagerank_scipy
    '''
    import scipy.sparse

    N = len(G)
    if N == 0:
        return {}

    nodelist = G.nodes()
    M = nx.to_scipy_sparse_matrix(G, nodelist=nodelist, weight=weight,
                                  dtype=float)
    S = scipy.array(M.sum(axis=1)).flatten()
    S[S != 0] = 1.0 / S[S != 0]
    Q = scipy.sparse.spdiags(S.T, 0, *M.shape, format='csr')
    M = Q * M

    # self-link (DivRank)
    M = scipy.sparse.lil_matrix(M)
    M.setdiag(0.0)
    M = alpha * M
    M.setdiag(1.0 - alpha)
    #print M.sum(axis=1)

    # initial vector
    x = scipy.repeat(1.0 / N, N)

    # Personalization vector
    if personalization is None:
        p = scipy.repeat(1.0 / N, N)
    else:
        missing = set(nodelist) - set(personalization)
        if missing:
            raise NetworkXError('Personalization vector dictionary '
                                'must have a value for every node. '
                                'Missing nodes %s' % missing)
        p = scipy.array([personalization[n] for n in nodelist],
                        dtype=float)
        p = p / p.sum()

    # Dangling nodes
    if dangling is None:
        dangling_weights = p
    else:
        missing = set(nodelist) - set(dangling)


        if missing:
            raise NetworkXError('Dangling node dictionary '
                                'must have a value for every node. '
                                'Missing nodes %s' % missing)
        # Convert the dangling dictionary into an array in nodelist order
        dangling_weights = scipy.array([dangling[n] for n in nodelist],
                                       dtype=float)
        dangling_weights /= dangling_weights.sum()
    is_dangling = scipy.where(S == 0)[0]

    # power iteration: make up to max_iter iterations
    for _ in range(max_iter):
        xlast = x
        D_t =  M * x
        x = (
            d * (x / D_t * M * x + sum(x[is_dangling]) * dangling_weights)
            + (1.0 - d) * p
        )
        # check convergence, l1 norm
        err = scipy.absolute(x - xlast).sum()
        if err < N * tol:
            return dict(zip(nodelist, map(float, x)))

    raise NetworkXError('divrank_scipy: power iteration failed to converge '
                        'in %d iterations.' % max_iter)
def divrank_scipy(G, alpha=0.25, d=0.85, personalization=None,
                  max_iter=100, tol=1.0e-6, nstart=None, weight='weight',
                  dangling=None):
    '''
    Returns the DivRank (Diverse Rank) of the nodes in the graph.
    This code is based on networkx.pagerank_scipy
    '''
    import scipy.sparse

    N = len(G)
    if N == 0:
        return {}

    nodelist = G.nodes()
    M = nx.to_scipy_sparse_matrix(G, nodelist=nodelist, weight=weight,
                                  dtype=float)
    S = scipy.array(M.sum(axis=1)).flatten()
    S[S != 0] = 1.0 / S[S != 0]
    Q = scipy.sparse.spdiags(S.T, 0, *M.shape, format='csr')
    M = Q * M

    # self-link (DivRank)
    M = scipy.sparse.lil_matrix(M)
    M.setdiag(0.0)
    M = alpha * M
    M.setdiag(1.0 - alpha)
    #print M.sum(axis=1)

    # initial vector
    x = scipy.repeat(1.0 / N, N)

    # Personalization vector
    if personalization is None:
        p = scipy.repeat(1.0 / N, N)
    else:
        missing = set(nodelist) - set(personalization)
        if missing:
            raise NetworkXError('Personalization vector dictionary '
                                'must have a value for every node. '
                                'Missing nodes %s' % missing)
        p = scipy.array([personalization[n] for n in nodelist],
                        dtype=float)
        p = p / p.sum()

    # Dangling nodes
    if dangling is None:
        dangling_weights = p
    else:
        missing = set(nodelist) - set(dangling)


        if missing:
            raise NetworkXError('Dangling node dictionary '
                                'must have a value for every node. '
                                'Missing nodes %s' % missing)
        # Convert the dangling dictionary into an array in nodelist order
        dangling_weights = scipy.array([dangling[n] for n in nodelist],
                                       dtype=float)
        dangling_weights /= dangling_weights.sum()
    is_dangling = scipy.where(S == 0)[0]

    # power iteration: make up to max_iter iterations
    for _ in range(max_iter):
        xlast = x
        D_t =  M * x
        x = (
            d * (x / D_t * M * x + sum(x[is_dangling]) * dangling_weights)
            + (1.0 - d) * p
        )
        # check convergence, l1 norm
        err = scipy.absolute(x - xlast).sum()
        if err < N * tol:
            return dict(zip(nodelist, map(float, x)))

    raise NetworkXError('divrank_scipy: power iteration failed to converge '
                        'in %d iterations.' % max_iter)
def divrank_scipy ( G , alpha = 0.25 , d = 0.85 , personalization = None , max_iter = 100 , tol = 1.0e-6 , nstart = None , weight = 'weight' , dangling = None ) : import scipy . sparse N = len ( G ) if N == 0 : return { } nodelist = G . nodes ( ) M = nx . to_scipy_sparse_matrix ( G , nodelist = nodelist , weight = weight , dtype = float ) S = scipy . array ( M . sum ( axis = 1 ) ) . flatten ( ) S [ S != 0 ] = 1.0 / S [ S != 0 ] Q = scipy . sparse . spdiags ( S . T , 0 , * M . shape , format = 'csr' ) M = Q * M # self-link (DivRank) M = scipy . sparse . lil_matrix ( M ) M . setdiag ( 0.0 ) M = alpha * M M . setdiag ( 1.0 - alpha ) #print M.sum(axis=1) # initial vector x = scipy . repeat ( 1.0 / N , N ) # Personalization vector if personalization is None : p = scipy . repeat ( 1.0 / N , N ) else : missing = set ( nodelist ) - set ( personalization ) if missing : raise NetworkXError ( 'Personalization vector dictionary ' 'must have a value for every node. ' 'Missing nodes %s' % missing ) p = scipy . array ( [ personalization [ n ] for n in nodelist ] , dtype = float ) p = p / p . sum ( ) # Dangling nodes if dangling is None : dangling_weights = p else : missing = set ( nodelist ) - set ( dangling ) if missing : raise NetworkXError ( 'Dangling node dictionary ' 'must have a value for every node. ' 'Missing nodes %s' % missing ) # Convert the dangling dictionary into an array in nodelist order dangling_weights = scipy . array ( [ dangling [ n ] for n in nodelist ] , dtype = float ) dangling_weights /= dangling_weights . sum ( ) is_dangling = scipy . where ( S == 0 ) [ 0 ] # power iteration: make up to max_iter iterations for _ in range ( max_iter ) : xlast = x D_t = M * x x = ( d * ( x / D_t * M * x + sum ( x [ is_dangling ] ) * dangling_weights ) + ( 1.0 - d ) * p ) # check convergence, l1 norm err = scipy . absolute ( x - xlast ) . sum ( ) if err < N * tol : return dict ( zip ( nodelist , map ( float , x ) ) ) raise NetworkXError ( 'divrank_scipy: power iteration failed to converge ' 'in %d iterations.' % max_iter )
Returns the DivRank (Diverse Rank) of the nodes in the graph.
    This code is based on networkx.pagerank_scipy
Returns the DivRank ( Diverse Rank ) of the nodes in the graph . This code is based on networkx . pagerank_scipy