2010-05-12 112 views
5

如何生成1000个随机点,其分布类似于例如 城镇的分布。俄亥俄?
恐怕我无法精确地定义“像城市一样分布”; 均匀分布的中心+小高斯云 很容易但特设。
添加:必须有一个2d分布系列 聚类参数可以变化以匹配给定的一组点?生成像城市一样分布的随机点吗?

回答

1

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

绘制使用

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

债收益率这座美丽的城市30000个住房:

enter image description here

2

也许你可以采取看看Walter Christaller的Theory of Central Places。我想在某个地方必须有一个发生器,或者你可以自己做。

+0

有趣,谢谢。这导致了“空间统计”和“空间点模式”,其具有许多论文和几本书,但迄今为止没有入口点/没有代码。 – denis 2010-05-14 09:19:28

2

从你目标区域的水景特征开始(或者如果它是一个虚构的地方,那么建立一个水景),然后将城市附近的城市聚集在湖岸,湖岸,湖泊河流交汇处。然后制作连接这些主要城市的虚高速公路。现在以合理的间距在这些高速公路上洒上一些中间城市,宁愿靠近高速公路的路口。现在将一些小城镇洒在空荡荡的空间里。

1

具有泊松聚类大小的高斯聚类很好地工作。

问题:产生与给定城市大致类似的随机点,在美国说。

子问题:
A)描述簇与数字的行,从而使 “簇A是像簇B” 简化为“clusternumbers(A)是像 “clusternumbers(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 ... 

b)中找到随机发生器的combiation有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