<jupyter_start><jupyter_text>Page Rank y Redes Sociales<jupyter_code>import numpy as np<jupyter_output><empty_output><jupyter_text>***1. Explicar el fenómeno de “mundo pequeño”, indicando en qué casos se da y cuáles son las características de un grafo en el que se presenta.*** Creo que se refiere al hecho de que si todas las personas pudieran formar una red social, podríamos conectar a cualquier par de personas con tan solo un camino de longitud 6 (dentro del grafo). ***2. Se tiene la siguiente información parcial sobre un grafo dirigido al cual se le ha aplicado PageRank hasta la convergencia:***• El PageRank de A es 0,15;• A tiene 2 links: uno hacia C y otro hacia B;• C recibe solo dos links, uno de los cuales viene de B;• El PageRank de D es 0,1;• B recibe un solo link;• D solo recibe un link que viene de C;• Desde C solo sale un link.***¿Cuántos links salen desde B? Justificar detalladamente.*** Tengo que plantear la siguiente ecuación:$PR_C = \frac{PR_A}{2} + \frac{PR_B}{N}$Y como el PageRank de C es el mismo de D, pues todo el PageRank de C va hacia D, vemos que:$PR_D = \frac{PR_A}{2} + \frac{PR_B}{N}$Y como el PageRank de B es la mitad del PageRank de A llegamos a: $PR_D = \frac{PR_A}{2} + \frac{PR_A}{2N}$Por lo tanto solo falta despejar la ecuación, una vez hacemos esto llegamos a que $N = 3$.  ***3. Dado el siguiente grafo******a. Hallar la matriz de transición******b. Analizar qué problemas presenta la misma para poder aplicar el modelo de Random Walker, y cómo esque los mismos se detectan*** |   | A | B   | C   | D   | E   | F   | G ||---|---|-----|-----|-----|-----|-----|---|| A | 0 | 1/2 | 0   | 0   | 0   | 0   | 0 || B | 0 | 0   | 1   | 1/3 | 0   | 0   | 0 || C | 0 | 0   | 0   | 1/3 | 0   | 0   | 0 || D | 0 | 1/2 | 0   | 0   | 1/2 | 0   | 0 || E | 0 | 0   | 0   | 0   | 0   | 1   | 0 || F | 0 | 0   | 0   | 1/3 | 0   | 0   | 0 || G | 0 | 0   | 0   | 0   | 1/2 | 0   | 0 | Los nodos A y G son dead end pues todo el PageRank quedará atrapado ahí. ***4. Una empresa de alquiler de monopatines eléctricos tiene 4 estaciones (A, B, C, D) en donde los usuarios pueden alquilar monopatines. En experimentos iniciales, la empresa pudo determinar con qué frecuencia los usuarios van desde una estación a otra. Dicha información se presenta en la siguiente tabla.******A partir de la información anterior, aplicar PageRank para determinar la cantidad de monopatines que se deben asignar a cada estación al comienzo de cada día, considerando que el total de monopatines de la empresa es 100.***<jupyter_code>M4 = np.array([[5/20, 10/15, 2/35, 0/25],
               [8/20, 0/15, 5/35, 6/25],
               [3/20, 3/15, 5/35, 15/25],
               [4/20, 2/15, 23/35, 4/25]])
M4
v4 = np.array([1/4, 1/4, 1/4, 1/4])
v4
for i in range(1,1000):
    v4 = np.dot(M4, v4)
