计算二维离散随机变量的联合概率分布

article/2025/9/17 14:55:12

一. 定义

Joint probability distribution:

给定至少两个随机变量X,Y,…, 它们的联合概率分布(Joint probability distribution)指的是每一个随机变量的值落入特定范围或者离散点集合内的概率. 对于只有两个随机变量的情况, 称为二元分布(bivariate distribution).

联合概率分布可以使用联合累计分布函数(joint cumulative distribution function), 连续随机变量的联合概率密度函数(joint probability density function)或者离散变量的联合概率质量函数(joint probability mass function)来描述. 由此又衍生出两个概念: 边缘分布(marginal distribution)和条件概率分布(conditional probability distribution).

二. 离散变量的联合概率质量函数公式

公式:
这里写图片描述

这里写图片描述是给定 X=x Y=y 的条件概率.
而且有:
这里写图片描述

如果 X Y相互独立:
这里写图片描述
如果 X Y条件不独立(conditionally dependent):
P(X=x and Y=y)=P(X=x)P(Y=y|X=x)
也可以使用联合累计分布函数差分来计算:
联合累计分布函数定义是:
这里写图片描述
所以 F(x,y) 的导数(差分)就是 P(X=x and Y=y)

三. 使用Matlab计算离散2D联合分布

参考: Calculating a 2D joint probability distribution
离散2D联合分布可用于计算两张图片的互信息MI.

0. 定义两个离散的随机变量.

有N个点分布在边长为1的正方形区域内. 把正方形分为K1*K2的小矩形. 统计每个小矩形内的点的个数.

% Data
N = 1e5;    % number of points
xy = rand(N, 2);    % coordinates of points
xy(randi(2*N, 100, 1)) = 0;    % add some points on one side
xy(randi(2*N, 100, 1)) = 1;    % add some points on the other side
xy(randi(N, 100, 1), :) = 0;    % add some points on one corner
xy(randi(N, 100, 1), :) = 1;    % add some points on one corner
inds= unique(randi(N, 100, 1)); 
xy(inds, :) = repmat([0 1], numel(inds), 1);    % add some points on one corner
inds= unique(randi(N, 100, 1)); 
xy(inds, :) = repmat([1 0], numel(inds), 1);    % add some points on one corner% Intervals for rectangles
K1 = ceil(sqrt(N/5));    % number of intervals along x
K2 = K1;    % number of intervals along y
int_x = [0:(1 / K1):1];    % intervals along x
int_y = [0:(1 / K2):1];    % intervals along y

1. 从定义出发, 使用for循环:

tic
count_cells = zeros(K1, K2);
for k1 = 1:K1inds1 = (xy(:, 1) >= int_x(k1)) & (xy(:, 1) < int_x(k1 + 1));for k2 = 1:K2inds2 = (xy(:, 2) >= int_y(k2)) & (xy(:, 2) < int_y(k2 + 1));count_cells(k1, k2) = sum(inds1 .* inds2);% 布尔相乘得到交集点的个数end
end
toc
% Elapsed time is 39.357691 seconds.

可见使用两重循环的计算时间非常长.

2. 使用hist3函数

N=hist3(X,'Edges',edges)是matlab中专门计算二元分布的函数.
edges是包含两个递增array的cell. 第一维分组edge1是edges{1}, 第二维分组edge2是edges{2}.
也就是:
edges1(i)<=X(k,1)<edges1(i+1)
edges2(j)<=X(k,2)<edges2(j+1)
正好落在 edges1(i+1) 或者 edges2(j+1) 上的点的个数放在N的最后一行或者最后一列.
hist3不统计edges范围外的部分.
N是一个二维矩阵, 统计的落到每个单元格内的点的个数.

tic
count_cells_hist = hist3(xy, 'Edges', {int_x int_y});
% 注意hist3得到的矩阵是K1+1*K2+1的, 所以把最后一行和一列去掉.
% 最后一行或一列表示的是 X(k,1)= edges{1}(end)或者X(k,2) = edges{2}(end)的点数
count_cells_hist(end, :) = []; count_cells_hist(:, end) = [];
toc
all(count_cells(:) == count_cells_hist(:))
% Elapsed time is 0.017995 seconds.

显然比用两重for循环快多了.

3. 使用矩阵二元操作bsxfun

