线性规划下的直线拟合

前言

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

线性规划

        给定散点对(X,Y),假设拟合的直线线性规划下的直线拟合 , 线性规划下的直线拟合 满足切比雪夫准则。则存在最大残差线性规划下的直线拟合,使得线性规划下的直线拟合。于是每一个点,我们有方程组:

                线性规划下的直线拟合

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

                线性规划下的直线拟合

很明显,有多少个点,就有多少的方程组对。这是个线性规划问题,而我们的目的就是要求此线性规划使得线性规划下的直线拟合成立的解。

松弛变量

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

                线性规划下的直线拟合

其中线性规划下的直线拟合就是松弛变量(relaxation variables),且线性规划下的直线拟合

现在,我们有变量线性规划下的直线拟合。其中线性规划下的直线拟合是我们要求的。同时,它也说明,我们至少需要三个方程来求解。

代数法求解

        线性规划下的直线拟合

         如上图,假设有三个不等式方程构成如图的线性规划问题:

                线性规划下的直线拟合

这里我们引入松弛变量:

                线性规划下的直线拟合

当松弛变量取0时,我们发现满足方程的(x,y)在线性规划下的直线拟合直线上。而由上述的不等式,我们知道在上图的灰色区域的点,必定是松弛变量满足线性规划下的直线拟合。而若两两松弛变量取0,其方程组求解出来的解就是其交点。而线性规划的目的,就是求解这些交点中的最优解。

        现在,我们来求解方程组: 线性规划下的直线拟合     线性规划下的直线拟合

 的最优解使得线性规划下的直线拟合

        求解前,我们先列出前提条件:线性规划下的直线拟合

情况一:线性规划下的直线拟合

很明显,线性规划下的直线拟合存在小于0的情况。

情况二:线性规划下的直线拟合

若集合Y小于0,则线性规划下的直线拟合。否则线性规划下的直线拟合,则线性规划下的直线拟合。很明显,线性规划下的直线拟合无法完全保证大于等于0。

情况三:线性规划下的直线拟合

解方程组我们可以得到,b和线性规划下的直线拟合有无穷多个解。同理线性规划下的直线拟合也一样。

情况四:线性规划下的直线拟合

解得线性规划下的直线拟合线性规划下的直线拟合

情况五:线性规划下的直线拟合

解得线性规划下的直线拟合线性规划下的直线拟合,同时解得的其他松弛变量必须满足线性规划下的直线拟合

 情况六:线性规划下的直线拟合

解得线性规划下的直线拟合线性规划下的直线拟合, 同时解得的其他松弛变量必须满足线性规划下的直线拟合

情况七:线性规划下的直线拟合 或者线性规划下的直线拟合

解方程组我们可以得到,b和线性规划下的直线拟合有无穷多个解。

情况八:线性规划下的直线拟合

解得线性规划下的直线拟合线性规划下的直线拟合线性规划下的直线拟合, 同时解得的其他松弛变量必须满足线性规划下的直线拟合

情况九: 线性规划下的直线拟合

解得线性规划下的直线拟合线性规划下的直线拟合线性规划下的直线拟合, 同时解得的其他松弛变量必须满足线性规划下的直线拟合

要求 线性规划下的直线拟合,我们只要比对以上每种情况中的最小者。

 仔细看情况八和情况九,我们会发现,情况八和九就是我们上一篇所说的“三点极小化最大残差”。

因为线性规划下的直线拟合表明直线平行于线性规划下的直线拟合的连线。而线性规划下的直线拟合将使得b的取值使得直线经过线性规划下的直线拟合构成的三角形的中线。

现我们选取情况五六七八进行比较,贴上代码:

function [ A,B,r ] = LinearProgram( X,Y )

[m,n]=size(X);
A=0;
B=0;
r=0;

A1=0;
B1=0;
r1=10000;
for i=1:m
   for j=i+1:m
      rp=(X(i,1)*Y(j,1)-X(j,1)*Y(i,1))/(X(i,1)-X(j,1));
      ap=(Y(i,1)-((X(i,1)*Y(j,1)-X(j,1)*Y(i,1))/(X(i,1)-X(j,1))))/X(i,1);
      if rp>=0 && ap>=0
         if rp<r1
            right=1;
            for k=1:m
               z0=Y(k,1)-ap*X(k,1)-rp;
               z1=ap*X(k,1)-rp-Y(k,1);
               if z0>0 || z1>0
                   right=0;
                   break;
               end
            end
            if right==1
                r1=rp;
                A1=ap;
            end
         end
      end
   end
end
if r1~=0
   A=A1;
   B=B1;
   r=r1;
end

A2=0;
B2=0;
r2=10000;
for i=1:m
   for j=i+1:m
      rp=(X(j,1)*Y(i,1)-X(i,1)*Y(j,1))/(X(i,1)+X(j,1));
      ap=(Y(i,1)-((X(j,1)*Y(i,1)-X(i,1)*Y(j,1))/(X(i,1)+X(j,1))))/X(i,1);
      if rp>=0 && ap>=0
         if rp<r2
            right=1;
            for k=1:m
               z0=Y(k,1)-ap*X(k,1)-rp;
               z1=ap*X(k,1)-rp-Y(k,1);
               if z0>0 || z1>0
                   right=0;
                   break;
               end
            end
            if right==1
                r2=rp;
                A2=ap;
            end
         end
      end
   end
end
if r2~=0 && r>r2
   A=A2;
   B=B2;
   r=r2;
end

A3=0;
B3=0;
r3=10000;
for i=1:m
    for j=i+1:m
       for k=1:m
          if k~=j && k~=j
             ap=(Y(i,1)-Y(j,1))/(X(i,1)-X(j,1));
             rp=(Y(j,1)-Y(k,1)-ap*(X(j,1)-X(k,1)))*0.5;
             b=Y(i,1)-ap*X(i,1)-rp;
             if rp<r3
                 right=1;
                 for g=1:m
                    z0= Y(g,1)-ap*X(g,1)-rp-b;
                    z1=ap*X(g,1)-rp-Y(g,1)+b;
                    if z0>0 || z1>0
                        right=0;
                        break;
                    end
                 end
                 if right==1
                     A3=ap;
                     B3=b;
                     r3=rp;
                 end
             end
          end
       end
    end
end
if r3~=0 && r>r3
   A=A3;
   B=B3;
   r=r3;
end

A4=0;
B4=0;
r4=10000;
for i=1:m
    for j=i+1:m
       for k=1:m
          if k~=j && k~=j
             ap=(Y(i,1)-Y(j,1))/(X(i,1)-X(j,1));
             rp=(ap*(X(j,1)-X(k,1))-(Y(j,1)-Y(k,1)))*0.5;
             b=rp-ap*X(i,1)+Y(i,1);
             if rp<r4
                 right=1;
                 for g=1:m
                    z0= Y(g,1)-ap*X(g,1)-rp-b;
                    z1=ap*X(g,1)-rp-Y(g,1)+b;
                    if z0>0 || z1>0
                        right=0;
                        break;
                    end
                 end
                 if right==1
                     A4=ap;
                     B4=b;
                     r4=rp;
                 end
             end
          end
       end
    end
end
if r4~=0 && r>r4
   A=A4;
   B=B4;
   r=r4;
end


end

线性规划下的直线拟合

 线性规划下的直线拟合

 第一张图为上篇文章拟合的结果,第二张为以上算法拟合的结果。

上一篇:webdriver xpath frame alert window


下一篇:阿里云的海外服务器地域及所在城市国家对照表