找出矩阵中每一列的概率
Find the probability of each column in matrix
我正在使用 Monte Carlo 方法为我的随机变量生成 N
场景。我将这些场景存储在 M x N
矩阵中。我想计算每个场景(列)在矩阵中出现的概率。
我尝试使用命令 histc()
但它不起作用。我怎样才能找到这些概率并将它们存储在向量中以便将其用于优化问题?
您可以在这个 "scenario" 矩阵的转置上使用 unique
并检查函数调用的第三个输出。第三个输出为矩阵中看到的每个可能的唯一事件分配一个唯一 ID。您还需要指定 'rows'
标志以将每一行整体视为一个实例。如果您不指定 'rows'
,矩阵中的每个单独元素都将被视为单个实例,您希望整个列(或转置矩阵的行)是单个实例。此外,不幸的是,我们无法沿着 unique
的列进行操作,这就是为什么您需要转置矩阵的原因。
您还需要第一个输出来检查每个 ID 如何映射到每个唯一事件。确保在最后转置此输出变量以使输出映射到列。然后,您可以使用 histc
或 histcounts
来确定每个 "scenario" 的出现,从而找到假设等概率情况下的概率。
这是一个简单的例子。假设我将这个事件矩阵存储在 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
我正在使用 Monte Carlo 方法为我的随机变量生成 N
场景。我将这些场景存储在 M x N
矩阵中。我想计算每个场景(列)在矩阵中出现的概率。
我尝试使用命令 histc()
但它不起作用。我怎样才能找到这些概率并将它们存储在向量中以便将其用于优化问题?
您可以在这个 "scenario" 矩阵的转置上使用 unique
并检查函数调用的第三个输出。第三个输出为矩阵中看到的每个可能的唯一事件分配一个唯一 ID。您还需要指定 'rows'
标志以将每一行整体视为一个实例。如果您不指定 'rows'
,矩阵中的每个单独元素都将被视为单个实例,您希望整个列(或转置矩阵的行)是单个实例。此外,不幸的是,我们无法沿着 unique
的列进行操作,这就是为什么您需要转置矩阵的原因。
您还需要第一个输出来检查每个 ID 如何映射到每个唯一事件。确保在最后转置此输出变量以使输出映射到列。然后,您可以使用 histc
或 histcounts
来确定每个 "scenario" 的出现,从而找到假设等概率情况下的概率。
这是一个简单的例子。假设我将这个事件矩阵存储在 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