Генерировать случайные точки, распределенные как города?

Как может каждый генерировать сказать что 1 000 случайных точек с распределением как этот городов в, например, Огайо?
Я боюсь, что не могу определить "распределенный как города" точно; равномерно распределенные центры + маленькие Гауссовы облака являются легкими, но специальными.
Добавленный: должно быть семейство 2-х распределений с кластеризирующимся параметром, который может варьироваться для соответствия данному набору точек?

5
задан TMS 12 August 2011 в 14:18
поделиться

4 ответа

Возможно, вы можете взглянуть на Теорию центральных мест Уолтера Кристаллера. Я думаю, что где-то должен быть какой-то генератор, или вы можете придумать свой собственный.

2
ответ дан 14 December 2019 в 13:29
поделиться

В java это обеспечивается через new Random().nextGaussian(). Поскольку java-исходник доступен, вы можете посмотреть на него:

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

Построение 30000 домов с помощью

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

дает этот прекрасный город:

enter image description here

1
ответ дан 14 December 2019 в 13:29
поделиться

Начните с модели водных объектов в целевой области (или придумайте ее , если это воображаемое место), а затем сгруппируйте города возле перекрестков рек, вдоль берегов озер, на стыках озера и реки. Затем создайте воображаемые шоссе, соединяющие эти крупные города. Теперь посыпьте несколько промежуточных городов вдоль этих автомагистралей на разумном расстоянии, предпочитая находиться рядом с перекрестками на автомагистралях. Теперь посыпьте пустые места какими-нибудь городками.

2
ответ дан 14 December 2019 в 13:29
поделиться

Гауссовские кластеры с пуассоновскими размерами кластеров работают достаточно хорошо.

Проблема: генерировать случайные точки, которые группируются примерно как заданные города, скажем, в США.

Подзадачи:
а) описывать кластеры рядами чисел так, чтобы «кластер A подобен кластеру B» упрощается до «кластерные числа (A) похожи на« кластерные числа (B) ».
Запуск N = 100, затем 1000 точек через fcluster ниже, с ncluster = 25, дает

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

б) найти комбинацию случайных генераторов с 2 или 3 параметрами. которые можно изменять для создания различных кластеров.
Гауссовские кластеры с пуассоновскими размерами кластеров могут достаточно хорошо соответствовать кластеризации городов:

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
ответ дан 14 December 2019 в 13:29
поделиться