Usando la colección de datos iris vamos a proceder análizar como se comporta la distancia Euclediana entre dos puntos aleatorios del espacio vectorial.

View(iris)

Para ello vamos a definir primero la función distancia aplicado a dos vectores multidimensionales.

ED <- function(X, Y){
  return(sqrt(sum((X - Y)^2)))
}

También se requiere una función para calcular la distancia entre N pares de puntos y almacenarlos en un array.

genDistancias<-function(data, N){
  v<-rep(0, N)
  for (i in 1:N) {
    ind<-sample(1:nrow(data), size=2)
    P<-data[ind[1], ]
    Q<-data[ind[2], ]
    v[i]<-ED(P, Q)
  }
  return(v)
}

Generamos 5000 distancias aleatorias y procedemos a visualizar los resultados en un histograma,

D<-genDistancias(iris[, 1:4], 5000)
#generamos el histograma
H<-hist(D, xlab = "Distancia", breaks = 10)

Para poder saber que radio usar en las búsquedas por rango, podemos guiarnos del porcentaje de elementos que cubre la distancia conforme va creciendo.

#porcentaje de cobertura
for (i in 1:(length(H$counts)-1)) {
  print(paste("Radio <=" , H$breaks[i+1],": ", round(100*sum(H$counts[1:i])/sum(H$counts)), "%"))
}
[1] "Radio <= 0.5 :  6 %"
[1] "Radio <= 1 :  23 %"
[1] "Radio <= 1.5 :  38 %"
[1] "Radio <= 2 :  46 %"
[1] "Radio <= 2.5 :  52 %"
[1] "Radio <= 3 :  60 %"
[1] "Radio <= 3.5 :  68 %"
[1] "Radio <= 4 :  77 %"
[1] "Radio <= 4.5 :  85 %"
[1] "Radio <= 5 :  92 %"
[1] "Radio <= 5.5 :  96 %"
[1] "Radio <= 6 :  98 %"
[1] "Radio <= 6.5 :  100 %"
[1] "Radio <= 7 :  100 %"
LS0tDQp0aXRsZTogIkFuw6FsaXNpcyBkZSBsYSBkaXN0cmlidWNpw7NuIGRlIGxhIGRpc3RhbmNpYSINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCi0tLQ0KDQpVc2FuZG8gbGEgY29sZWNjacOzbiBkZSBkYXRvcyAqaXJpcyogdmFtb3MgYSBwcm9jZWRlciBhbsOhbGl6YXIgY29tbyBzZSBjb21wb3J0YSBsYSBkaXN0YW5jaWEgRXVjbGVkaWFuYSBlbnRyZSBkb3MgcHVudG9zIGFsZWF0b3Jpb3MgZGVsIGVzcGFjaW8gdmVjdG9yaWFsLg0KYGBge3J9DQpWaWV3KGlyaXMpDQpgYGANCg0KUGFyYSBlbGxvIHZhbW9zIGEgZGVmaW5pciBwcmltZXJvIGxhICBmdW5jacOzbiBkaXN0YW5jaWEgYXBsaWNhZG8gYSBkb3MgdmVjdG9yZXMgbXVsdGlkaW1lbnNpb25hbGVzLg0KYGBge3J9DQpFRCA8LSBmdW5jdGlvbihYLCBZKXsNCiAgcmV0dXJuKHNxcnQoc3VtKChYIC0gWSleMikpKQ0KfQ0KYGBgDQoNClRhbWJpw6luIHNlIHJlcXVpZXJlIHVuYSBmdW5jacOzbiBwYXJhIGNhbGN1bGFyIGxhIGRpc3RhbmNpYSBlbnRyZSBOIHBhcmVzIGRlIHB1bnRvcyB5IGFsbWFjZW5hcmxvcyBlbiB1biBhcnJheS4gDQpgYGB7cn0NCmdlbkRpc3RhbmNpYXM8LWZ1bmN0aW9uKGRhdGEsIE4pew0KICB2PC1yZXAoMCwgTikNCiAgZm9yIChpIGluIDE6Tikgew0KICAgIGluZDwtc2FtcGxlKDE6bnJvdyhkYXRhKSwgc2l6ZT0yKQ0KICAgIFA8LWRhdGFbaW5kWzFdLCBdDQogICAgUTwtZGF0YVtpbmRbMl0sIF0NCiAgICB2W2ldPC1FRChQLCBRKQ0KICB9DQogIHJldHVybih2KQ0KfQ0KYGBgDQoNCkdlbmVyYW1vcyA1MDAwIGRpc3RhbmNpYXMgYWxlYXRvcmlhcyB5IHByb2NlZGVtb3MgYSB2aXN1YWxpemFyIGxvcyByZXN1bHRhZG9zIGVuIHVuIGhpc3RvZ3JhbWEsDQpgYGB7cn0NCkQ8LWdlbkRpc3RhbmNpYXMoaXJpc1ssIDE6NF0sIDUwMDApDQojZ2VuZXJhbW9zIGVsIGhpc3RvZ3JhbWENCkg8LWhpc3QoRCwgeGxhYiA9ICJEaXN0YW5jaWEiLCBicmVha3MgPSAxMCkNCmBgYA0KDQpQYXJhIHBvZGVyIHNhYmVyIHF1ZSByYWRpbyB1c2FyIGVuIGxhcyBiw7pzcXVlZGFzIHBvciByYW5nbywgcG9kZW1vcyBndWlhcm5vcyBkZWwgcG9yY2VudGFqZSBkZSBlbGVtZW50b3MgcXVlIGN1YnJlIGxhIGRpc3RhbmNpYSBjb25mb3JtZSB2YSBjcmVjaWVuZG8uIA0KYGBge3J9DQojcG9yY2VudGFqZSBkZSBjb2JlcnR1cmENCmZvciAoaSBpbiAxOihsZW5ndGgoSCRjb3VudHMpLTEpKSB7DQogIHByaW50KHBhc3RlKCJSYWRpbyA8PSIgLCBIJGJyZWFrc1tpKzFdLCI6ICIsIHJvdW5kKDEwMCpzdW0oSCRjb3VudHNbMTppXSkvc3VtKEgkY291bnRzKSksICIlIikpDQp9DQpgYGANCg==