2012-04-12 78 views
1

我从数据创建联合密度函数时遇到问题。我所拥有的是队列大小从一个股票作为两个向量保存为:如何创建3D关节密度图MATLAB?

X = [askQueueSize bidQueueSize]; 

然后,我使用hist3函数来创建一个3D直方图。这是我得到: http://dl.dropbox.com/u/709705/hist-plot.png

我想要的是Z轴归一化,使它从[0 1]。

我该怎么做?或者做一个很好的联合密度matlab股票的功能?

这与(2D)中的(How to draw probability density function in MatLab?)类似。

我想要的是3D与x:ask queue, y:bid queue, z:probability

如果有人能帮助我,我将非常感谢,因为我在这里遇到了一堵墙。

回答

2

来自于MathWorks的论坛上一个人的帮助,这是伟大的解决方案,我结束了:

(数据_X和数据_Y是价值观,要在hist3计算)

x = min_x:step:max_x; % axis x, which you want to see 
y = min_y:step:max_y; % axis y, which you want to see 

[X,Y] = meshgrid(x,y); *%important for "surf" - makes defined grid* 

pdf = hist3([data_x , data_y],{x y}); %standard hist3 (calculated for yours axis) 
pdf_normalize = (pdf'./length(data_x)); %normalization means devide it by length of 
             %data_x (or data_y) 
figure() 
surf(X,Y,pdf_normalize) % plot distribution 

这给了我三维联合密度图。这可以通过计算积分的表面上进行检查:

integralOverDensityPlot = sum(trapz(pdf_normalize)); 

当变量变为零变量integralOverDensityPlot变为1.0

希望这有助于有人!

3

我看不到一个简单的方法来做到这一点。您可以使用

[N C] = hist3(X); 

从hist3得到直方图计数背部和想法是与正常化他们:

N = N/sum(N(:)); 

,但我不能找到一个很好的方式来绘制他们回到直方图之后(您可以使用bar3(N),但我认为轴标签需要手动设置)。

我最终解决的解决方案涉及修改代码hist3。如果你有权访问这个(edit hist3),那么这可能适用于你,但我不确定法律情况是什么(你需要统计工具箱的许可证,如果你复制hist3并自己修改它,这可能是不合法)。

无论如何,我发现数据正在准备surf情节的地方。有3个矩阵对应于x,y和z。就在计算z矩阵的内容(行256)之前,我插入了:

n = n/sum(n(:)); 

它使计数矩阵归一化。

最后一次直方图绘制,可以设置与轴界限:如果有必要

xlim([0, 1]); 

+0

也就是说做的一种方式!它的工作原理! – Groot 2012-04-14 14:35:28

0

有一个快速的方式如何与hist3功能做到这一点:

[bins centers] = hist3(X); % X should be matrix with two columns 
c_1 = centers{1}; 
c_2 = centers{2}; 
pdf = bins/(sum(sum(bins))*(c_1(2)-c_1(1)) * (c_2(2)-c_2(1))); 

如果“整合”这个你会得到1

sum(sum(pdf * (c_1(2)-c_1(1)) * (c_2(2)-c_2(1))))