-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpotenciasMejorado.py
119 lines (93 loc) · 3.44 KB
/
potenciasMejorado.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
'''
Metodo de las potencias normalizado sobre la matriz de Google
@author: Gustavo Rivas Gervilla
'''
'''
A continuacion se muestra la declaracion de las matrices de los dos casos de estudio como matrices de Numpy.
Caso 1:
H = np.array([
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0.5, 0.5, 0, 0, 0, 0],
[0, 0.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.5, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 1.0/3, 0.5, 0, 0.5, 0, 0, 0, 0, 0, 0, 1.0/3, 0],
[0, 0, 1.0/3, 0, 0, 0, 1.0/3, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.5],
[1.0/3, 0, 0, 0, 0, 0, 0, 0, 0.5, 0, 0, 0, 0, 0],
[1.0/3, 0, 0, 0, 0, 0, 0, 0, 0, 0.5, 0, 0, 0, 0],
[1.0/3, 0, 1.0/3, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1.0/3, 0],
[0, 0, 0, 0.5, 0, 0, 1.0/3, 0, 0, 0, 0, 0, 0, 0],
[0, 0.5, 0, 0, 0, 0.5, 0, 1, 0, 0, 0, 0, 1.0/3, 0],
[0, 0, 0, 0, 0, 0, 1.0/3, 0, 0, 0, 0, 0.5, 0, 0.5],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
]);
Caso 2: desaparecen las flechas A,B,C
H = np.array([
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0.5, 0.5, 0, 0, 0, 0],
[0, 0.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.5, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 1.0/3, 0.5, 0, 0.5, 0, 0, 0, 0, 0, 0, 1.0/3, 0],
[0, 0, 1.0/3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.5],
[1.0/3, 0, 0, 0, 0, 0, 0, 0, 0.5, 0, 0, 0, 0, 0],
[1.0/3, 0, 0, 0, 0, 0, 0, 0, 0, 0.5, 0, 0, 0, 0],
[1.0/3, 0, 1.0/3, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1.0/3, 0],
[0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0.5, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, 1.0/3, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.5, 0, 0.5],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
]);
'''
import numpy as np
'''
Funcion que calcula la matriz A a partir de la H
@param H: la matriz de vinculos.
@return la matriz A calculada.
'''
def getA(H):
#necesito saber que columnas tienen todos sus elementos nulos
isNull = np.apply_along_axis(lambda col : not np.any(col != 0), 0, H)
A = np.zeros(H.shape)
#necesito contrarestar esas columnas con columnas con todos sus eltos. con valor 1/n
A[:, isNull] = 1.0 / A.shape[1]
return A
#H = np.array([[4,-1,1],[-1,3,-2],[1,-2,3]])
#declaro la matriz de vinculos
H = np.array([
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0.5, 0.5, 0, 0, 0, 0],
[0, 0.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.5, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 1.0/3, 0.5, 0, 0.5, 0, 0, 0, 0, 0, 0, 1.0/3, 0],
[0, 0, 1.0/3, 0, 0, 0, 1.0/3, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.5],
[1.0/3, 0, 0, 0, 0, 0, 0, 0, 0.5, 0, 0, 0, 0, 0],
[1.0/3, 0, 0, 0, 0, 0, 0, 0, 0, 0.5, 0, 0, 0, 0],
[1.0/3, 0, 1.0/3, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1.0/3, 0],
[0, 0, 0, 0.5, 0, 0, 1.0/3, 0, 0, 0, 0, 0, 0, 0],
[0, 0.5, 0, 0, 0, 0.5, 0, 1, 0, 0, 0, 0, 1.0/3, 0],
[0, 0, 0, 0, 0, 0, 1.0/3, 0, 0, 0, 0, 0.5, 0, 0.5],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
]);
#la matriz con todos sus elementos de la forma 1/n
aux = (1.0 / H.shape[0]) * np.ones(H.shape)
α = 0.85
S = H + getA(H)
G = α*S + (1 - α)*aux
#declaro el vector inicial para el metodo de las potencias
#v = np.array([1,0,0])
v = np.array([1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
λs = []
vs = []
n = 200
#aplicamos el metodo de las potencias
for i in range(n):
vPrev = v
v = G.dot(v)
notNullIdx = np.nonzero(vPrev)[0][0]
λs.append(v[notNullIdx]/vPrev[notNullIdx])
v = v / np.linalg.norm(v, ord = 1)
vs.append(vPrev)
print(λs)
print(vs)