我有一个矩阵,我想随机选择随机列为Octave中的新矩阵,但我希望我的随机选择基于矩阵的奇异值分解用比例加权 . 所以基本上我想选择t随机列,其概率是在选择之前确定的 . 有没有办法在Octave / Matlab中做到这一点?
谢谢!
假设你有一些权重的行向量, W (或者在你的情况下可能是矩阵特征值的某个函数),你应该首先创建一个表示权重的归一化累积和的向量,如下所示:
W
cumNormW = cumsum(W)./sum(W);
cumNormW 的值现在应该单调递增,并且应该在 W(1) 到 1 之间 .
cumNormW
W(1)
1
接下来你要在 [0,1] 上统一分布绘制
[0,1]
randVal = rand(1);
您将使用此随机值来查找您刚刚随机选择的相应列 . 最后,您想要找到累积归一化权重向量的第一个索引 .
randCol = find(cumNormW <= randVal, 1, 'last')
这为您提供了最终的随机列选择 .
现在,如果您想确保选择 t 不同的列,则需要跟踪 randCol 的先前值并简单地重复上述 randVal , randCol 步骤,直到您生成一个尚未选择的列 .
t
randCol
randVal
例
假设您有一个包含4列的矩阵,并且您已经计算了该矩阵的特征值并将它们存储在W中 . 我们假设列对应于特征向量,并且您希望选择一个概率与该列的特征值成比例的列 . 特征值之和 .
W = [4 3 2 1];
正常化后,你会得到 cumNormW = [0.40 0.70 0.90 1];
cumNormW = [0.40 0.70 0.90 1];
如您所见,绘制数字的概率明显高于导致选择第一列(“randVal <= 0.4')而不是最后一列('0.9 <randVal <= 1')的概率
你通过 rand(1) 绘制一个随机数,对于这个例子,让我们说 randVal = 0.82 . 使用最终 randCol 步骤,对于此迭代,您将获得 randCol = 3 .
rand(1)
randVal = 0.82
randCol = 3
1 回答
假设你有一些权重的行向量,
W
(或者在你的情况下可能是矩阵特征值的某个函数),你应该首先创建一个表示权重的归一化累积和的向量,如下所示:cumNormW
的值现在应该单调递增,并且应该在W(1)
到1
之间 .接下来你要在
[0,1]
上统一分布绘制您将使用此随机值来查找您刚刚随机选择的相应列 . 最后,您想要找到累积归一化权重向量的第一个索引 .
这为您提供了最终的随机列选择 .
现在,如果您想确保选择
t
不同的列,则需要跟踪randCol
的先前值并简单地重复上述randVal
,randCol
步骤,直到您生成一个尚未选择的列 .例
假设您有一个包含4列的矩阵,并且您已经计算了该矩阵的特征值并将它们存储在W中 . 我们假设列对应于特征向量,并且您希望选择一个概率与该列的特征值成比例的列 . 特征值之和 .
正常化后,你会得到
cumNormW = [0.40 0.70 0.90 1];
如您所见,绘制数字的概率明显高于导致选择第一列(“randVal <= 0.4')而不是最后一列('0.9 <randVal <= 1')的概率
你通过
rand(1)
绘制一个随机数,对于这个例子,让我们说randVal = 0.82
. 使用最终randCol
步骤,对于此迭代,您将获得randCol = 3
.