Autor Tema: Generar puntos aleatorios dentro de un cuadrado

0 Usuarios y 1 Visitante están viendo este tema.

11 Diciembre, 2020, 06:52 pm
Leído 3674 veces

Rectilíneo

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 436
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
  • Don't go to the bathroom, Vincent
Buenas tardes,

tengo que generar puntos de forma aleatoria con distribución uniforme dentro de un cuadrado de lado \( 2 \). Se me ocurrió generar dos números aleatorios, uno para la coordenada \( X \) y otro para la coordenada \( Y \). Es decir, es un punto aleatorio en el intervalo \( [-1,1] \) (el origen de coordenadas está en el centro del cuadrado). Esto lo he hecho con MATLAB y los resultados son satisfactorios. No obstante, mi profesor me ha dicho que hay otras formas de generar puntos con distribución uniforme y que los resultados van a ser distintos si se siguen otros procedimientos. Me ha comentado que se puede elegir primero un ángulo (entre 0 y 360 grados) y después una distancia al origen (como si fuesen coordenadas polares), pero me parece difícil de hacer porque la geometría no es circular, es cuadrada.

¿Realmente la distribución de puntos será diferente si sigo el segundo método ("polar") en vez del primero ("cartesiano")? No entiendo cómo una distribución uniforme puede ser diferente dependiendo del método de generación que elijas.
¿Hay algún otro método para generar puntos aleatorios dentro de un área cuadrada?

Gracias de antemano.

11 Diciembre, 2020, 08:10 pm
Respuesta #1

Luis Fuentes

  • el_manco
  • Administrador
  • Mensajes: 58,907
  • País: es
  • Karma: +0/-0
Hola

tengo que generar puntos de forma aleatoria con distribución uniforme dentro de un cuadrado de lado \( 2 \). Se me ocurrió generar dos números aleatorios, uno para la coordenada \( X \) y otro para la coordenada \( Y \). Es decir, es un punto aleatorio en el intervalo \( [-1,1] \) (el origen de coordenadas está en el centro del cuadrado). Esto lo he hecho con MATLAB y los resultados son satisfactorios. No obstante, mi profesor me ha dicho que hay otras formas de generar puntos con distribución uniforme y que los resultados van a ser distintos si se siguen otros procedimientos. Me ha comentado que se puede elegir primero un ángulo (entre 0 y 360 grados) y después una distancia al origen (como si fuesen coordenadas polares), pero me parece difícil de hacer porque la geometría no es circular, es cuadrada.

¿Realmente la distribución de puntos será diferente si sigo el segundo método ("polar") en vez del primero ("cartesiano")? No entiendo cómo una distribución uniforme puede ser diferente dependiendo del método de generación que elijas.
¿Hay algún otro método para generar puntos aleatorios dentro de un área cuadrada?

El ejemplo más típico de esta situación suele ser generar una distribución uniforme en un círculo, donde si elegimos el ángulo uniforme en \( [0,2\pi] \) y el radio uniforme en \( [0,r] \), la distribución no sale uniforme en el sentido que esperábamos, ya que la probabilidad de una región no es proporcional a su área.

En el caso del cuadrado puedes tomar un ángulo \( X\in [0,2\pi] \) de manera uniforme un número \( Y\in [0,1] \) uniforme para tomar el punto:

\( (r(X,Y)\, cos(X),r(X,Y)\,sin(Y)) \)

donde \( r(y,y)=y\cdot min(1/|cos(X)|,1/|sin(X)|) \). Ese factor \( min(1/|cos(X)|,1/|sin(X)|) \) es la distancia del origen al borde del cuadrado sobre el rayo de ángulo \( X \) que sale del origen.

La idea es que una vez elegida la dirección \( X \) de manera uniforme, sobre el segmento que une el centro con el borde del cuadrado en esa dirección se elige un punto de forma también uniforme.

