Está en la página 1de 8

Code

●Show All Code


●Hide All Code

●Download Rmd

Introducción al análisis de grupos


Juan David Ospina Arango

Universidad Nacional de Colombia - Sede Medellín

Departamento de Ciencias de la Computación y de la Decisión

Técnicas de aprendizaje estadístico

Semestre 02-2019
Este documento trabaja el análisis de grupos como una ténica de aprendizaje no supervisado. Se
consideran métodos no supervisados porque las observaciones no tienen una clasificación a priori.
En lugar de ello queremos ver si las observaciones se agrupan de manera natural.

El problema del agrupamiento

Dadas las observaciones \(\mathbf{x_1}\), …, \(\mathbf{x_n}\), que pertenecen a \(\mathbb{R}^d\)


queremos agruparlos de manera que:

● Las observaciones de un mismo grupo sean muy similares


● Las observaciones de dos grupos diferentes sean muy diferentes.

Esto requiere dos cosas:

● Un criterio (o medida) de similaridad


● Una estrategia para crear los grupos que optimice este criterio para obtener grupos.

Una manera de crear los grupos es utilizando métodos de particionamiento, como por ejemplo
árboles de decisión o bosques aleatorios. Estos métodos tiene la ventaja de poder considerar
simultáneamente variables cualitativas y cuantitativas. En este documento nos enfocaremos en los
métodos de agrupamiento jerárquico.
Similaridad

Comenzaremos por tratar la noción de similaridad. En términos matemáticos, dos observaciones


son similares si están cerca en términos de una función de distancia. De esta manera las nociones
de cercanía y similaridad son prácticamente equivalentes en el análisis de grupos.

Una distancia en \(\mathbb{R}^d\) es una función \(d: \mathbb{R}^d \times \mathbb{R}^d


\rightarrow [0,+\infty)\) tal que para las observaciones \(\mathbf{x_1}\), \(\mathbf{x_2}\) y \
(\mathbf{x_3}\), entonces:

● \(d(\mathbf{x_1},\mathbf{x_2})\geq 0\), para todo \(\mathbf{x_1}\) y \(\mathbf{x_2}\)


● \(d(\mathbf{x_1},\mathbf{x_2})=0\) si y solo si \(\mathbf{x_1}=\mathbf{x_2}\),
● \(d(\mathbf{x_1},\mathbf{x_2})=d(\mathbf{x_2},\mathbf{x_1})\),
● \(d(\mathbf{x_1},\mathbf{x_2})\leq d(\mathbf{x_1},\mathbf{x_3})
+d(\mathbf{x_3},\mathbf{x_2})\).

La similaridad se define en términos de una función de distancia y la disimilaridad en términos de la


similaridad.

Ejemplos de medidas de similaridad son la aplicación de las normas conocidas sobre la diferencia
entre dos observaciones:

1. Norma-p: \(d(\mathbf{x_1},\mathbf{x_2})=(\sum_{j=1}^{d}|x_j^{(1)}-x_j^{(2)}|)^{1/2}\). Esta


norma es sensible a las escalas de las variables.
2. Norma infinito: \(d(\mathbf{x_1},\mathbf{x_2})=sup_{1\leq j \leq d} |x_j^{(1)}-x_j^{(2)}|\). Esta
norma es sensible a las escalas de las variables.
3. Mahalanobis: \(d(\mathbf{x_1},\mathbf{x_2})=(\mathbf{x_1}-\mathbf{x_2})^TS^{-1}
(\mathbf{x_1}-\mathbf{x_2})\), donde \(S\) es la matriz de varianzas y covarianzas de las
observaciones. Esta distancia es invariante a transformaciones de la forma \(A\mathbf{x}
+\mathbf{b}\) (A matriz).
4. Canberra: \(d(\mathbf{x_1},\mathbf{x_2})=\frac{1}{d}\sum_{j}\frac{|x_j^{(1)}-x_j^{(2)}|}{|
x_j^{(1)}+x_j^{(2)}|}\). Esta norma se utiliza sobre todo para objetos binarios.

Métodos aglomerativos

Si se tienen \(n\) observaciones \(\mathbf{x_1}\), …, \(\mathbf{x_n}\), se comienza con \(n\) grupos y


