如何生成具有约束和不同边界的随机数(对于高维)?

17次浏览(最近30天)
我想生成一组边界不同的随机数生成的随机数的和等于一个常数。
例如,有x1 x2 x3 ....,每个变量都有自己的限制,如50< x1 <100, 0< x2 < 30, -100 < x3 < 50, ...., -30 < x40 < 30。
同样,x1+ x2 +x3 +…+ x4 = 5000。
我尝试过使用“randFixedLinearCombination”,但是不可能为高维向量生成这样的数据(我的问题实际上有大约100个变量)。算法有什么功能来解决这个问题吗?
谢谢你!

接受的答案

约翰D 'Errico
约翰D 'Errico 8月8日
FEX上的这两种选择都不是直接的解决方案。randfixedsum失败了,因为它明确地假定变量的统一边界,我自己的提交,randFixedLinearCombination,因为问题是简单的太高的维度。
这里的问题是什么?
我们可以把约束空间想象成一个n维的矩形框。但是记住,这里N很大。至少它是在你想要解决的情况下。
假设我们要把这个矩形盒子变换成一个n维的单位超立方体?这似乎可以让randfixedsum发挥作用,但遗憾的是,事实并非如此。这是正确的,因为这个变换也将和,从一个简单的和,转换成一个一般的线性组合。
例如,考虑一个简单的问题,我们希望在由约束定义的框中生成一组数字
1 . x = 0
-1 <= x2 <= 2
2 <= x3 <= 6
我们想看到的约束条件是什么
X1 + x2 + x3 == 4
满足该问题的点集可以表示为一个平面上的多边形。
在这种情况下,多面体是一个四边形。在某些情况下,多面体可能是一个三角形,甚至可能是一个六边形。
一般的要求是从这样的集合中随机抽取点。在高维数下,这个问题当然会变得更加复杂,因为多面体现在可能是嵌入在n-1维超平面中的一个巨大的多面体。我在randFixedLinearCombination中采用的方法是解决那个多边形,然后从它中随机取样。该解决方案在理论上是正确的,可以从所要求的域生成统一的样本,尽管在实际中通常不可能实现大量维数,因为多面体本身有时太复杂而无法生成。
这个问题能转化成一个单位超立方体吗?也就是说,假设我们把这个问题转化成对ech变量有一致的界?问题是,这种转换现在也将隐含地转换兴趣平面。在上面的三维例子中,我们可以设置
日元= x1
y2 = (x2 + 1) / 3
y = (x3 - 2)/4
与之相反的是
x1 = y₁
X2 = 3*y2 - 1
X3 = 4*y3 + 2
然而,现在我们的约束变成
y + 3*y + 4*y3 == 3
这是randfixedsum不能处理的,因为线性约束不再是一个简单的和,即使假设y1 y2 y3都在单位立方里。
@Surat Asvapoositkul提到的40或100维度问题也会有同样的问题。一个代码可以解决它,除了它太大,而另一个代码不能解决它,因为边界不是一致的宽度。
很抱歉。
1评论
苏拉特Asvapoositkul
谢谢你清晰的解释!高维向量使得它不可能实现。我将尝试找出在数据集中变量的数量可以减少或不。

登录评论。

更多的答案(2)

沃尔特·罗伯森
3评论

登录评论。


杰夫•米勒
杰夫•米勒 8月9日
我不知道这是否对你有用,但这里有一种方法能够生成符合你的某些标准的“随机”分数(即固定总分,所有分数都在一定范围内)。然而,生成的分数在它们的间隔内并没有接近均匀的分布,如最后的直方图所示。我不认为均匀分布在你的其他约束条件下是可能的…
%有界随机数,固定和
%任意数量的变量和任何你想要的边界值
lowbounds = [0, 10, 100, 250];
UpperBounds = [7, 33, 444,750];
FixedSum = 900;%你的选择
据nvar =元素个数(下界);
Ranges =上界-下界;
TotalLowers =总和(下界);
TotalUppers =总和(UpperBounds);
nSims = 10000;
x = 0(据nvar nSims);
iSim = 1: nSims
xRand =低边界+ rand(1,nVars) .*范围;
RandSum =总和(xRand);
如果RandSum > FixedSum
TotalOvershoot = RandSum - FixedSum;
我们可以使用xRand - lower - bounds;
xRand = xRand - TotalOvershoot / sum(videoavailable) * videoavailable;
其他的
TotalUndershoot = FixedSum - RandSum;
增加可用= UpperBounds - xRand;
xRand = xRand + TotalUndershoot / sum(增加可用)*增加可用;
结束
%xRand现在是一个固定和的随机向量,所有的分数都在各自的区间内。
%sum(xRand) %如果你想检查
x (:, iSim) = xRand;
结束
图;
据nvar iVar = 1
次要情节(2,2,iVar)
直方图(x (iVar:))
结束

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!