您是否知道生成矩阵的更有效方法,该矩阵包含所有“权重”的唯一组合(让权重为w和0 < = w < = 1,并且w的值以0.1的步长分隔),使得权重总和为1,第一个是最高权重,最后一个是最低权重。生成总计为1的值的组合,按降序排列
这里是代码,没有工作,但似乎没有效率的删除行:
# generate combinations of weights such that w1 >= w2 >= w3 ...
w = seq(0, 1, 0.1) #weights 0, 0.1, ..., 0.9, 1
w = expand.grid(w, w, w, KEEP.OUT.ATTRS = FALSE) #all combinations of 3 weights
w = w[rowSums(w) == 1, ] #make sure the weights sum to one
w = w[!(w[, 1] < w[, 2] | w[, 2] < w[, 3]),] #make sure w1 >= w2 >= w3 ...
w
# Var1 Var2 Var3
# 11 1.0 0.0 0.0
# 21 0.9 0.1 0.0
# 31 0.8 0.2 0.0
# 41 0.7 0.3 0.0
# 51 0.6 0.4 0.0
# 61 0.5 0.5 0.0
# 141 0.8 0.1 0.1
# 151 0.7 0.2 0.1
# 171 0.5 0.4 0.1
# 271 0.6 0.2 0.2
# 281 0.5 0.3 0.2
# 291 0.4 0.4 0.2
# 401 0.4 0.3 0.3
让我补充一些基本信息: 在这个问题(3个权重按上述顺序)的上限用于第一,第二,第三值如下:
- 所述第一数目可以最低限度地是1所述的组合(1,0,0)
- 第二数量可以最大程度地是1/2的组合(1/2,1/2,0)
- 第三数量可以最大程度地是1/3的组合(1/3,1/3,1/3)
在示例输出中,您显示权重不等于一个......从您的代码中我假设它们应该总和为'<= 1'。如果是这种情况,你应该编辑你的问题。 –
最后的三点也是多余的,因为它们遵循每行中第一个元素必须是最大的要求。 – slabofguinness
@ user2706569编辑了这个问题,是一个错字。 – JBJ