我使用蒙特卡罗方法为我的随机变量生成N
场景。我将这些场景存储在M x N
矩阵中。我想计算矩阵中每个场景(列)的概率。
我尝试使用命令histc()
,但它不起作用。如何找到这些概率并将它们存储在向量中以便将其用于优化问题?
答案 0 :(得分:0)
您可以在此“场景”矩阵的转置上使用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