C = bsxfun(fun,A,B)AB做逐个元素的二元操作, 操作由函数 fun指定.
返回的C中, 1表示满足条件, 0 表示不满足条件. 可用的fun有:

funoperation
@plusPlus
@minusMinus
@timesArraymultiply
@rdivideRightarray divide
@ldivideLeftarray divide
@powerArray power
@maxBinary maximum
@minBinary minimum
@remRemainder after division
@modModulus after division
@atan2Four-quadrant inverse tangent; result in radians
@atan2dFour-quadrant inverse tangent; result in degrees
@hypotSquare root of sum of squares
@eqEqual
@neNot equal
@ltLess than
@leLess than or equal to
@gtGreater than
@geGreater than or equal to
@andElement-wiselogical AND
@orElement-wiselogical OR
@xorLogicalexclusive OR

使用bsxfun的matlab代码:

%% bsxfun
tic
xcomps = single(bsxfun(@ge,xy(:,1),int_x));% 10000*143矩阵
ycomps = single(bsxfun(@ge,xy(:,2),int_y));% 10000*143矩阵
% 相当于求CDF
count_again = xcomps.' * ycomps; %' 143x143 = 143x1e5 * 1e5x143
% 差分后是142*142
count_again_fix = diff(diff(count_again')');
toc
% Elapsed time is 0.178316 seconds.
all(count_cells_hist(:) == count_again_fix(:))

bsxfun稍逊于hist3, 可以针对没有statistics toolbox的情况下使用.

4. 使用accumarray

A= accumarray(subs,val)使用subs的元素值作为索引. subs和val是一一对应的. 将subs中相同值对应的val值累加. 也就是说, subs中元素的位置决定了val哪些元素相加, subs中元素的值决定了累加值在输出中的位置. 看matlab help中示例:

Example 1
Create a 5-by-1 vector and sum values for repeated 1-D subscripts:
val = 101:105;
subs = [1; 2; 4; 2; 4];
A = accumarray(subs, val)

A =
101 % A(1) = val(1) = 101
206 % A(2) = val(2)+val(4) = 102+104 = 206
0 % A(3) = 0
208 % A(4) = val(3)+val(5) = 103+105 = 208

subs中元素值必须是正整数值. 所以在表示分组时, 可以把[0,1]区间变为[1,K1]区间. matlab代码:

%%%%% 第五种方法Using accumarray
% Another approach is to use accumarray to make the joint histogram after we bin the data.
% Starting with int_x, int_y, K1, xy, etc.:
tic
% take (0,1) data onto [1 K1], following A.Dondas approach for easy comparison
ii = floor(xy(:,1)*(K1-eps))+1; 
ii(ii<1) = 1; ii(ii>K1) = K1;
jj = floor(xy(:,2)*(K1-eps))+1; 
jj(jj<1) = 1; jj(jj>K1) = K1;% create the histogram and normalize
H = accumarray([ii jj],ones(1,size(ii,1)));
PDF = H / size(xy,1); % for probabilities summing to 1
toc
% Elapsed time is 0.006356 seconds.
all(count_cells_hist(:) == count_again_fix(:))

ms级别! 真是快!

5. 使用mex编译

mex混合编程参考: 在Matlab中使用mex函数进行C/C++混合编程

#include "mex.h"
// http://stackoverflow.com/questions/19745917/calculating-a-2d-joint-probability-distribution
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{unsigned long int hh, ctrl;       /*  counters                       */unsigned long int N, m, n;        /*  size of matrices               */unsigned long int *xy;            /*  data                           */unsigned long int *count_cells;   /*  joint frequencies              *//*  matrices needed */mxArray *count_cellsArray;/*  Now we need to get the data */if (nrhs == 3) {xy = (unsigned long int*) mxGetData(prhs[0]);N = (unsigned long int) mxGetM(prhs[0]);//取矩阵的行数m = (unsigned long int) mxGetScalar(prhs[1]);n = (unsigned long int) mxGetScalar(prhs[2]);}/*  Then build the matrices for the output */count_cellsArray = mxCreateNumericMatrix(m + 1, n + 1, mxUINT32_CLASS, mxREAL);count_cells = mxGetData(count_cellsArray);plhs[0] = count_cellsArray;hh = 0; /* counter for elements of xy *//* for all points from 1 to N */for(hh=0; hh<N; hh++) {ctrl = (m + 1) * xy[N + hh] + xy[hh];count_cells[ctrl] = count_cells[ctrl] + 1;}
}

将代码保存为: joint_dist_points_2D.c. 在matlab cmd中运行:

mex joint_dist_points_2D.c

生成joint_dist_points_2D.mexw32文件.
matlab调用代码:

% Use mex function
tic
xy2 = uint32(floor(xy ./ repmat([1 / K1, 1 / K2], N, 1)));
count_cells = joint_dist_points_2D(xy2, uint32(K1), uint32(K2));
toc
% Elapsed time is 0.011696 seconds.

也是非常快的.


http://chatgpt.dhexx.cn/article/6006PQUh.shtml

相关文章

matlab 分布拟合,曲线拟合和分布拟合 - MATLAB Simulink Example - MathWorks 中国

在曲线拟合与分布拟合之间进行选择 曲线拟合和分布拟合是不同类型的数据分析。 当您要将某个响应变量建模为预测变量的函数时,请使用曲线拟合。 当您要为单一变量的概率分布建模时,请使用分布拟合。 曲线拟合 在以下试验数据中,预测变量为 time,即服用药物之后的时间。响应…

MATLAB如何画数据分布曲线,Matlab绘制累积分布函数(CDF)

CDF示例代码&#xff1a; cdf.mfunction [xTime,yPercentage]cdf(initValue,step,endValue,sample); xTime[]; yPercentage[]; totalNumlength(sample); for iinitValue:step:endValue templength(find(sample<i))/totalNum; xTime[xTime,i]; yPercentage[yPercentage,temp]…

【得物技术】如何测试概率性事件 - 二项分布置信区间

前言 &#xfeff; 日常开发测试可能会遇到这样一种情况&#xff0c;有一个接口或方法概率触发&#xff0c;那么需要多少次抽样&#xff0c;落在一个什么区间内&#xff0c;才能断定是否按照设定概率进行呢&#xff1f; &#xfeff; 本文将以二项分布作为研究手段&#xf…

python画累积分布图_python累积分布图

在与@EOL进行了决定性的讨论之后,我想使用随机高斯样本作为摘要发布我的解决方案(左上角): import numpy as np import matplotlib.pyplot as plt from math import ceil, floor, sqrt def pdf(x, mu=0, sigma=1): """ Calculates the normal distributions p…

2021-10-24 我的第五次java作业:二项分布和双骰子赌博问题

我的第五次java作业 题目&#xff1a; 二项分布是n次独立试验中成功次数k的离散概率分布&#xff0c;其中每次试验成功的概率为p。利用Java Math类中提供的数学函数&#xff0c;给出二项分布X~B(n, p, k)的实现代码并进行测试。例如&#xff0c;当用户给定n20, p0.1, k5的概率…

记一次使用Cobar踩到的坑

起因 起因是因为日志里经常报出锁等待超时的错误&#xff0c;并且这个是环环相扣的&#xff0c;一个锁等待会直接引发另外的锁等待&#xff0c;所以危害非常严重&#xff0c;影响非常深远。寻找原因发现是C3P0报出了DEADLOCK&#xff0c;如下图所示&#xff1a; 分析 可以…

Cobar介绍及配置

原文地址为&#xff1a; Cobar介绍及配置 from&#xff1a;http://code.alibabatech.com/wiki/display/cobar/Home Skip to end of metadata Page restrictions applyAttachments:1Added by kimi Lv, last edited by 邱 硕 on 十月 18, 2012 (view change) Comment: Go to st…

用cobar搭建分布式数据库

周末针对最新的项目需求进行cobar的搭建并针对实际状况做了demo演示 一、需求 1、大数据量&#xff0c;邮件发送记录需要记录&#xff0c;一年可能累计4亿的数据 2、需要按照邮箱进行邮件发送明细的查询以及发送记录的查询 二、问题 1、单库分表分区已经解决不了存储以及查…

用cobar搭建分布式数据库 .

周末针对最新的项目需求进行cobar的搭建并针对实际状况做了demo演示 一、需求 1、大数据量&#xff0c;邮件发送记录需要记录&#xff0c;一年可能累计4亿的数据 2、需要按照邮箱进行邮件发送明细的查询以及发送记录的查询 二、问题 1、单库分表分区已经解决不了存储以及查…

开源的分布式数据库中间件系统Mycat和阿里巴巴Cobar的对比

mycat 不得不说的缘分 原创 2016年04月15日 15:48:17 27834 1&#xff0c;愕然回首&#xff0c;它在灯火阑珊处 关于mysql集群中间件&#xff0c;以前写在应用程序里面&#xff0c;由开发人员实现&#xff0c;在配置文件里面写多个数据源&#xff0c;写库一个数据源&#xff0…

分布式数据中间件TDDL、Amoeba、Cobar、MyCAT架构比较

框架比较 TDDL Amoeba Cobar MyCat 点评 TDDL不同于其它几款产品&#xff0c;并非独立的中间件&#xff0c;只能算作中间层&#xff0c;是以Jar包方式提供给应用调用。属于JDBC Shard的思想&#xff0c;网上也有很多其它类似产品。 另外&#xff0c;网上有关于TDDL的图&#x…

TDDL、Amoeba、Cobar、MyCAT架构比较

布式数据库中间件TDDL、Amoeba、Cobar、MyCAT架构比较分 比较了业界流行的MySQL分布式数据库中间件&#xff0c;关于每个产品的介绍&#xff0c;网上的资料比较多&#xff0c;本文只是对几款产品的架构进行比较&#xff0c;从中可以看出中间件发展和演进路线 框架比较 TDDL Am…

Cobar使用文档(可用作MySQL大型集群解决方案)

转&#xff1a;http://blog.csdn.net/shagoo/article/details/8191346 最近好不容易抽空研究了下Cobar&#xff0c;感觉这个产品确实很不错&#xff08;在文档方面比Amoeba强多了&#xff09;&#xff0c;特此推荐给大家。Cobar是阿里巴巴研发的关系型数据的分布式处理系统&am…

Cobar的架构与实践

Cobar是提供分布式数据库服务的中间件&#xff0c;是阿里巴巴B2B前台应用访问数据库的统一入口。本文讲述的就是Cobar的架构演变与应用实践。 2008年&#xff0c;阿里巴巴B2B成立了平台技术部&#xff0c;为各个业务部门的产品提供底层的基础平台。这些平台涵盖Web框架、消息…

alibaba的COBAR真是强大.

最近好不容易抽空研究了下Cobar&#xff0c;感觉这个产品确实很不错&#xff08;在文档方面比Amoeba强多了&#xff09;&#xff0c;特此推荐给大家。Cobar是阿里巴巴研发的关系型数据的分布式处理系统&#xff0c;该产品成功替代了原先基于Oracle的数据存储方案&#xff0c;目…

Alibaba的COBAR真是强大

&#xfeff;&#xfeff; 最近好不容易抽空研究了下Cobar&#xff0c;感觉这个产品确实很不错&#xff08;在文档方面比Amoeba强多了&#xff09;&#xff0c;特此推荐给大家。Cobar是阿里巴巴研发的关系型数据的分布式处理系统&#xff0c;该产品成功替代了原先基于Oracle的…

Cobar Client的使用

cobar client是出自阿里的产品&#xff0c;cobar client只需要引入jar包即可&#xff0c;不需要建立服务。下面的地址是cobar client的帮助文档 http://code.alibabatech.com/docs/cobarclient/zh/ http://www.kuqin.com/system-analysis/20120212/318089.html 分库分表都…

Cobar介绍

概述 Cobar是关系型数据的分布式处理系统&#xff0c;它可以在分布式的环境下看上去像传统数据库一样为您提供海量数据服务。 产品在阿里巴巴B2B公司已经稳定运行了3年以上。目前已经接管了3000个MySQL数据库的schema&#xff0c;为应用提供数据服务。据最近统计cobar集群目前…

[存储] Cobar使用文档(可用作MySQL大型集群解决方案)

最近好不容易抽空研究了下Cobar&#xff0c;感觉这个产品确实很不错&#xff08;在文档方面比Amoeba强多了&#xff09;&#xff0c;特此推荐给大家。Cobar是阿里巴巴研发的关系型数据的分布式处理系统&#xff0c;该产品成功替代了原先基于Oracle的数据存储方案&#xff0c;目…

Linux nohup命令用法详解

nohup 英文全称 no hang up&#xff08;不挂起&#xff09;&#xff0c;用于在系统后台不挂断地运行命令&#xff0c;退出终端不会影响程序的运行。 nohup 命令&#xff0c;在默认情况下&#xff08;非重定向时&#xff09;&#xff0c;会输出一个名叫 nohup.out 的文件到当前…