【发布时间】:2016-07-14 11:41:16
【问题描述】:
我正在使用 Monte Carlo 方法为我的随机变量生成 N 场景。我将这些场景存储在M x N 矩阵中。我想计算矩阵中每个场景(列)发生的概率。
我尝试使用命令histc(),但它不起作用。我怎样才能找到这些概率并将它们存储在一个向量中以便将其用于优化问题?
【问题讨论】:
标签: matlab matrix probability montecarlo
我正在使用 Monte Carlo 方法为我的随机变量生成 N 场景。我将这些场景存储在M x N 矩阵中。我想计算矩阵中每个场景(列)发生的概率。
我尝试使用命令histc(),但它不起作用。我怎样才能找到这些概率并将它们存储在一个向量中以便将其用于优化问题?
【问题讨论】:
标签: matlab matrix probability montecarlo
您可以在此“场景”矩阵的转置上使用unique,并检查函数调用的第三个输出。第三个输出为矩阵中出现的每个可能的唯一事件分配一个唯一 ID。您还需要指定'rows' 标志以将每一行作为一个整体视为一个实例。如果您未指定'rows',则矩阵中的每个单独元素都将被视为单个实例,您希望整个列(或转置矩阵的行)成为单个实例。此外,很遗憾,我们无法沿带有unique 的列进行操作,这就是您需要转置矩阵的原因。
您还需要第一个输出来检查每个 ID 如何映射到每个唯一事件。确保在最后转置此输出变量以使输出映射到列。然后,您可以使用histc 或histcounts 来确定每个“场景”的发生情况,从而找到假设情况等概率的概率。
这是一个简单的例子。假设我有这个事件矩阵存储在A:
>> A = [0 0 0; 1 1 1; 1 0 0; 0 0 1; 0 0 0; 0 0 1; 1 1 1].'
A =
0 1 1 0 0 0 1
0 1 0 0 0 0 1
0 1 0 1 0 1 1
我们看到场景的维度是 3,而有 7 个事件。用unique 做我所说的:
>> [un, ~, id] = unique(A.', 'rows'); %'
>> un = un.' %'
un =
0 0 1 1
0 0 0 1
0 1 0 1
>> id
id =
1
4
3
2
1
2
4
我们可以看到[0; 0; 0] 列属于ID 1,[0; 0; 1] 列映射到ID 2,[1; 0; 0] 列映射到ID 3,最后[1; 1; 1] 映射到ID 4。un 存储所有唯一列,而 id 为我们提供此映射。您可以验证,如果您参考id 变量并参考我们上面看到的映射,您可以将每一列替换为其对应的ID。
然后我们可以确定每次发生的概率:
N = size(un,2); %// Get total number of unique scenarios
M = size(A,2); %// Get total number of scenarios
prob = histc(id, 1 : N) / M; %// Finding probabilities
我们得到:
>> prob
prob =
0.2857
0.2857
0.1429
0.2857
这与我们的数据一致。对于列[0; 0; 0]、[0; 0; 1] 和[1; 1; 1],每列出现两次,因此概率为2/7 = 0.2857。 [1; 0; 0] 的另一列仅出现一次,因此概率为1/7 = 0.1429。
如果您的矩阵存储在A 中,您可以轻松复制和粘贴完整的代码列表:
[un, ~, id] = unique(A.', 'rows'); %'// Assigning each event a unique ID
un = un.'; %'// Transpose to ensure compatibility
N = size(un,2); %// Get total number of unique scenarios
M = size(A,2); %// Get total number of scenarios
prob = histc(id, 1 : N) / M; %// Finding probabilities
【讨论】: