【发布时间】:2014-07-17 09:12:04
【问题描述】:
我目前正在尝试通过 MATLAB 中分散的数据来拟合一条线性线。现在这很容易使用 polyfit 函数,我可以很容易地获得我的 y= mx + c 方程。但是,我现在需要沿着数据的上边界拟合一条线,即前几个数据点。我知道这个描述是模糊的,所以让我们假设我的分散数据将是一个锥形,它的顶点在 y 轴上,它在 +x 和 +y 方向上向外和向上传播。如果你愿意,我需要在“圆锥体的上边缘”设置一条最佳拟合线。
我开发了一种算法,但速度极慢。它涉及首先通过所有数据拟合一条最佳拟合线,删除这条最佳拟合线下方的所有数据点,然后迭代直到只剩下 5% 的初始数据点。然后,最终的最佳拟合线将靠近圆锥的顶部边缘。对于 250 个数据点,这大约需要 5 秒,而我要处理超过一百万个数据点,这个算法效率太低了。
我想我的问题是:有没有一种算法可以更有效地实现我的需求?或者有没有办法让我的代码更加清晰,以消除不必要的复杂性?
这是我在 MATLAB 中的代码:
(例如)
a = [4, 5, 1, 8, 1.6, 3, 8, 9.2]; %To be used as x-axis points
b = [45, 53, 12, 76, 25, 67, 75, 98]; %To be used as y-axis points
while prod(size(a)) > (0.05*prod(size(a))) %Iterative line fitting occurs until there are less than 5% of the data points left
lobf = polyfit(a,b,1); %Line of Best Fit for current data points
alen = length(a);
for aindex = alen:-1:1 %For loop to delete all points below line of best fit
ValLoBF = lobf(1)*a(aindex) + lobf(2)
if ValLoBF > b(aindex) %if LoBF is above current point...
a(aindex) = []; %delete x coordinate...
b(aindex) = []; %and delete its corresponding y coordinate
end
end
end
【问题讨论】:
-
你能上传一张你想适合什么样的线条的图吗?我无法从描述中理解。
-
哈我已经有了一张图,因为我想让它更清楚。我无法上传图片,因为我没有代表>_
-
第一次拟合后如何将所有点“旋转”到零,然后删除低于零的任何点(或您决定的某个正值)并将它们旋转回来?通过这种方式,您可以轻松删除大部分数据。 p.s.您可以将图片上传到外部网站并放置链接。
-
这与简单地消除线下的点有何不同?甚至不需要那样旋转 2 次span>
-
实际上是在寻找Pareto Frontier?
标签: algorithm matlab curve-fitting