线性规划下的直线拟合

前言

        在我上一篇博文《散点图下基于切比雪夫(Chebyshev)近似准则拟合直线》,介绍了如何用三点极小化最大残差的方法去拟合直线。该直线满足切比雪夫准则。本篇文章主要介绍如何用线性规划去拟合直线,该结果也满足切比雪夫准则,同时也证明了我上一篇博文的正确性。

线性规划

        给定散点对(X,Y),假设拟合的直线y_{i}=ax_{i}+b , i=0,1,2,3,... 满足切比雪夫准则。则存在最大残差r_{max}>0,使得r_{max}-\left | y_{i}-ax_{i}-b \right |\geqslant 0。于是每一个点,我们有方程组:

                \left\{\begin{matrix} r_{max}-(y_{i}-ax_{i}-b)\geqslant 0\\ r_{max}+(y_{i}-ax_{i}-b)\geqslant 0 \end{matrix}\right.

给它取个负号,即两边同时乘以-1:

                \left\{\begin{matrix} y_{i}-ax_{i}-b-r_{max}\leqslant 0\\ ax_{i}-r_{max}-y_{i}+b\leqslant 0 \end{matrix}\right.

很明显,有多少个点,就有多少的方程组对。这是个线性规划问题,而我们的目的就是要求此线性规划使得Min(r_{max})成立的解。

松弛变量

        此时,我们给方程组加上一个松弛变量,让其不等式变成等式:

                \left\{\begin{matrix} y_{i}-ax_{i}-b-r_{max}+z_{i0}=0\\ ax_{i}-r_{max}-y_{i}+b+z_{i1}=0 \end{matrix}\right.

其中z_{i0},z_{i1}就是松弛变量(relaxation variables),且z_{i0},z_{i1}\geqslant 0

现在,我们有变量(a,b,r_{max}),(z_{00},z_{01},z_{10},z_{11},...z_{n0},z_{n1})。其中(a,b,r_{max})是我们要求的。同时,它也说明,我们至少需要三个方程来求解。

代数法求解

        

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,可以使用OpenCV库的HoughLinesP函数来进行线性回归拟合直线。 以下是一个示例代码: ``` import org.opencv.core.*; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; public class HoughLinesPExample { public static void main(String[] args) { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); // 读取图像 Mat src = Imgcodecs.imread("path/to/image.jpg"); // 转换为灰度图像 Mat gray = new Mat(); Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY); // 边缘检测 Mat edges = new Mat(); Imgproc.Canny(gray, edges, 50, 150); // 进行线性回归拟合直线 Mat lines = new Mat(); Imgproc.HoughLinesP(edges, lines, 1, Math.PI / 180, 50, 50, 10); // 绘制直线 Mat result = src.clone(); for (int i = 0; i < lines.rows(); i++) { double[] line = lines.get(i, 0); Point pt1 = new Point(line[0], line[1]); Point pt2 = new Point(line[2], line[3]); Imgproc.line(result, pt1, pt2, new Scalar(0, 0, 255), 3); } // 保存结果图像 Imgcodecs.imwrite("path/to/result.jpg", result); } } ``` 在代码中,首先使用`Imgcodecs.imread`函数读取待处理的图像,然后将其转换为灰度图像,再进行边缘检测。接着使用`Imgproc.HoughLinesP`函数进行线性回归拟合直线,其中`threshold`参数表示直线的最小长度,`minLineLength`参数表示直线的最小长度,`maxLineGap`参数表示两条直线之间最大的间隙。最后,使用`Imgproc.line`函数绘制直线,并使用`Imgcodecs.imwrite`函数保存结果图像。 注意,在运行代码之前,需要先下载并安装OpenCV库,并将其添加到项目的类路径中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值