v4 * 100<jupyter_output><empty_output><jupyter_text>Apliqué pagerank hasta que los valores convergan. Ahora sabemos, en función de eso, cuantos monopatines le tenemos que asignar a cada estación. ***5. Sea el grafo dirigido G cuya lista de aristas es la siguiente: (A B), (B C), (B D), (D E), (E C), (C A), (C D). Se sabe que los valores de PageRank actuales de los nodos son: A = 0,31 B = 0,30 C = 0,08 D = 0,12 E = 0,19.******Calcular el valor de PageRank de cada nodo para la siguiente iteración, usando B = 0,8.*** Asumiendo que $B = 0.8$ es $\beta$ entonces armamos la matriz de teletransportación en función de la original y multiplicamos por los PageRanks:<jupyter_code>N5 = np.array([[1/5]*5]*5)
N5
M5 = np.array([[0,1,0,0,0],[0,0,0.5,0.5,0],[0.5,0,0,0.5,0],[0,0,0,0,1],[0,0,1,0,0]]).transpose()
M5
v5 = np.array([0.31, 0.3, 0.08, 0.12, 0.19])
v5
beta = 0.8
M5_teleport = beta * M5 + (1-beta) * N5
M5_teleport<jupyter_output><empty_output><jupyter_text>Y vemos la próxima iteración<jupyter_code>np.dot(M5_teleport, v5)<jupyter_output><empty_output><jupyter_text>***9. Dado el siguiente grafo:******a. Mostrar la distribución de grados;******b. Indicar cuál es el diámetro de la red;******c. Calcular el coeficiente de clustering promedio;******d. Comparar dichos valores con los valores característicos de una red social, analizando semejanzas y diferencias*** Distribucion de grados:```A -> 4B -> 2C -> 2D -> 3E -> 3F -> 3G -> 3``` Diametro de la red: 3 El coeficiente de clustering promedio se calcula como:```A -> 1/2B -> 1C -> 0D -> 1/3E -> 1/3F -> 1/3G -> 1/3``` Las redes sociales tienden a seguir la distribucion de power law, donde la cantidad de nodos con grado $k$ se calcula mediante $\frac{1}{k}$, pero vemos que nuestro grafo no sigue dicha distribución. Luego el diámetro de de una red social suele ser bajo, siendo del orden de `log10(n)`,     pero vemos que $log_{10}(7) \approx 0.8 << 3$ asi que no es como una red socialen este sentido tampoco. Finalmente el coeficiente de clustering promedio para unared social suele ser bastante alto (cercano a 1) mientras que el nuestro es bajo(0.35) asi que nuestro grafo no presenta ningun similitud en estos parametroscomparable con la de una red social. ***11. Realizar TopicRank del topic 1 asociado al grafo dado por lo siguiente:***• ***A pertenece al topic 1 y enlaza con B, C y E;***• ***B pertenece al topic 1 y enlaza con A y E;***• ***C pertenece al topic 2 y enlaza con A, C y D;***• ***D pertenece al topic 1 y enlaza con E;***• ***E pertenece al topic 2 y no tiene más links.******Realizar 3 iteraciones con beta en 0,3 y rankear los resultados. Determinar si puede considerar que los resultados son adecuados y por qué.***<jupyter_code>M11 = np.array([[0, 1/3, 1/3, 0, 1/3], [1/2, 0, 0, 0, 1/2],
                [1/3, 0, 1/3, 1/3, 0], [0, 0, 0, 0, 1], [0, 0, 0 , 0, 0]]).transpose()
M11
N11 = np.array([[1/3, 1/3, 0 , 1/3, 0], [1/3, 1/3, 0 , 1/3, 0], [1/3, 1/3, 0 , 1/3, 0],
                [1/3, 1/3, 0 , 1/3, 0], [1/3,1/3, 0, 1/3 , 0]])
N11
beta = 0.3
M11_teleport = beta * M11 + (1 - beta)*N11
M11_teleport
v11 = np.array([1/5, 1/5, 1/5, 1/5, 1/5])
for i in range(0,3):
    v11 = np.dot(M11_teleport, v11)
v11<jupyter_output><empty_output><jupyter_text>***14. Aplicar PageRank para el siguiente grafo hasta la convergencia, indicando el ranking final de cada nodo (tomar beta en 0,8).***<jupyter_code>M14 = np.array([[0,1,0,0,0,0,0], [0,0,1,0,0,0,0], [0,0,0,1,0,0,0], [1/3,0,0,0,0,1/3,1/3], 
                [0,1/2,1/2,0,0,0,0], [0,0,1,0,0,0,0], [0,0,0,0,0,0,1]]).transpose()
M14
beta = 0.8
v14 = np.array([1/7]*7)
v14
N14 = np.array([[1/7]*7]*7)
N14
M14_teleport = beta * M14 + (1 - beta)*N14
M14_teleport
for i in range(0,300000):
    v14 = np.dot(M14_teleport, v14)
v14<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.14960510328068044, 'fraction_numerical': 0.07518226002430134, 'mean_word_length': 3.5041039671682626, 'pattern_counts': {'":': 0, '<': 27, '<?xml version=': 0, '>': 39, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 7, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '209292', 'license': 'MIT', 'n_tokens_mistral': 2876, 'n_tokens_neox': 2631, 'n_words': 956, 'path': '.ipynb_checkpoints/Page Rank y Redes Sociales-checkpoint.ipynb', 'repo_name': 'Jonathan-R0/Final-Organizacion-de-Datos', 'size': '6584'}