/ / Generovanie náhodných bodov rozdelených ako mestá? - algoritmus, náhodné, zhluková analýza

Generovať náhodné body rozdelené ako mestá? - algoritmus, náhodné, zhluková analýza

Ako je možné vygenerovať povedať 1 000 náhodných bodov s takou distribúciou mestá napr. Ohio?
Obávam sa, že dokážem presne definovať „distribuované ako mestá“; rovnomerne rozmiestnené centrá + malé gaussovské oblaky sú jednoduché, ale ad hoc.
Pridané: Musí existovať rodina distribúcií 2d s parametrom zoskupovania, ktorý je možné meniť tak, aby zodpovedal danej množine bodov?

odpovede:

2 pre odpoveď č. 1

Možno sa môžete pozrieť na Waltera Christallera Teória centrálnych miest, Myslím, že niekde musí byť nejaký generátor, alebo si môžete pripraviť vlastný.


2 pre odpoveď č. 2

Začnite s modelom vodných funkcií vo vašomcieľovej oblasti (alebo si vytvorte jedno, ak je to pre imaginárne miesto), potom zoskupte mestá blízko križovatiek, pozdĺž jazierok, križovatiek medzi jazerami a riekami. Potom vytvorte imaginárne diaľnice spájajúce tieto veľké mestá. diaľnice v primeranom rozstupe, prednostne blízko križovatiek na diaľniciach. Teraz posypte niektoré malé mestá prázdnymi priestormi.


1 pre odpoveď č. 3

Gaussovské zoskupenia s veľkosťou klastrov Poisson fungujú celkom dobre.

Problém: generujte náhodné body, ktoré sa zhlukujú zhruba ako dané mestá, napríklad v USA.

podúlohy:
a) opíšte klastre s radmi čísel, takže „klaster A je ako klaster B“ zjednodušuje sa na „klastrové čísla (A) je ako na„ klastrové čísla (B) “.
Bežiaci N = 100, potom 1 000 bodov cez dole dole, s nclusterom = 25, dáva

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) nájsť kombináciu náhodných generátorov s 2 alebo 3 parametrami ktoré sa môžu meniť, aby sa vygenerovali rôzne zoskupenia.
Gaussovské zoskupenia s veľkosťou zhlukov Poissonovho typu môžu zhluky miest pomerne dobre zodpovedať:

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 pre odpoveď č. 4

V jave je to poskytované prostredníctvom new Random().nextGaussian(), Keďže je k dispozícii zdroj java, môžete sa naň pozrieť:

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;
}
}

Vykreslenie 30000 domov pomocou

x = r.nextGaussian() * rad/4 + rad;
y = r.nextGaussian() * rad/4 + rad;

prináša toto krásne mesto:

tu zadajte popis obrázku