10

我敢肯定已经多次提出相反的问题,但我找不到任何关于如何生成错误随机数的答案。

我想编写一个用于聚类分析的小程序,并想生成一些随机点进行测试。如果我只是插入 1000 个具有随机坐标的点,它们将分散在整个字段中,这将使聚类分析变得毫无价值。

有没有一种简单的方法来生成构建集群的随机数?

我已经考虑过不使用random()random()*random()会生成正态分布的数字(我想我在 Stack Overflow 的某个地方读到了这个)。

第二种方法是随机选择几个区域并在该区域再次运行点生成,这当然会在该区域产生一个集群。

你有更好的主意吗?

4

5 回答 5

7

如果您有意生成结构良好的集群(而不是完全随机的集群),您可以将两者结合起来找到一个集群中心,然后在它周围放置很多点以呈正态分布。

以及在笛卡尔坐标(x,y)中工作;您可以使用径向方法来分配特定集群的点。选择一个随机角度(0-2PI 弧度),然后选择一个半径。请注意,由于周长是成比例的半径,因此靠近中心的区域分布会更密集 - 但每个特定半径的分布将是相同的。修改径向分布以产生更紧密的集群。

或者,您可以将真实世界的派生数据用于具有自然聚类的半随机点分布。最近我一直在做很多地理空间聚类分析。为此,我使用了真实世界的数据——邮政编码质心(在城市周围形成自然集群);和餐厅的位置。另一个建议:您可以使用恒星目录或银河目录。

于 2010-11-04T16:22:03.910 回答
5

生成少量锚点。真正的随机数。然后在它们周围产生噪音:

anchor + dist * (random() - 0.5))

这将生成聚集的数字,这些数字将均匀分布在距离dist上。

于 2010-11-04T16:19:00.720 回答
2
  • 为您的模型添加一个额外的维度。
  • 绘制一个不规则(即不平坦)的表面。
  • 在扩展空间中生成数字。
  • 丢弃表面一侧的所有数字。
  • 从剩下的每个数字中,删除附加维度。
于 2010-11-04T16:37:24.490 回答
1

也许我误解了,但是 gnu 科学库(用 c 编写)有很多分布在其中 - 你不能从那个库中的高斯/泊松等中选择坐标吗?

http://www.gnu.org/software/gsl/manual/html_node/Random-Number-Distributions.html

他们也提供了来自链接的泊松分布的简单示例。

如果您需要您的分布有界(例如 y 坐标不小于 -1),那么您可以通过拒绝从 gsl 中的均匀分布采样来实现。

祝福,汤姆

于 2010-11-04T16:57:52.680 回答
0

我的第一个想法是,您可以使用线性同余生成器来实现自己的,并尝试使用系数,直到获得足够低的周期来满足您的需求。一个非常低的m系数应该可以解决问题。

我也喜欢你的第二个想法,即围绕几个预先选择的点运行一个好的 RNG 来创建集群。您可以使用此方法针对集群的特定区域,也可以随机生成这些区域。

于 2010-11-04T16:22:40.570 回答