【问题标题】:How to fit a convex curve to set of data points如何将凸曲线拟合到一组数据点
【发布时间】:2023-12-07 13:26:01
【问题描述】:

我有一组数据点 (x1,y1) (x2,y2) (x3,y3) 等。这些数据使得连续点的斜率大部分时间都在增加。但也有一些例外。我加载数据的软件期望斜率应该总是增加,或者换句话说,曲线应该是凸的。因此,我需要一组数据点 (x1,y1)、(x2,y2) 等,以便它删除“异常”数据点并用适当的数据点替换它们,从而导致斜率始终增加。

我打算编写一个程序(用 C# 编写)来执行此操作,但我想我会在这里发布以检查这是否是一个标准问题并且可能已经存在解决方案。

【问题讨论】:

  • 您的意思是要断言来自P2 -> P3 的斜率总是大于来自P1 -> P2 的斜率?
  • 如果 (P2, P3) 斜率不大于 (P1, P2),我想删除 P3 并将 P3 替换为某个适当的值(可能是 (P4 +P2)/2),以便使用新的 P3,坡度正在增加。
  • 哦,总有3分以上吗? (P4 或更多?)如果斜率相等(线性)怎么办?编辑:如果超过 3 个点,是否需要检查所有连续点?
  • 大约有 32 个数据点。是的。所有点都需要检查。等坡度也是例外。所以在我之前的评论中,P4 可能也必须被移除,并且 P3 和 P4 都必须被替换。例外情况很少见。即在 32 个数据点中可能是 2 或 3
  • “适合”是什么意思?您的凸概念意味着斜率总是增加是不正确的。椭圆是凸的,但它的梯度会发生变化。为了得到你上面描述的,你可以用正二次系数拟合二次最小二乘近似。该函数具有不断增加的梯度并且是凸的。凸函数定义见此链接en.wikipedia.org/wiki/Convex_function

标签: c# math curve curve-fitting


【解决方案1】:

解决问题取决于目标。您可以限制自己更改点的 Y 坐标,同时保持 X 固定。然后,一个合理的目标可能是最小化每个点的新 Y 值 Y' 和旧值 Y 之间的绝对差 ABS(Y'-Y) 的总和。 (我不知道这对你的问题是否合理,但对我来说听起来不是很不合理。)

那么问题可以建模为一个线性规划,见:

http://en.wikipedia.org/wiki/Linear_programming

有标准库可以在这种情况下找到最佳解决方案。

【讨论】: