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==