Se puede ver sin embargo que esta distribución no es uniforme en el mismo sentido que la primera que tu apuntabas; ahora la probabilidad de que el punto escogido esté en una región no va a ser proporcional a su área.

Saludos.

12 Diciembre, 2020, 01:00 pm
Respuesta #2

Rectilíneo

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 436
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
  • Don't go to the bathroom, Vincent
Hola

El ejemplo más típico de esta situación suele ser generar una distribución uniforme en un círculo, donde si elegimos el ángulo uniforme en \( [0,2\pi] \) y el radio uniforme en \( [0,r] \), la distribución no sale uniforme en el sentido que esperábamos, ya que la probabilidad de una región no es proporcional a su área.

En el caso del cuadrado puedes tomar un ángulo \( X\in [0,2\pi] \) de manera uniforme un número \( Y\in [0,1] \) uniforme para tomar el punto:

\( (r(X,Y)\, cos(X),r(X,Y)\,sin(Y)) \)

donde \( r(y,y)=y\cdot min(1/|cos(X)|,1/|sin(X)|) \). Ese factor \( min(1/|cos(X)|,1/|sin(X)|) \) es la distancia del origen al borde del cuadrado sobre el rayo de ángulo \( X \) que sale del origen.

La idea es que una vez elegida la dirección \( X \) de manera uniforme, sobre el segmento que une el centro con el borde del cuadrado en esa dirección se elige un punto de forma también uniforme.

Se puede ver sin embargo que esta distribución no es uniforme en el mismo sentido que la primera que tu apuntabas; ahora la probabilidad de que el punto escogido esté en una región no va a ser proporcional a su área.

Saludos.

Hola Luis,

he entendido el método, pero lo que he marcado en rojo sería: \( r(X,Y)=Y\cdot min(1/|cos(X)|,1/|sin(X)|) \), ¿verdad?
Lo he dibujado sobre el papel y me ha quedado claro. De \( \displaystyle\frac{7\pi}{4} \) a \( \displaystyle\frac{\pi}{4} \) y de \( \displaystyle\frac{3\pi}{4} \) a \( \displaystyle\frac{5\pi}{4} \) utilizamos el coseno porque conocemos el cateto contiguo del triángulo que se forma (vale \( 1 \), la mitad del lado del cuadrado). De \( \displaystyle\frac{\pi}{4} \) a \( \displaystyle\frac{3\pi}{4} \) y de \( \displaystyle\frac{5\pi}{4} \) a \( \displaystyle\frac{7\pi}{4} \) utilizamos el seno porque conocemos el cateto opuesto.

Y perdona mi ignorancia, pero no me ha quedado claro por qué utilizando este método (ya sea en un círculo o en un cuadrado) dices que "la probabilidad no es proporcional al área".
¿Utilizando el otro método, el de elegir dos números \( X\in{[-1,1]} \) e \( Y\in{[-1,1]} \), la distribución sí que es uniforme? ¿Por qué? ¿Cuál es la diferencia con el otro método? No entiendo por qué la distribución de puntos va a ser diferente, si en ambos casos se eligen de forma aleatoria.

Un saludo.

12 Diciembre, 2020, 02:08 pm
Respuesta #3

Abdulai

  • Moderador Global
  • Mensajes: 3,044
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
..
Y perdona mi ignorancia, pero no me ha quedado claro por qué utilizando este método (ya sea en un círculo o en un cuadrado) dices que "la probabilidad no es proporcional al área".
¿Utilizando el otro método, el de elegir dos números \( X\in{[-1,1]} \) e \( Y\in{[-1,1]} \), la distribución sí que es uniforme? ¿Por qué? ¿Cuál es la diferencia con el otro método? No entiendo por qué la distribución de puntos va a ser diferente, si en ambos casos se eligen de forma aleatoria.
Un ejemplo con 4000 puntos aleatorios \( [x,y] \)  y  \( [r,\theta] \):
 [attachment id=0]

Como ves en el gráfico polar, la densidad de puntos es mayor al acercarse al origen.

