我在从数据创建关节密度函数时遇到问题。我所拥有的是来自股票的队列大小,因为两个向量保存为:
X = [askQueueSize bidQueueSize];
然后我使用hist3函数创建3D直方图。这就是我得到的: http://dl.dropbox.com/u/709705/hist-plot.png
我想要的是让Z轴归一化,使其从[0 1]开始。
我该怎么做?或者有人在库存中有一个很好的联合密度matlab 功能?
这类似(How to draw probability density function in MatLab?)但在2D中。
我想要的是带有x:ask queue, y:bid queue, z:probability
的3D。
如果有人可以帮助我,我将非常感激,因为我在这里碰到了一堵墙。
答案 0 :(得分:3)
我看不到这样做的简单方法。您可以使用
从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]);
如有必要。
答案 1 :(得分: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
希望这能有所帮助!
答案 2 :(得分: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))))