con la matriz de distancias \(D=(d_{ij})=d(\mathbf{x}_i,\mathbf{x}_j)\). En este método se
“aglomeran” las observaciones, es decir que si varias observaciones se agrupan entonces ellas se
reemplazan por una nueva observación que las represente (i.e el promedio de todas ellas).

Como se dijo antes, se comienza con \(n\) grupos donde cada observación es un grupo. A partir de
esto los pasos son los siguientes:

1. Se fusionan los dos grupos más cercanos. Así se tienen \(n-2\) grupos que contienen una
observación y un grupo que contiene dos observaciones. En total hay \(n-1\) grupos.
2. Se fusionan los dos grupos más cercanos para obtener \(n-2\) grupos.
3. Se continúa de esta manera hasta llegar a un solo grupo.

A medida que las observaciones se aglomeran en grupos es necesario entonces medir la distancia
entre grupos. Algunas distancias entre grupos son \(G_1\) y \(G_2\):

● Single linkage: \(\Delta(G_1,G_2)=\min_{\mathbf{x} \in G_1,\mathbf{y} \in G_2,}


d(\mathbf{x},\mathbf{y})\)
● Complete linkage: \(\Delta(G_1,G_2)=\max_{\mathbf{x} \in G_1,\mathbf{y} \in G_2,}
d(\mathbf{x},\mathbf{y})\)
● Centroide: \(\Delta(G_1,G_2)=d(\mathbf{\bar {x}}_{G_1},\mathbf{\bar {x}}_{G_2})\), donde \
(\mathbf{\bar {x}}_{G_1}\) y \(\mathbf{\bar {x}}_{G_2}\) son los centroides de los grupos \
(G_1\) y \(G_2\) respectivamente, que se pueden definir como la observación promedio de
cada grupo. El centroide del grupo resultante de la unión de los grupos \(G_1\) y \(G_2\) se
puede definir como \(\mathbf{\bar {x}}_{G_1,G_2}=\frac{|G_1| \mathbf{\bar {x}}_{G_1} +|
G_2| \mathbf{\bar {x}}_{G_2}}{|G_1|+|G_2|}\), donde \(|G_i|\) es el número de observaciones
en el grupo \(i\).
● Suma de cuadrados incremental (Ward): se fusionan los grupos \(G_1\) y \(G_2\) que
minimicen el funcional \(I(G_1,G_2)\): \[I(G_1,G_2)=\sum_{\mathbf{x} \in G_1 \cup G_2}
{d^2(\mathbf{x},\mathbf{\bar {x}}_{G_1,G_2})}-\{\sum_{\mathbf{x} \in G_1 }
{d^2(\mathbf{x},\mathbf{\bar {x}}_{G_1})}+\sum_{\mathbf{x} \in G_2}
{d^2(\mathbf{x},\mathbf{\bar {x}}_{G_2})} \}.\]

Ejemplo (single linkage):

Consideremos la siguiente matriz de distancias:

1. Los dos grupos más cercanos son los conformados por el grupo que tiene la observación 1
y el que tiene la observación 3. La distancia entre estos grupos es \(h=1\). Estos dos grupos
constituirán un nuevo grupo. Así, la nueva matriz de distancias es:
2. Ahora son el grupo conformado por la observación 2 y el grupo conformado por la
observación 4 los más cercanos. La distancia entre estos dos grupos es \(h=3\). Al
fusionarlos tenemos la siguiente matriz de distancias:
3. Ahora son el grupo conformado por la observación 5 y el grupo G24 los que se fusionarán.
La distancia entre estos dos grupos es \(h=4\). La matriz de distancias actualizada es:
4. Finalmente, la distancia entre los dos grupos resultantes es de \(h=5\).
Podemos representar esto con ayuda de un dendograma, así:
D_dist=as.dist(D)
d_tree=hclust(D_dist,method="single")
plot(d_tree, main="Dendograma")

Ejemplo: USArrest

Consideremos la base de datos USArrest que contiene información tasas de crímene en ciudades
de Estados Unidos:
data("USArrests")
head(USArrests)

Apliquemos la metodología anterior:


USArrests_dist=dist(USArrests)
USArrests_clust=hclust(USArrests_dist,method="single")
plot(USArrests_clust)

