Algoritmo de rango de página e implementación

PageRank (PR) es un algoritmo utilizado por Google Search para clasificar sitios web en los resultados de su motor de búsqueda. PageRank lleva el nombre de Larry Page, uno de los fundadores de Google. PageRank es una forma de medir la importancia de las páginas de un sitio web. Según Google:

PageRank funciona contando el número y la calidad de los enlaces a una página para determinar una estimación aproximada de la importancia del sitio web. La suposición subyacente es que es probable que los sitios web más importantes reciban más enlaces de otros sitios web.

No es el único algoritmo utilizado por Google para ordenar los resultados del motor de búsqueda, pero es el primer algoritmo que utilizó la empresa, y es el más conocido.
La medida de centralidad anterior no se implementa para gráficos múltiples.

Algoritmo 
El algoritmo PageRank genera una distribución de probabilidad que se utiliza para representar la posibilidad de que una persona que hace clic aleatoriamente en los enlaces llegue a una página en particular. PageRank se puede calcular para colecciones de documentos de cualquier tamaño. Se supone en varios trabajos de investigación que la distribución se divide uniformemente entre todos los documentos de la colección al comienzo del proceso computacional. Los cálculos de PageRank requieren varias pasadas, llamadas «iteraciones», a través de la colección para ajustar los valores de PageRank aproximados para reflejar más fielmente el valor real teórico.

Algoritmo simplificado 
Suponga un pequeño universo de cuatro páginas web: A, B, C y D. Se ignoran los enlaces de una página a sí misma, o múltiples enlaces salientes de una sola página a otra única página. PageRank se inicializa con el mismo valor para todas las páginas. En la forma original de PageRank, la suma de PageRank en todas las páginas era el número total de páginas en la web en ese momento, por lo que cada página en este ejemplo tendría un valor inicial de 1. Sin embargo, las versiones posteriores de PageRank y el resto de esta sección, suponga una distribución de probabilidad entre 0 y 1. Por lo tanto, el valor inicial para cada página en este ejemplo es 0,25.
El PageRank transferido desde una página determinada a los objetivos de sus enlaces salientes en la siguiente iteración se divide por igual entre todos los enlaces salientes.
Si los únicos enlaces en el sistema fueran de las páginas B, C y D a A, cada enlace transferiría 0,25 PageRank a A en la siguiente iteración, para un total de 0,75.
PR(A) = PR(B) + PR(C) + PR(D).\,
Supongamos, en cambio, que la página B tiene un enlace a las páginas C y A, la página C tiene un enlace a la página A y la página D tiene enlaces a las tres páginas. Por lo tanto, en la primera iteración, la página B transferiría la mitad de su valor existente, o 0,125, a la página A y la otra mitad, o 0,125, a la página C. La página C transferiría todo su valor existente, 0,25, al único página a la que enlaza, A. Dado que D tenía tres enlaces salientes, transferiría un tercio de su valor existente, o aproximadamente 0,083, a A. Al finalizar esta iteración, la página A tendrá un PageRank de aproximadamente 0,458. 
PR(A)={\frac {PR(B)}{2}}+{\frac {PR(C)}{1}}+{\frac {PR(D)}{3}}.\,
En otras palabras, el PageRank conferido por un enlace saliente es igual a la puntuación de PageRank del propio documento dividida por el número de enlaces salientes L( ).
PR(A)={\frac {PR(B)}{L(B)}}+{\frac {PR(C)}{L(C)}}+{\frac {PR(D)}{L (D)}}.\,  En el caso general, el valor de PageRank para cualquier página u se puede expresar como:
PR(u) = \sum_{v \in B_u} \frac{PR(v)}{L(v)}  ,
es decir, el valor de PageRank para una página u depende de los valores de PageRank para cada página v contenida en el conjunto Bu (el conjunto que contiene todas las páginas que enlazan con la página). u), dividido por el número L(v) de enlaces de la página v. El algoritmo implica un factor de amortiguamiento para el cálculo del PageRank. Es como el impuesto sobre la renta que el gobierno extrae de uno a pesar de pagarlo él mismo.

A continuación se muestra el código para el cálculo del ranking de la página. 

Python

