¿Cómo se puede generar, por ejemplo, 1000 puntos aleatorios con una distribución como la de ciudades y pueblos en, por ejemplo, Ohio?
Me temo que no puedo definir "ciudades similares distribuidas" con precisión; centros uniformemente distribuidos + pequeñas nubes Gaussianas son fáciles pero ad hoc.
Agregado: debe haber una familia de distribuciones 2d con un parámetro de agrupamiento que se puede variar para que coincida con un conjunto dado de puntos?¿Generar puntos aleatorios distribuidos como ciudades?
Respuesta
En java esto se proporciona a través de new Random().nextGaussian()
. Dado que la fuente de Java está disponible, puede mire:
synchronized public double nextGaussian() {
// See Knuth, ACP, Section 3.4.1 Algorithm C.
if (haveNextNextGaussian) {
haveNextNextGaussian = false;
return nextNextGaussian;
} else {
double v1, v2, s;
do {
v1 = 2 * nextDouble() - 1; // between -1 and 1
v2 = 2 * nextDouble() - 1; // between -1 and 1
s = v1 * v1 + v2 * v2;
} while (s >= 1 || s == 0);
double multiplier = StrictMath.sqrt(-2 * StrictMath.log(s)/s);
nextNextGaussian = v2 * multiplier;
haveNextNextGaussian = true;
return v1 * multiplier;
}
}
Trazado 30000 casas utilizando
x = r.nextGaussian() * rad/4 + rad;
y = r.nextGaussian() * rad/4 + rad;
rendimientos de esta hermosa ciudad:
Tal vez usted puede tomar una mira Theory of Central Places de Walter Christaller. Supongo que debe haber algún generador en alguna parte, o puedes cocinar tu propio.
Comience con un modelo de las características del agua en su área objetivo (o invente una, si es para un lugar imaginario), luego agrupe las ciudades cerca de uniones fluviales, a lo largo de las orillas del lago, uniones lago-río. Luego haga autopistas imaginarias que conecten esas ciudades principales. Ahora salpique algunas ciudades intermedias a lo largo de esas carreteras a un espacio razonable, prefiriendo estar cerca de las intersecciones en las carreteras. Ahora salpique algunas ciudades pequeñas a través de los espacios vacíos.
Los clústeres gaussianos con tamaños de clúster de Poisson funcionan bastante bien.
Problema: genere puntos aleatorios que se agrupen aproximadamente como ciudades determinadas, por ejemplo, en los EE. UU.
subproblemas:
a) describen grupos con filas de números, de modo que "grupo A es como clúster B" se simplifica a "clusternumbers (A) es como "clusternumbers (B)"
Ejecución de N = 100. entonces 1000 puntos a través de fcluster a continuación, con nCluster = 25, da
N 100 ncluster 25: 22 + 3 r 117
sizes: av 4 10 9 8 7 6 6 5 5 4 4 4 ...
radii: av 117 202 198 140 134 64 62 28 197 144 148 132 ...
N 1000 cluster 25: 22 + 3 r 197
sizes: av 45 144 139 130 85 84 69 63 43 38 33 30 ...
radii: av 197 213 279 118 146 282 154 245 212 243 226 235 ...
b) encontrar un combiation de generadores aleatorios con 2 o 3 parámetros que se pueden variar para generar diferentes clusterings.
racimos gaussiana con clúster Poisson los tamaños pueden coincidir con la agrupación de ciudades bastante bien:
def randomclusters(N, ncluster=25, radius=1, box=box):
""" -> N 2d points: Gaussian clusters, Poisson cluster sizes """
pts = []
lam = eval(str(N // ncluster))
clustersize = lambda: np.random.poisson(lam - 1) + 1
# poisson 2: 14 27 27 18 9 4 %
# poisson 3: 5 15 22 22 17 10 %
while len(pts) < N:
u = uniformrandom2(box)
csize = clustersize()
if csize == 1:
pts.append(u)
else:
pts.extend(inbox(gauss2(u, radius, csize)))
return pts[:N]
# Utility functions --
import scipy.cluster.hierarchy as hier
def fcluster(pts, ncluster, method="average", criterion="maxclust"):
""" -> (pts, Y pdist, Z linkage, T fcluster, clusterlists)
ncluster = n1 + n2 + ... (including n1 singletons)
av cluster size = len(pts)/ncluster
"""
# Clustering is pretty fast:
# sort pdist, then like Kruskal's MST, O(N^2 ln N)
# Many metrics and parameters are possible; these satisfice.
pts = np.asarray(pts)
Y = scipy.spatial.distance.pdist(pts) # N*(N-1)/2
Z = hier.linkage(Y, method) # N-1, like mst
T = hier.fcluster(Z, ncluster, criterion=criterion)
clusters = clusterlists(T)
return (pts, Y, Z, T, clusters)
def clusterlists(T):
""" T = hier.fcluster(Z, t) e.g. [a b a b c a]
-> [ [0 2 5] [1 3] ] sorted by len, no singletons [4]
"""
clists = [ [] for j in range(max(T) + 1)]
for j, c in enumerate(T):
clists[c].append(j)
clists.sort(key=len, reverse=True)
n1 = np.searchsorted( map(len, clists)[::-1], 2)
return clists[:-n1]
def radius(x):
""" rms |x - xmid| """
return np.sqrt(np.mean(np.var(x, axis=0)))
# * 100 # 1 degree lat/long ~ 70 .. 111 km
- 1. Generar números aleatorios distribuidos por Zipf
- 2. Código para generar números aleatorios gaussianos (normalmente distribuidos) en Ruby
- 3. Generación de números aleatorios distribuidos
- 4. Cómo generar números aleatorios erróneos
- 5. números aleatorios distribuidos de manera uniforme
- 6. Generación de números aleatorios secuenciales distribuidos en Ruby 1.9.2
- 7. ¿Generar bytes aleatorios Cocoa?
- 8. Generar archivos aleatorios en Windows
- 9. generar enteros aleatorios con probabilidades
- 10. Generar valores aleatorios en C#
- 11. Cómo generar manualmente números aleatorios
- 12. generar números dobles aleatorios en C++
- 13. ¿Cómo generar números "aleatorios" pero también "únicos"?
- 14. ¿Cómo puedo generar números aleatorios en Python?
- 15. Generar identificadores aleatorios fáciles de recordar
- 16. Cómo generar números aleatorios grandes C
- 17. ¿Cómo puedo generar puntos aleatorios en una circunferencia de círculos en javascript
- 18. ¿Cómo generar números aleatorios en paralelo?
- 19. Generar números aleatorios con distribución probabilística
- 20. Generar "en rango" números aleatorios en C
- 21. Generar números aleatorios según las distribuciones
- 22. Generar números aleatorios criptográficamente seguros en php
- 23. Problema al generar colores aleatorios: asp.net yC#
- 24. ¿Cómo generar una lista de números aleatorios?
- 25. forma más rápida de generar bits aleatorios
- 26. ¿Cómo puedo generar números aleatorios en Dart?
- 27. Cómo generar una secuencia de números aleatorios repetibles?
- 28. Generar datos aleatorios de prueba de SQL Server 2008
- 29. ¿Cuál es la forma estándar de obtener enteros aleatorios distribuidos uniformemente en C++?
- 30. ¿Cómo generar los "gravatares" aleatorios por defecto como en Desbordamiento de pila?
Interesante, gracias. Esto lleva a "estadísticas espaciales" y "patrón de puntos espaciales", que tienen muchos documentos y varios libros pero hasta el momento no hay punto de entrada/ningún código. – denis