Si queremos segmentar el conjunto de ciudades, por ejemplo en seis grupos, podemos proceder
así:
USArrests_clust_4=cutree(USArrests_clust,k=6)
plot(USArrests_clust)
rect.hclust(USArrests_clust,k=6)

LS0tCnRpdGxlOiAiSW50cm9kdWNjacOzbiBhbCBhbsOhbGlzaXMgZGUgZ3J1cG9zIgphdXRob3I6I
CJKdWFuIERhdmlkIE9zcGluYSBBcmFuZ28gPGJyLz4gVW5pdmVyc2lkYWQgTmFjaW9uYWwgZG
UgQ29sb21iaWEgLSBTZWRlIE1lZGVsbMOtbiA8YnIvPiBEZXBhcnRhbWVudG8gZGUgQ2llbmNpYX
MgZGUgbGEgQ29tcHV0YWNpw7NuIHkgZGUgbGEgRGVjaXNpw7NuIDxici8+IFTDqWNuaWNhcyB
kZSBhcHJlbmRpemFqZSBlc3RhZMOtc3RpY28iCmRhdGU6ICJTZW1lc3RyZSAwMi0yMDE5IgpvdX
RwdXQ6CiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdAogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQ
KICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0Ci0tLQoKRXN0ZSBkb2N1bWVudG8gdHJhYmFqYSBlb
CBhbsOhbGlzaXMgZGUgZ3J1cG9zIGNvbW8gdW5hIHTDqW5pY2EgZGUgW2FwcmVuZGl6YWplI
G5vIHN1cGVydmlzYWRvXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VbnN1cGVydmlzZ
WRfbGVhcm5pbmcpLiBTZSBjb25zaWRlcmFuIG3DqXRvZG9zIG5vIHN1cGVydmlzYWRvcyBwb3Jx
dWUgbGFzIG9ic2VydmFjaW9uZXMgbm8gdGllbmVuIHVuYSBjbGFzaWZpY2FjacOzbiAqYSBwcmlv
cmkqLiBFbiBsdWdhciBkZSBlbGxvIHF1ZXJlbW9zIHZlciBzaSBsYXMgb2JzZXJ2YWNpb25lcyBzZS
BhZ3J1cGFuIGRlIG1hbmVyYSBuYXR1cmFsLgoKIyBFbCBwcm9ibGVtYSBkZWwgYWdydXBhbWll
bnRvCkRhZGFzIGxhcyBvYnNlcnZhY2lvbmVzICRcbWF0aGJme3hfMX0kLCAuLi4sICRcbWF0aGJm
e3hfbn0kLCBxdWUgcGVydGVuZWNlbiBhICRcbWF0aGJie1J9XmQkIHF1ZXJlbW9zIGFncnVwYXJs
b3MgZGUgbWFuZXJhIHF1ZToKCisgTGFzIG9ic2VydmFjaW9uZXMgZGUgdW4gbWlzbW8gZ3J1cG
8gc2VhbiBtdXkgc2ltaWxhcmVzCisgTGFzIG9ic2VydmFjaW9uZXMgZGUgZG9zIGdydXBvcyBkaWZl
cmVudGVzIHNlYW4gbXV5IGRpZmVyZW50ZXMuCgpFc3RvIHJlcXVpZXJlIGRvcyBjb3NhczoKCisgV
W4gY3JpdGVyaW8gKG8gbWVkaWRhKSBkZSBzaW1pbGFyaWRhZAorIFVuYSBlc3RyYXRlZ2lhIHB
hcmEgY3JlYXIgbG9zIGdydXBvcyBxdWUgb3B0aW1pY2UgZXN0ZSBjcml0ZXJpbyBwYXJhIG9idGV
uZXIgZ3J1cG9zLgoKClVuYSBtYW5lcmEgZGUgY3JlYXIgbG9zIGdydXBvcyBlcyB1dGlsaXphbmRvIF
ttw6l0b2RvcyBkZSBwYXJ0aWNpb25hbWllbnRvXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2l
raS9SZWN1cnNpdmVfcGFydGl0aW9uaW5nKSwgY29tbyBwb3IgZWplbXBsbyBbw6FyYm9sZXMgZ
GUgZGVjaXNpw7NuXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9EZWNpc2lvbl90cmVlX
2xlYXJuaW5nKSBvIFtib3NxdWVzIGFsZWF0b3Jpb3NdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy9
3aWtpL1JhbmRvbV9mb3Jlc3QpLiBFc3RvcyBtw6l0b2RvcyB0aWVuZSBsYSB2ZW50YWphIGRlIHB
vZGVyIGNvbnNpZGVyYXIgc2ltdWx0w6FuZWFtZW50ZSB2YXJpYWJsZXMgY3VhbGl0YXRpdmFzI
HkgY3VhbnRpdGF0aXZhcy4gRW4gZXN0ZSBkb2N1bWVudG8gbm9zIGVuZm9jYXJlbW9zIGVuIGx
vcyBtw6l0b2RvcyBkZSBbYWdydXBhbWllbnRvIGplcsOhcnF1aWNvXShodHRwczovL2VuLndpa2lw
ZWRpYS5vcmcvd2lraS9IaWVyYXJjaGljYWxfY2x1c3RlcmluZykuCgojIyBTaW1pbGFyaWRhZApDb2
1lbnphcmVtb3MgcG9yIHRyYXRhciBsYSBub2Npw7NuIGRlIHNpbWlsYXJpZGFkLiBFbiB0w6lybWlu
b3MgbWF0ZW3DoXRpY29zLCBkb3Mgb2JzZXJ2YWNpb25lcyBzb24gc2ltaWxhcmVzIHNpIGVzdM
OhbiBjZXJjYSBlbiB0w6lybWlub3MgZGUgdW5hIGZ1bmNpw7NuIGRlIGRpc3RhbmNpYS4gRGUgZ
XN0YSBtYW5lcmEgbGFzIG5vY2lvbmVzIGRlIGNlcmNhbsOtYSB5IHNpbWlsYXJpZGFkIHNvbiBwcs
OhY3RpY2FtZW50ZSBlcXVpdmFsZW50ZXMgZW4gZWwgYW7DoWxpc2lzIGRlIGdydXBvcy4KClVu
YSBkaXN0YW5jaWEgZW4gJFxtYXRoYmJ7Un1eZCQgZXMgdW5hIGZ1bmNpw7NuICRkOiBcbWF0
aGJie1J9XmQgXHRpbWVzIFxtYXRoYmJ7Un1eZCBccmlnaHRhcnJvdyBbMCwrXGluZnR5KSQgdG
FsIHF1ZSBwYXJhIGxhcyBvYnNlcnZhY2lvbmVzICRcbWF0aGJme3hfMX0kLCAkXG1hdGhiZnt4XzJ
9JCB5ICRcbWF0aGJme3hfM30kLCBlbnRvbmNlczoKCisgJGQoXG1hdGhiZnt4XzF9LFxtYXRoYmZ
7eF8yfSlcZ2VxIDAkLCBwYXJhIHRvZG8gJFxtYXRoYmZ7eF8xfSQgeSAkXG1hdGhiZnt4XzJ9JAorIC
RkKFxtYXRoYmZ7eF8xfSxcbWF0aGJme3hfMn0pPTAkIHNpIHkgc29sbyBzaSAkXG1hdGhiZnt4XzF
9PVxtYXRoYmZ7eF8yfSQsCisgJGQoXG1hdGhiZnt4XzF9LFxtYXRoYmZ7eF8yfSk9ZChcbWF0aGJ
me3hfMn0sXG1hdGhiZnt4XzF9KSQsCisgJGQoXG1hdGhiZnt4XzF9LFxtYXRoYmZ7eF8yfSlcbGVxI
GQoXG1hdGhiZnt4XzF9LFxtYXRoYmZ7eF8zfSkrZChcbWF0aGJme3hfM30sXG1hdGhiZnt4XzJ9KS
QuCgpMYSBzaW1pbGFyaWRhZCBzZSBkZWZpbmUgZW4gdMOpcm1pbm9zIGRlIHVuYSBmdW5j
acOzbiBkZSBkaXN0YW5jaWEgeSBsYSBkaXNpbWlsYXJpZGFkIGVuIHTDqXJtaW5vcyBkZSBsYSB
zaW1pbGFyaWRhZC4KCkVqZW1wbG9zIGRlIG1lZGlkYXMgZGUgc2ltaWxhcmlkYWQgc29uIGxhIG
FwbGljYWNpw7NuIGRlIGxhcyBub3JtYXMgY29ub2NpZGFzIHNvYnJlIGxhIGRpZmVyZW5jaWEgZW
50cmUgZG9zIG9ic2VydmFjaW9uZXM6CgoxLiBOb3JtYS1wOiAkZChcbWF0aGJme3hfMX0sXG1hd
GhiZnt4XzJ9KT0oXHN1bV97aj0xfV57ZH18eF9qXnsoMSl9LXhfal57KDIpfXwpXnsxLzJ9JC4gRXN0Y
SBub3JtYSBlcyBzZW5zaWJsZSBhIGxhcyBlc2NhbGFzIGRlIGxhcyB2YXJpYWJsZXMuCjIuIE5vcm1
hIGluZmluaXRvOiAkZChcbWF0aGJme3hfMX0sXG1hdGhiZnt4XzJ9KT1zdXBfezFcbGVxIGogXGxlc
SBkfSB8eF9qXnsoMSl9LXhfal57KDIpfXwkLiBFc3RhIG5vcm1hIGVzIHNlbnNpYmxlIGEgbGFzIGVzY
2FsYXMgZGUgbGFzIHZhcmlhYmxlcy4KMy4gTWFoYWxhbm9iaXM6ICRkKFxtYXRoYmZ7eF8xfSxc
bWF0aGJme3hfMn0pPShcbWF0aGJme3hfMX0tXG1hdGhiZnt4XzJ9KV5UU157LTF9KFxtYXRoYm
Z7eF8xfS1cbWF0aGJme3hfMn0pJCwgZG9uZGUgJFMkIGVzIGxhIG1hdHJpeiBkZSB2YXJpYW56Y
XMgeSBjb3ZhcmlhbnphcyBkZSBsYXMgb2JzZXJ2YWNpb25lcy4gRXN0YSBkaXN0YW5jaWEgZXM
gaW52YXJpYW50ZSBhIHRyYW5zZm9ybWFjaW9uZXMgZGUgbGEgZm9ybWEgJEFcbWF0aGJme
3h9K1xtYXRoYmZ7Yn0kIChBIG1hdHJpeikuIAo0LiBDYW5iZXJyYTogJGQoXG1hdGhiZnt4XzF9LFxt
YXRoYmZ7eF8yfSk9XGZyYWN7MX17ZH1cc3VtX3tqfVxmcmFje3x4X2peeygxKX0teF9qXnsoMil9fH
17fHhfal57KDEpfSt4X2peeygyKX18fSQuIEVzdGEgbm9ybWEgc2UgdXRpbGl6YSBzb2JyZSB0b2Rv
IHBhcmEgb2JqZXRvcyBiaW5hcmlvcy4KCiMjIE3DqXRvZG9zIGFnbG9tZXJhdGl2b3MKU2kgc2Ugd
GllbmVuICRuJCBvYnNlcnZhY2lvbmVzICRcbWF0aGJme3hfMX0kLCAuLi4sICRcbWF0aGJme3hfbn
0kLCBzZSBjb21pZW56YSBjb24gJG4kIGdydXBvcyB5IGNvbiBsYSBtYXRyaXogZGUgZGlzdGFuY2l
hcyAkRD0oZF97aWp9KT1kKFxtYXRoYmZ7eH1faSxcbWF0aGJme3h9X2opJC4gRW4gZXN0ZSBt
w6l0b2RvIHNlICJhZ2xvbWVyYW4iIGxhcyBvYnNlcnZhY2lvbmVzLCBlcyBkZWNpciBxdWUgc2kgdm
FyaWFzIG9ic2VydmFjaW9uZXMgc2UgYWdydXBhbiBlbnRvbmNlcyBlbGxhcyBzZSByZWVtcGxhem
FuIHBvciB1bmEgbnVldmEgb2JzZXJ2YWNpw7NuIHF1ZSBsYXMgcmVwcmVzZW50ZSAoaS5lIGVsI
HByb21lZGlvIGRlIHRvZGFzIGVsbGFzKS4KCkNvbW8gc2UgZGlqbyBhbnRlcywgc2UgY29taWVuem
EgY29uICRuJCBncnVwb3MgZG9uZGUgY2FkYSBvYnNlcnZhY2nDs24gZXMgdW4gZ3J1cG8uIEEg
cGFydGlyIGRlIGVzdG8gbG9zIHBhc29zIHNvbiBsb3Mgc2lndWllbnRlczoKCjEuIFNlIGZ1c2lvbmFuIG
xvcyBkb3MgZ3J1cG9zIG3DoXMgY2VyY2Fub3MuIEFzw60gc2UgdGllbmVuICRuLTIkIGdydXBvcyB
xdWUgY29udGllbmVuIHVuYSBvYnNlcnZhY2nDs24geSB1biBncnVwbyBxdWUgY29udGllbmUgZG
9zIG9ic2VydmFjaW9uZXMuIEVuIHRvdGFsIGhheSAkbi0xJCBncnVwb3MuCjIuIFNlIGZ1c2lvbmFuIG
xvcyBkb3MgZ3J1cG9zIG3DoXMgY2VyY2Fub3MgcGFyYSBvYnRlbmVyICRuLTIkIGdydXBvcy4KMy
4gU2UgY29udGluw7phIGRlIGVzdGEgbWFuZXJhIGhhc3RhIGxsZWdhciBhIHVuIHNvbG8gZ3J1cG8
uCgpBIG1lZGlkYSBxdWUgbGFzIG9ic2VydmFjaW9uZXMgc2UgYWdsb21lcmFuIGVuIGdydXBvcyBl
cyBuZWNlc2FyaW8gZW50b25jZXMgbWVkaXIgbGEgZGlzdGFuY2lhIGVudHJlIGdydXBvcy4gQWxn
dW5hcyBkaXN0YW5jaWFzIGVudHJlIGdydXBvcyBzb24gJEdfMSQgeSAkR18yJDoKCisgU2luZ2xlIG
xpbmthZ2U6ICRcRGVsdGEoR18xLEdfMik9XG1pbl97XG1hdGhiZnt4fSBcaW4gR18xLFxtYXRoYmZ
7eX0gXGluIEdfMix9IGQoXG1hdGhiZnt4fSxcbWF0aGJme3l9KSQKKyBDb21wbGV0ZSBsaW5rYWd
lOiAkXERlbHRhKEdfMSxHXzIpPVxtYXhfe1xtYXRoYmZ7eH0gXGluIEdfMSxcbWF0aGJme3l9IFxpbi
BHXzIsfSBkKFxtYXRoYmZ7eH0sXG1hdGhiZnt5fSkkCisgQ2VudHJvaWRlOiAkXERlbHRhKEdfMSx
HXzIpPWQoXG1hdGhiZntcYmFyIHt4fX1fe0dfMX0sXG1hdGhiZntcYmFyIHt4fX1fe0dfMn0pJCwgZG
9uZGUgJFxtYXRoYmZ7XGJhciB7eH19X3tHXzF9JCB5ICRcbWF0aGJme1xiYXIge3h9fV97R18yfSQ
gc29uIGxvcyBjZW50cm9pZGVzIGRlIGxvcyBncnVwb3MgJEdfMSQgeSAkR18yJCByZXNwZWN0aX
ZhbWVudGUsIHF1ZSBzZSBwdWVkZW4gZGVmaW5pciBjb21vIGxhIG9ic2VydmFjacOzbiBwcm9tZ
WRpbyBkZSBjYWRhIGdydXBvLiBFbCBjZW50cm9pZGUgZGVsIGdydXBvIHJlc3VsdGFudGUgZGU
gbGEgdW5pw7NuIGRlIGxvcyBncnVwb3MgJEdfMSQgeSAkR18yJCBzZSBwdWVkZSBkZWZpbmly
IGNvbW8gJFxtYXRoYmZ7XGJhciB7eH19X3tHXzEsR18yfT1cZnJhY3t8R18xfCBcbWF0aGJme1xiY
XIge3h9fV97R18xfSArfEdfMnwgXG1hdGhiZntcYmFyIHt4fX1fe0dfMn19e3xHXzF8K3xHXzJ8fSQsIG
RvbmRlICR8R19pfCQgZXMgZWwgbsO6bWVybyBkZSBvYnNlcnZhY2lvbmVzIGVuIGVsIGdydXBvIC
RpJC4KKyBTdW1hIGRlIGN1YWRyYWRvcyBpbmNyZW1lbnRhbCAoV2FyZCk6IHNlIGZ1c2lvbmFuI
GxvcyBncnVwb3MgJEdfMSQgeSAkR18yJCBxdWUgbWluaW1pY2VuIGVsIGZ1bmNpb25hbCAkSS
hHXzEsR18yKSQ6CiQkSShHXzEsR18yKT1cc3VtX3tcbWF0aGJme3h9IFxpbiBHXzEgXGN1cCBHXz
J9e2ReMihcbWF0aGJme3h9LFxtYXRoYmZ7XGJhciB7eH19X3tHXzEsR18yfSl9LVx7XHN1bV97XG
1hdGhiZnt4fSBcaW4gR18xIH17ZF4yKFxtYXRoYmZ7eH0sXG1hdGhiZntcYmFyIHt4fX1fe0dfMX0pf
Stcc3VtX3tcbWF0aGJme3h9IFxpbiBHXzJ9e2ReMihcbWF0aGJme3h9LFxtYXRoYmZ7XGJhciB7eH
19X3tHXzJ9KX0gXH0uJCQKCgojIyBFamVtcGxvIChzaW5nbGUgbGlua2FnZSk6CkNvbnNpZGVyZ
W1vcyBsYSBzaWd1aWVudGUgbWF0cml6IGRlIGRpc3RhbmNpYXM6CgpgYGB7ciBlY2hvPUZBTF
NFfQpEPW1hdHJpeChjKDAsNywxLDksOCw3LDAsNiwzLDUsMSw2LDAsOCw3LDksMyw4LDAsN
Cw4LDUsNyw0LDApLG5jb2w9NSkKY29sbmFtZXMoRCk9YXMuY2hhcmFjdGVyKDE6NSkKcm93b
mFtZXMoRCk9YXMuY2hhcmFjdGVyKDE6NSkKcHJpbnQoRCkKYGBgCgoKCjEuIExvcyBkb3MgZ3
J1cG9zIG3DoXMgY2VyY2Fub3Mgc29uIGxvcyBjb25mb3JtYWRvcyBwb3IgZWwgZ3J1cG8gcXVlIH
RpZW5lIGxhIG9ic2VydmFjacOzbiAxIHkgZWwgcXVlIHRpZW5lIGxhIG9ic2VydmFjacOzbiAzLiBMYS
BkaXN0YW5jaWEgZW50cmUgZXN0b3MgZ3J1cG9zIGVzICRoPTEkLiBFc3RvcyBkb3MgZ3J1cG9zI
GNvbnN0aXR1aXLDoW4gdW4gbnVldm8gZ3J1cG8uIEFzw60sIGxhIG51ZXZhIG1hdHJpeiBkZSBka
XN0YW5jaWFzIGVzOgoKYGBge3IgZWNobz1GQUxTRX0KRDE9bWF0cml4KGMoMCw2LDgsNyw2
LDAsMyw1LDgsMywwLDQsNyw1LDQsMCksbmNvbD00KQpjb2xuYW1lcyhEMSk9YygiRzEzIiwyLD
QsNSkKcm93bmFtZXMoRDEpPWMoIkcxMyIsMiw0LDUpCnByaW50KEQxKQpgYGAKCgoKMi4gQ
WhvcmEgc29uIGVsIGdydXBvIGNvbmZvcm1hZG8gcG9yIGxhIG9ic2VydmFjacOzbiAyIHkgZWwgZ3
J1cG8gY29uZm9ybWFkbyBwb3IgbGEgb2JzZXJ2YWNpw7NuIDQgbG9zIG3DoXMgY2VyY2Fub3M
uIExhIGRpc3RhbmNpYSBlbnRyZSBlc3RvcyBkb3MgZ3J1cG9zIGVzICRoPTMkLiBBbCBmdXNpb25
hcmxvcyB0ZW5lbW9zIGxhIHNpZ3VpZW50ZSBtYXRyaXogZGUgZGlzdGFuY2lhczoKCmBgYHtyIG
VjaG89RkFMU0V9CkQyPW1hdHJpeChjKDAsNiw1LDYsMCw0LDUsNCwwKSxuY29sPTMpCmNvb
G5hbWVzKEQyKT1jKCJHMTMiLCJHMjQiLDUpCnJvd25hbWVzKEQyKT1jKCJHMTMiLCJHMjQiLD
UpCnByaW50KEQyKQpgYGAKCgoKCjMuIEFob3JhIHNvbiBlbCBncnVwbyBjb25mb3JtYWRvIHBvci
BsYSBvYnNlcnZhY2nDs24gNSB5IGVsIGdydXBvIEcyNCBsb3MgcXVlIHNlIGZ1c2lvbmFyw6FuLiBM
YSBkaXN0YW5jaWEgZW50cmUgZXN0b3MgZG9zIGdydXBvcyBlcyAkaD00JC4gTGEgbWF0cml6IG
RlIGRpc3RhbmNpYXMgYWN0dWFsaXphZGEgZXM6CgpgYGB7ciBlY2hvPUZBTFNFfQpEMz1tYXR
yaXgoYygwLDUsNSwwKSxuY29sPTIpCmNvbG5hbWVzKEQzKT1jKCJHMTIiLCJHMjQ1IikKcm93b
mFtZXMoRDMpPWMoIkcxMiIsIkcyNDUiKQpwcmludChEMykKYGBgCgo0LiBGaW5hbG1lbnRlLCB
sYSBkaXN0YW5jaWEgZW50cmUgbG9zIGRvcyBncnVwb3MgcmVzdWx0YW50ZXMgZXMgZGUgJ
Gg9NSQuCgpQb2RlbW9zIHJlcHJlc2VudGFyIGVzdG8gY29uIGF5dWRhIGRlIHVuIGRlbmRvZ3JhbW
EsIGFzw606CgpgYGB7ciBlY2hvPVRSVUV9CkRfZGlzdD1hcy5kaXN0KEQpCmRfdHJlZT1oY2x1c3
QoRF9kaXN0LG1ldGhvZD0ic2luZ2xlIikKcGxvdChkX3RyZWUsIG1haW49IkRlbmRvZ3JhbWEiKQpg
YGAKCiMjIEVqZW1wbG86IFVTQXJyZXN0CkNvbnNpZGVyZW1vcyBsYSBiYXNlIGRlIGRhdG9zICpV
U0FycmVzdCogcXVlIGNvbnRpZW5lIGluZm9ybWFjacOzbiB0YXNhcyBkZSBjcsOtbWVuZSBlbiBjaX
VkYWRlcyBkZSBFc3RhZG9zIFVuaWRvczoKCmBgYHtyfQpkYXRhKCJVU0FycmVzdHMiKQpoZWF
kKFVTQXJyZXN0cykKYGBgCgpBcGxpcXVlbW9zIGxhIG1ldG9kb2xvZ8OtYSBhbnRlcmlvcjoKCmBg
YHtyfQpVU0FycmVzdHNfZGlzdD1kaXN0KFVTQXJyZXN0cykKVVNBcnJlc3RzX2NsdXN0PWhjbHVz
dChVU0FycmVzdHNfZGlzdCxtZXRob2Q9InNpbmdsZSIpCnBsb3QoVVNBcnJlc3RzX2NsdXN0KQp
gYGAKClNpIHF1ZXJlbW9zIHNlZ21lbnRhciBlbCBjb25qdW50byBkZSBjaXVkYWRlcywgcG9yIGVqZ
W1wbG8gZW4gc2VpcyBncnVwb3MsIHBvZGVtb3MgcHJvY2VkZXIgYXPDrToKCmBgYHtyfQpVU0
FycmVzdHNfY2x1c3RfND1jdXRyZWUoVVNBcnJlc3RzX2NsdXN0LGs9NikKcGxvdChVU0FycmVzd
HNfY2x1c3QpCnJlY3QuaGNsdXN0KFVTQXJyZXN0c19jbHVzdCxrPTYpCmBgYAoK

También podría gustarte