0

我在从数据创建联合密度函数时遇到问题。我所拥有的是将股票中的队列大小作为两个向量保存为:

X = [askQueueSize bidQueueSize];

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

我想要的是对 Z 轴进行归一化,使其从 [0 1] 开始。

我怎么做?或者有人在股票上有很好的联合密度matlab函数吗?

这类似于(如何在 MatLab 中绘制概率密度函数?),但在 2D 中。

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

如果有人可以帮助我,将不胜感激,因为我在这里碰壁了。

4

3 回答 3

2

我看不到这样做的简单方法。您可以使用从 hist3 获取直方图计数

[N C] = hist3(X);

我们的想法是将它们标准化:

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

但我找不到一种很好的方法将它们绘制回直方图(您可以使用bar3(N),但我认为轴标签需要手动设置)。

我最终得到的解决方案涉及修改hist3. 如果您可以访问此(edit hist3),那么这可能对您有用,但我不确定法律情况是什么(您需要统计工具箱的许可证,如果您复制 hist3 并自己修改它,这可能不是合法的)。

surf无论如何,我找到了为绘图准备数据的地方。有 3 个矩阵对应于 x、y 和 z。就在计算 z 矩阵的内容之前(第 256 行),我插入了:

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

这对计数矩阵进行了归一化。

最后,绘制直方图后,您可以使用以下命令设置轴限制:

xlim([0, 1]);

如有必要。

于 2012-04-12T16:47:10.497 回答
2

在 mathworks 论坛的一个人的帮助下,这是我最终得到的很好的解决方案:

(data_x 和 data_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

这给了我 3D 的联合密度图。可以通过计算曲面上的积分来检查:

integralOverDensityPlot = sum(trapz(pdf_normalize));

当变量step变为零时,变量integralOverDensityPlot变为 1.0

希望这对某人有帮助!

于 2012-04-14T14:45:35.577 回答
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))))
于 2016-01-16T18:58:39.920 回答