12 Diciembre, 2020, 03:16 pm
Respuesta #4

Luis Fuentes

  • el_manco
  • Administrador
  • Mensajes: 58,907
  • País: es
  • Karma: +0/-0
Hola

he entendido el método, pero lo que he marcado en rojo sería: \( r(X,Y)=Y\cdot min(1/|cos(X)|,1/|sin(X)|) \), ¿verdad?

 Si.

 Con la distribución aparentemente uniforme en coordenadas polares, hay la misma probabilidad de escoger un punto en el cuadrado interior de lado 1 que en la corona exterior al mismo; sin embargo su área (la exterior) es tres veces mayor que la interior.



 El motivo es que en cada dirección hacemos equiprobable el hecho de estar en la primera mitad del segmento que une el centro con el borde del cuadrado que en la segunda mitad. Pero esas segundas mitades recorren un área mucho mayor.

 
Como ves en el gráfico polar, la densidad de puntos es mayor al acercarse al origen.

 Aunque la idea se refleja en los dibujos, en realidad ambos deben de estar definidos en un cuadrado. Algo así:





Saludos.

12 Diciembre, 2020, 03:36 pm
Respuesta #5

Ricardo Boza

  • $$\Large \color{#c88359}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 793
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino
Hola,

 [attachment id=0 msg=458099]

Código: (Matlab) [Seleccionar]
clear, clc, close all
figure(1)
hold on
for k=1:3000
    x=rand(1);
    y=rand(1);
    rho=rand(1);
    theta=2*pi*rand(1);
    X=2*pi*rand(1);
    Y=rand(1);
    R=Y*min(1/abs(cos(X)),1/abs(sin(X)));
    subplot(1,3,1)
    plot(x,y,'bo','MarkerSize',1,'MarkerFaceColor','b')
    hold on
    subplot(1,3,2)
    polarplot(theta,rho,'bo','MarkerSize',1,'MarkerFaceColor','b')
    hold on
    subplot(1,3,3)
    plot(R*cos(X),R*sin(X),'bo','MarkerSize',1,'MarkerFaceColor','b') % sería sin(X)
    hold on
end
subplot(1,3,1)
axis square
subplot(1,3,3)
axis square

Me ha impresionado esa distribución que ha encontrado Luis.

Saludos.

13 Diciembre, 2020, 07:48 pm
Respuesta #6

Rectilíneo

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 436
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
  • Don't go to the bathroom, Vincent
Con la distribución aparentemente uniforme en coordenadas polares, hay la misma probabilidad de escoger un punto en el cuadrado interior de lado 1 que en la corona exterior al mismo; sin embargo su área (la exterior) es tres veces mayor que la interior.



 El motivo es que en cada dirección hacemos equiprobable el hecho de estar en la primera mitad del segmento que une el centro con el borde del cuadrado que en la segunda mitad. Pero esas segundas mitades recorren un área mucho mayor.

Muchas gracias, ahora sí que lo he entendido por completo. Entonces concluyo que el método adecuado para generar puntos aleatorios en un cuadrado es el cartesiano y no el polar.

Yo también he hecho mis pruebas y aquí están los resultados, que coinciden con los vuestros:

[attachment id=0]


Código: (Matlab) [Seleccionar]
clear, clc, close all
figure(1)
hold on
for k=1:3000
    x=rand(1);
    y=rand(1);
    rho=rand(1);
    theta=2*pi*rand(1);
    X=2*pi*rand(1);
    Y=rand(1);
    R=Y*min(1/abs(cos(X)),1/abs(sin(X)));
    subplot(1,3,1)
    plot(x,y,'bo','MarkerSize',1,'MarkerFaceColor','b')
    hold on
    subplot(1,3,2)
    polarplot(theta,rho,'bo','MarkerSize',1,'MarkerFaceColor','b')
    hold on
    subplot(1,3,3)
    plot(R*cos(X),R*sin(X),'bo','MarkerSize',1,'MarkerFaceColor','b') % sería sin(X)
    hold on
end
subplot(1,3,1)
axis square
subplot(1,3,3)
axis square

Hola Bobby Fischer,

a modo de comentario/consejo sobre el código, intenta no llamar funciones que grafiquen (plot, subplot) dentro de un bucle, porque tardan mucho tiempo en ejecutarse. En tu caso la función plot se ejecuta 3x3000 veces, cuando podría ejecutarse solo 3 veces: guardando las coordenadas de los puntos en vectores (por ejemplo, \( x(k)=rand(1) \)) y llamando a la función plot una vez terminado el bucle. He corrido tu código y tarda unos 30 segundos en mi ordenador. De la otra forma tardaría centésimas de segundo.

Saludos.

13 Diciembre, 2020, 08:48 pm
Respuesta #7

Rectilíneo

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 436
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
  • Don't go to the bathroom, Vincent
Hola de nuevo,

se me ha ocurrido un nuevo método. Se coge un diferencial de la coordenada X (tan pequeño como se quiera) y para esa coordenada X se generan 10 números aleatorios para la coordenada Y (10 o los que sean). Por ejemplo:

\( X=0.001, Y=-0.8273 \)
\( X=0.001, Y=0.5543 \)
\( X=0.001, Y=0.1315 \)
\( X=0.001, Y=-0.3994 \)
\( X=0.001, Y=-0.0056 \)
etc.

Una vez se han generado esos 10 puntos aleatorios para esa coordenada X, se suma un diferencial de X y se vuelve a repetir el procedimiento. Lo he programado en MATLAB, el código es el siguiente (perdonad si no es del todo eficiente):

Código: (MATLAB) [Seleccionar]
n=2000;
deltaX=2/n;

a=0;
while a<=n
    m=10;
    for k=1:m
        X(m*a+k)=a*deltaX-1;
        Y(m*a+k)=2*rand(1)-1;
    end
    a=a+1;
end

plot(X,Y,'bo','MarkerSize',1.5,'MarkerFaceColor','b')
title('Distribución diferencial')
axis square
set(gca,'Fontsize',14);

Y aquí el gráfico que se obtiene:

[attachment id=0]


¿Esta distribución es uniforme? A simple vista lo parece, pero no sé si "los huecos" verticales que se generan a causa de los diferenciales tienen influencia o no.

13 Diciembre, 2020, 09:05 pm
Respuesta #8

geómetracat

  • Moderador Global
  • Mensajes: 4,065
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
Esa distribución nunca va a ser uniforme porque si el "diferencial" de \( X \) es \( d \), tienes por ejemplo que \( P((X,Y)\in [d/3, 2d/3]\times [0,1])=0 \) (porque nunca vas a generar puntos en ese intervalo) mientras que si fuera uniforme la probabilidad sería \( d/3 \). De hecho, la distribución que propones ni siquiera es absolutamente continua, pues los valores \( X \) de los puntos obtenidos necesariamente pertenecen a un conjunto finito de valores (los múltiplos de \( d \)).
La ecuación más bonita de las matemáticas: \( d^2=0 \)

13 Diciembre, 2020, 11:21 pm
Respuesta #9

Rectilíneo

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 436
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
  • Don't go to the bathroom, Vincent
Esa distribución nunca va a ser uniforme porque si el "diferencial" de \( X \) es \( d \), tienes por ejemplo que \( P((X,Y)\in [d/3, 2d/3]\times [0,1])=0 \) (porque nunca vas a generar puntos en ese intervalo) mientras que si fuera uniforme la probabilidad sería \( d/3 \). De hecho, la distribución que propones ni siquiera es absolutamente continua, pues los valores \( X \) de los puntos obtenidos necesariamente pertenecen a un conjunto finito de valores (los múltiplos de \( d \)).

Tienes razón, da igual lo pequeño que sea \( d \) que nunca habrá puntos entre cualquier \( X \) y \( X+d \).

Saludos.