def pagerank(G, alpha=0.85, personalization=None,
             max_iter=100, tol=1.0e-6, nstart=None, weight='weight',
             dangling=None):
    """Return the PageRank of the nodes in the graph.
 
    PageRank computes a ranking of the nodes in the graph G based on
    the structure of the incoming links. It was originally designed as
    an algorithm to rank web pages.
 
    Parameters
    ----------
    G : graph
      A NetworkX graph.  Undirected graphs will be converted to a directed
      graph with two directed edges for each undirected edge.
 
    alpha : float, optional
      Damping parameter for PageRank, default=0.85.
 
    personalization: dict, optional
      The "personalization vector" consisting of a dictionary with a
      key for every graph node and nonzero personalization value for each node.
      By default, a uniform distribution is used.
 
    max_iter : integer, optional
      Maximum number of iterations in power method eigenvalue solver.
 
    tol : float, optional
      Error tolerance used to check convergence in power method solver.
 
    nstart : dictionary, optional
      Starting value of PageRank iteration for each node.
 
    weight : key, optional
      Edge data key to use as weight.  If None weights are set to 1.
 
    dangling: dict, optional
      The outedges to be assigned to any "dangling" nodes, i.e., nodes without
      any outedges. The dict key is the node the outedge points to and the dict
      value is the weight of that outedge. By default, dangling nodes are given
      outedges according to the personalization vector (uniform if not
      specified). This must be selected to result in an irreducible transition
      matrix (see notes under google_matrix). It may be common to have the
      dangling dict to be the same as the personalization dict.
 
    Returns
    -------
    pagerank : dictionary
       Dictionary of nodes with PageRank as value
 
    Notes
    -----
    The eigenvector calculation is done by the power iteration method
    and has no guarantee of convergence.  The iteration will stop
    after max_iter iterations or an error tolerance of
    number_of_nodes(G)*tol has been reached.
 
    The PageRank algorithm was designed for directed graphs but this
    algorithm does not check if the input graph is directed and will
    execute on undirected graphs by converting each edge in the
    directed graph to two edges.
 
     
    """
    if len(G) == 0:
        return {}
 
    if not G.is_directed():
        D = G.to_directed()
    else:
        D = G
 
    # Create a copy in (right) stochastic form
    W = nx.stochastic_graph(D, weight=weight)
    N = W.number_of_nodes()
 
    # Choose fixed starting vector if not given
    if nstart is None:
        x = dict.fromkeys(W, 1.0 / N)
    else:
        # Normalized nstart vector
        s = float(sum(nstart.values()))
        x = dict((k, v / s) for k, v in nstart.items())
 
    if personalization is None:
 
        # Assign uniform personalization vector if not given
        p = dict.fromkeys(W, 1.0 / N)
    else:
        missing = set(G) - set(personalization)
        if missing:
            raise NetworkXError('Personalization dictionary '
                                'must have a value for every node. '
                                'Missing nodes %s' % missing)
        s = float(sum(personalization.values()))
        p = dict((k, v / s) for k, v in personalization.items())
 
    if dangling is None:
 
        # Use personalization vector if dangling vector not specified
        dangling_weights = p
    else:
        missing = set(G) - set(dangling)
        if missing:
            raise NetworkXError('Dangling node dictionary '
                                'must have a value for every node. '
                                'Missing nodes %s' % missing)
        s = float(sum(dangling.values()))
        dangling_weights = dict((k, v/s) for k, v in dangling.items())
    dangling_nodes = [n for n in W if W.out_degree(n, weight=weight) == 0.0]
 
    # power iteration: make up to max_iter iterations
    for _ in range(max_iter):
        xlast = x
        x = dict.fromkeys(xlast.keys(), 0)
        danglesum = alpha * sum(xlast[n] for n in dangling_nodes)
        for n in x:
 
            # this matrix multiply looks odd because it is
            # doing a left multiply x^T=xlast^T*W
            for nbr in W[n]:
                x[nbr] += alpha * xlast[n] * W[n][nbr][weight]
            x[n] += danglesum * dangling_weights[n] + (1.0 - alpha) * p[n]
 
        # check convergence, l1 norm
        err = sum([abs(x[n] - xlast[n]) for n in x])
        if err < N*tol:
            return x
    raise NetworkXError('pagerank: power iteration failed to converge '
                        'in %d iterations.' % max_iter)

El código anterior es la función que se ha implementado en la biblioteca networkx. 

Para implementar lo anterior en networkx, tendrás que hacer lo siguiente:

Python

>>> import networkx as nx
>>> G=nx.barabasi_albert_graph(60,41)
>>> pr=nx.pagerank(G,0.4)
>>> pr

A continuación se muestra el resultado que obtendría en IDLE después de las instalaciones requeridas.

Python

{0: 0.012774147598875784, 1: 0.013359655345577266, 2: 0.013157355731377924,
3: 0.012142198569313045, 4: 0.013160014506830858, 5: 0.012973342862730735,
 6: 0.012166706783753325, 7: 0.011985935451513014, 8: 0.012973502696061718,
9: 0.013374146193499381, 10: 0.01296354505412387, 11: 0.013163220326063332,
 12: 0.013368514624403237, 13: 0.013169335617283102, 14: 0.012752071800520563,
15: 0.012951601882210992, 16: 0.013776032065400283, 17: 0.012356820581336275,
18: 0.013151652554311779, 19: 0.012551059531065245, 20: 0.012583415756427995,
 21: 0.013574117265891684, 22: 0.013167552803671937, 23: 0.013165528583400423,
 24: 0.012584981049854336, 25: 0.013372989228254582, 26: 0.012569416076848989,
 27: 0.013165322299539031, 28: 0.012954300960607157, 29: 0.012776091973397076,
 30: 0.012771016515779594, 31: 0.012953404860268598, 32: 0.013364947854005844,
33: 0.012370004022947507, 34: 0.012977539153099526, 35: 0.013170376268827118,
 36: 0.012959579020039328, 37: 0.013155319659777197, 38: 0.013567147133137161,
 39: 0.012171548109779459, 40: 0.01296692767996657, 41: 0.028089802328702826,
 42: 0.027646981396639115, 43: 0.027300188191869485, 44: 0.02689771667021551,
 45: 0.02650459107960327, 46: 0.025971186884778535, 47: 0.02585262571331937,
48: 0.02565482923824489, 49: 0.024939722913691394, 50: 0.02458271197701402,
 51: 0.024263128557312528, 52: 0.023505217517258568, 53: 0.023724311872578157,
 54: 0.02312908947188023, 55: 0.02298716954828392, 56: 0.02270220663300396,
 57: 0.022060403216132875, 58: 0.021932442105075004, 59: 0.021643288632623502}

El código anterior se ejecutó en IDLE (Python IDE de Windows). Deberá descargar la biblioteca networkx antes de ejecutar este código. La parte dentro de las llaves representa la salida. Es casi similar a Ipython (para usuarios de Ubuntu).

Referencias 

Por lo tanto, de esta manera se calcula la medida de centralidad de Page Rank para el gráfico dado. De esta manera hemos cubierto 2 medidas de centralidad. Me gustaría escribir más sobre las diversas medidas de centralidad utilizadas para el análisis de red.
Este artículo es una contribución de Jayant Bisht . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *