如何生成 1000 个随机点,其分布类似于俄亥俄州的城镇?
恐怕我无法准确定义“像城市一样分布”;均匀分布的中心 + 小高斯云很容易但特别。
补充:必须有一个具有聚类参数的二维分布族,可以改变以匹配给定的一组点?
问问题
966 次
4 回答
2
从目标区域的水景模型开始(或制作一个,如果是为了一个虚构的地方),然后将城市聚集在河流交界处、沿湖岸、湖河交界处。然后制作连接这些主要城市的假想高速公路。现在在这些高速公路上以合理的间距散布一些中间城市,宁愿靠近高速公路的交叉口。现在通过空旷的空间洒一些小镇。
于 2010-05-13T15:40:29.803 回答
2
也许你可以看看 Walter Christaller 的中心位置理论。我想某处一定有一些发电机,或者你可以自己做饭。
于 2010-05-12T15:26:42.837 回答
1
具有泊松簇大小的高斯簇工作得相当好。
问题:生成与给定城市大致相似的随机点,例如在美国。
子问题:
a)用数字行描述集群,因此“集群 A 就像集群 B”简化为“集群编号(A)就像“集群编号(B)”。
运行 N=100 然后通过下面的 fcluster 运行 1000 个点,使用 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) 找到具有 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
于 2010-06-07T13:34:22.723 回答
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;
}
}
绘制 30000 间房屋使用
x = r.nextGaussian() * rad/4 + rad;
y = r.nextGaussian() * rad/4 + rad;
产生了这座美丽的城市:
于 2010-05-12T15:26:12.570 回答