2015-07-28 73 views
8

您是否知道生成矩阵的更有效方法,该矩阵包含所有“权重”的唯一组合(让权重为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)
+0

在示例输出中,您显示权重不等于一个......从您的代码中我假设它们应该总和为'<= 1'。如果是这种情况,你应该编辑你的问题。 –

+0

最后的三点也是多余的,因为它们遵循每行中第一个元素必须是最大的要求。 – slabofguinness

+0

@ user2706569编辑了这个问题,是一个错字。 – JBJ

回答

4

甲非base可能性:

library(partitions) 

step <- 0.1 
n_weights <- 3 

t(restrictedparts(n = 1/step, m = n_weights) * step) 
# [1,] 1.0 0.0 0.0 
# [2,] 0.9 0.1 0.0 
# [3,] 0.8 0.2 0.0 
# [4,] 0.7 0.3 0.0 
# [5,] 0.6 0.4 0.0 
# [6,] 0.5 0.5 0.0 
# [7,] 0.8 0.1 0.1 
# [8,] 0.7 0.2 0.1 
# [9,] 0.6 0.3 0.1 
# [10,] 0.5 0.4 0.1 
# [11,] 0.6 0.2 0.2 
# [12,] 0.5 0.3 0.2 
# [13,] 0.4 0.4 0.2 
# [14,] 0.4 0.3 0.3 
1

通用功能使用标准包:

# Generate weights matrix with noWeights columns and noRows rows. 
# Each row of this matrix contains sorted decremental weights summing up to 1.0. 
generateWeights = function(noWeights, 
          noRows, 
          distribution = runif, 
          rounding = function(x){ round(x, 1) }) 
{ 
    generator = function() 
    { 
    x = distribution (noWeights); 
    x = x/sum(x); 
    sort(rounding(x), decreasing = T) 
    } 
    t(replicate(noRows, generator())) 
} 

# example of use 
generateWeights(3, 10) 
+1

运行之前需要进行相当多的调整... –

+1

“行”和“列”在哪里定义?为什么“noWeights”和“noRows”未被使用? “gen”应该等于“generateWeights”吗? – mra68

+0

对不起。固定。 – Yester