【问题标题】:MATLAB Fit a line to a histogramMATLAB 将直线拟合到直方图
【发布时间】:2014-12-06 21:30:16
【问题描述】:

我只是想知道,我将如何使用 z 计数作为权重将一条线拟合到直方图?下面显示了一个示例(尽管这篇文章只是讨论了覆盖多个图),取自Scatter plot with density in Matlab)。

我最初的想法是制作一个由密度图中的每个像素组成的数组,重复 n 次以制作散点图(n == 计数),然后做一个线性 polyfit。不过,这似乎非常多余。

【问题讨论】:

  • 如果人们可以使用您的一些代码,您将更有可能获得答案。你应该发一个How to create a Minimal, Complete, and Verifiable example
  • 当然,我可以包含代码。这不是我遇到问题的编码,请在发表评论之前仔细阅读问题。这是一个概念。我说我知道怎么做我想做的事,我只是想要一个更好的方法来做,即一个特定的功能。
  • 为了保护 Jubobs,StackOverflow 将自己标榜为代码问题 (stackoverflow.com/tour) 因此,没有代码的问题会引发更多问题。
  • 那么我必须自己解决这个问题,因为它是哞!我已将其标记为删除。一定不要问无关紧要的问题。
  • 嗯,似乎大多数问题都没有代码。也许(如此处所示:stackoverflow.com/help/on-topic),关于代码和代码工具箱的问题确实是话题。

标签: matlab curve-fitting


【解决方案1】:

另一种方法是进行加权最小二乘解。您需要每个像素的 (x,y) 位置和每个像素内的计数 n。然后,我认为您会以这种方式进行加权最小二乘:

%gather your known data...have x,y, and n all in the same order as each other
A = [x(:) ones(length(x),1)];  %here are the x values from your histogram
b = y(:);  %here are the y-values from your histogram
C = diag(n(:));  %counts from each pixel in your 2D histogram

%Define polynomial coefficients as p = [slope; y_offset]; 

%usual least-squares solution...written here for reference
% b = A*p;               %remember, p = [slope; y_offset];
% p = inv(A'*A)*(A'*b);  %remember, p = [slope; y_offset];

%We want to apply a weighting matrix, so incorporate the weighting matrix
% A' * b = A' * C * A * p;  
p = inv(A' * C * A)*(A' * b);  %remember, p = [slope; y_offset];

这个解决方案对我来说最大的不确定性是C 矩阵应该由n 还是n.^2 组成,我记不得了。如果需要,希望有人可以在 cmets 中纠正我。

【讨论】:

  • 有道理,我想我希望有一个简单的 MATLAB 函数,但是这种方法很容易实现和理解。那或者我可以使用我上面描述的方法。感谢您的有用回复。
  • 如果您尝试一下,请确保不包含 n=0 的像素。如果你这样做了,我很确定生成的C 矩阵中的零将使A' * C * A 不可逆并且解决方案将失败。
  • 它收回了。我认为即使C 的对角线中至少有 2 个非零,A'*C*A 仍将最终成为一个足够完整的 2x2 矩阵来进行反演。
【解决方案2】:

如果您有原始数据,即 (x,y) 点的集合,您只需对原始数据进行 polyfit:

p = polyfit(x(:),y(:),1);  %linear fit

这将为您提供与原始数据的最佳拟合(在最小二乘意义上),这就是您想要的。

如果您没有原始数据,而您只有 2D 直方图,您定义的方法(基本上是重新创建原始数据的复制品)将给出类似的答案,就像您在 polyfit原始数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 2013-11-19
    • 1970-01-01
    • 2017-08-24
    • 2016-06-03
    • 1970-01-01
    相关资源
    最近更新 更多