scipy.linalg.lstsq与自定义回归函数之间的差异

时间:2018-07-11 04:37:10

标签: c# python scipy least-squares

为了计算轮廓的表面粗糙度,我首先需要计算最佳拟合平面并将其从原始轮廓中减去,以消除大范围的变形。为此,我编写了以下代码:

fdata = data.flatten()
X,Y = np.meshgrid(np.arange(0,len(data[0])),np.arange(0,len(data)))
XX = X.flatten()
YY = Y.flatten()

A = np.c_[XX,YY,np.ones(len(fdata))]
C,_,_,_ = scipy.linalg.lstsq(A,fdata)

Z = C[0]*X + C[1]*Y + C[2]

newdata = np.zeros((len(data),len(data[0])))
for i in range(0,len(data)):
    for j in range(0,len(data[0])):
        newdata[i][j] = data[i][j] - Z[i][j]

print('Sa = '+str(satest(newdata)))
print('Sq = '+str(sqtest(newdata)))
print('Sz = '+str(sztest(newdata)))

尤其是,我依靠scipy.linalg.lstsq来完成计算飞机的首当其冲的工作。但是,我正在尝试将此代码从我的Python实现迁移到C#,因此一直在尝试构建自己的自定义回归程序来代替scipy.linalg.lstsq。我首先使用Python攻击了该问题,然后再将其迁移到C#,因为我对Python编程更加熟悉。相应的代码如下,其中A是左侧矩阵,data是右侧矩阵。

xx = 0
yy = 0
xz = 0
yz = 0
xy = 0
y0 = 0
x0 = 0
z0 = 0
N = len(data)

for i in range(0,N):
    xx += A[i][0]**2
    yy += A[i][1]**2
    xz += A[i][0]*data[i]
    yz += A[i][1]*data[i]
    xy += A[i][0]*A[i][1]
    x0 += A[i][0]
    y0 += A[i][1]
    z0 += data[i]

D = (xx*yy*N+xy*y0*x0*2-yy*x0**2-xx*y0**2-N*xy**2)
a = (yy*N-y0**2)*-xz +(xy*N-x0*y0)*yz + z0*(yy*x0-xy*y0)
b = (xy*N-x0*y0)*xz-yz*(xx*N-x0**2) + z0*(xx*y0-xy*x0)
d = -xz*(xy*y0-yy*x0)+yz*(xx*y0-xy*x0)-z0*(xx*yy-xy**2)

C = [-a/D,-b/D,-d/D]
return C

我知道这可能不是最有效的实现,但确实可以做到。但是,我注意到这两种算法产生的C[2]的值存在差异。其他值也可以,但C[2]的差异约为1.5%。这听起来并不多,但可能导致最终的表面测量值相差100%。此外,与第三方专业软件相比,scipy.linalg.lstsq实现提供了正确的粗糙度结果。如果有人能指出我这两种实现之间的区别,或者如何在C#程序中实现scipy.linalg.lstsq,我将不胜感激!

0 个答案:

没有答案