Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
SERGIO HERNÁNDEZ
FACULTAD DE CIENCIAS DE LA INGENIERIA
UNIVERSIDAD CATÓLICA DEL MAULE
SHERNANDEZ@UCM.CL
1. Introducción
Las búsquedas en espacios multidimensionales (datos espaciales, imágenes, audio, etc)
son costosas debido a la comparación exhaustiva de distancias entre objetos. De modo
de obtener una indexación adecuada, podemos recurrir a las propiedades de los espacios
métricos. Dado un espacio vectorial X ⊂ RD y una función de distancia d : X × X 7→ R,
para cada par de elementos x, y ∈ X tenemos que :
d(x, y) > 0
d(x, y) = 0 =⇒ x = y
d(x, x) = 0
d(x, y) + d(y, z) ≥ d(x, z) desigualdad triangular
La complejidad de evaluar de manera exhaustiva las distancias entre objetos depende no
solo de la cantidad de objetos n sino que también de la dimensionalidad D. Por lo tanto
se hace necesario contemplar mecanismos eficientes de indexación.
1
2
SERGIO HERNÁNDEZ FACULTAD DE CIENCIAS DE LA INGENIERIA UNIVERSIDAD CATÓLICA DEL MAULE SHERNANDEZ@UCM.
B C
E F
Figure 1. Arbol binario que representa un KD-Tree. Cada nivel del árbol
representa un corte basado en la mediana del eje de corte
De manera de consultar por los vecinos más próximos (nn), descendemos por el árbol y
mantenemos un punto candidato a ser el nn y un valor máximo conocido de la distancia
al punto de consulta. Luego chequeamos los sub-árboles dependiendo del eje de corte
continuamos por una de las ramas. Un ejemplo tı́pico es la búsqueda por rangos en consultas
geoespaciales.
3. Ejercicios
Supongamos que tenemos una aplicación móvil que busca ciudades cercanas y la re-
comendación depende de la ubicación del usuario. Se solicita implementar el algoritmo
KD-trees para hacer búsquedas de puntos de referencia. Dado un punto de origen y otro
de destino, se necesita implementar:
(1) Un método que retorne los K nodos más cercanos en ambos puntos.
(2) Un método que retorne todos los nodos dentro de un radio de M metros hacia
ambos puntos.
class Node:pass
def kdtree_create(point_list,depth=0):
if len(point_list)==0:
return
D = len(point_list.columns) # assumes all points have the same dimension
axis = depth % D
key=point_list.columns[axis]
A=point_list.sort_values(by=key)
median = len(point_list)/2 # choose median
# Create node and construct subtrees
node = Node()
node.location = A.iloc[median]
node.left_child = kdtree_create(A.iloc[0:median], depth+1)
node.right_child = kdtree_create(A.iloc[median+1:], depth+1)
return node
def get_point_list(G):
point_list=pd.DataFrame()
for g in G.nodes():
lat=np.float(G.node[g][’y’])
lon=np.float(G.node[g][’x’])
df=pd.DataFrame([[lat,lon]],columns=[’lat’,’lon’])
if (len(point_list)==0):
point_list=df
else:
point_list=point_list.append(df,ignore_index=True)
return point_list
4
SERGIO HERNÁNDEZ FACULTAD DE CIENCIAS DE LA INGENIERIA UNIVERSIDAD CATÓLICA DEL MAULE SHERNANDEZ@UCM.
point_list=get_point_list(G)
kdtree=kdtree_create(point_list)