登录论坛

查看完整版本 : 更好的(非线性)装箱


poster
2019-12-10, 16:49
我问的最后一个问题涉及如何通过x坐标对数据进行分箱。解决方案既简单又优雅,我很I愧,没看到。这个问题可能更难(或者我可能只是盲目)。

我从大约140000个数据点开始,将它们分成沿x轴等距分布的70个组,然后取每组的平均位置(x_avg,y_avg)并绘制它们;出现了一条漂亮的曲线。不幸的是,有两个问题。首先,边缘的填充量少于图形中心。第二,某些区域的变化要大于其他区域,因此需要更好的分辨率。

因此,我有两个具体问题和一个提出建议的一般邀请:

matlab是否有将矩阵拆分为固定数量的较小矩阵或固定大小的较小矩阵的内置方法?

是否有一种算法(或matlab函数,但我发现不太可能)来确定对目标区域进行更精细装箱所需的边界?

更笼统地说,是否有更好的方法将成千上万个数据点压缩为整洁的趋势?


回答:
听起来好像您想使用大小不同的垃圾箱,具体取决于x值的密度。我认为您仍然可以像上一篇文章的答案一样使用HISTC函数,但是您只需要赋予它不同的边缘即可。

我不知道这是否确实是您想要的,但这是一个建议:不要将x轴分为70个等距的组,而是将已排序的x数据分为70个相等的组并确定边值。我认为这段代码应该工作:

% Start by assuming x and y are vectors of data: nBins = 70; nValues = length(x); [xsort,index] = sort(x); % Sort x in ascending order ysort = y(index); % Sort y the same way as x binEdges = [xsort(1:ceil(nValues/nBins):nValues) xsort(nValues)+1]; % Bin the data and get the averages as in previous post (using ysort instead of y): [h,whichBin] = histc(xsort,binEdges); for i = 1:nBins flagBinMembers = (whichBin == i); binMembers = ysort(flagBinMembers); binMean(i) = mean(binMembers); end 这将使您的箱的大小随数据密度而变化。

更新:另一个版本...

经过几番评论后,我想到了另一个想法。使用此代码,您可以为x中相邻数据点之间的差异设置阈值(maxDelta)。任何x值与其较大的邻居之间的差值大于或等于maxDelta的值都将被强制放入其自己的bin中(所有都是由于其寂寞)。您仍然为nBins选择一个值,但是当扩展点降级到它们自己的bin时,bin的最终数量将大于此值。

% Start by assuming x and y are vectors of data: maxDelta = 10; % Or whatever suits your data set! nBins = 70; nValues = length(x); [xsort,index] = sort(x); % Sort x in ascending order ysort = y(index); % Sort y the same way as x % Create bin edges: edgeIndex = false(1,nValues); edgeIndex(1:ceil(nValues/nBins):nValues) = true; edgeIndex = edgeIndex | ([0 diff(xsort)] >= maxDelta); nBins = sum(edgeIndex); binEdges = [xsort(edgeIndex) xsort(nValues)+1]; % Bin the data and get the y averages: [h,whichBin] = histc(xsort,binEdges); for i = 1:nBins flagBinMembers = (whichBin == i); binMembers = ysort(flagBinMembers); binMean(i) = mean(binMembers); end 我在一些小的数据样本集上对此进行了测试,它似乎可以完成预期的工作。希望它也适用于您的数据集,无论它包含什么内容! =)



更多&回答... (https://stackoverflow.com/questions/427221)