将平面拟合到2D阵列

时间:2016-01-26 01:04:23

标签: arrays python-3.x regression plane

我有一个拓扑图像,我试图使用Python执行平面减法。该图像是一个256x256二维浮点数值,介于0和1之间。

我希望做的是使用线性回归将平面拟合到此数据,然后从原始值中减去此平面。

我不确定如何实现这一目标。

我是Python语言的新手,感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

首先,您需要以正确的方式表示您的数据。

您有两个参数X1X2,用于定义拓扑图像的坐标,以及一个目标值Y,用于定义每个点的高度。对于回归分析,您需要通过添加X0来扩展参数列表,[m*m x 3]始终等于1。

然后,您需要分别将参数和目标展开为矩阵[m*m x 1]theta。您想要找到向量from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt import numpy as np m = 256 #size of the matrix X1, X2 = np.mgrid[:m, :m] fig = plt.figure() ax = fig.add_subplot(3,1,1, projection='3d') jet = plt.get_cmap('jet') #generation of the surface F = 3 i = np.minimum(X1, m-X1-1) j = np.minimum(X2, m-X2-1) H = np.exp(-.5*(np.power(i, 2) + np.power(j, 2) )/(F*F)) Y = np.real( np.fft.ifft2 (H * np.fft.fft2( np.random.randn(m, m)))) a = 0.0005; b = 0.0002; #parameters of the tilted plane Y = Y + (a*X1 + b*X2); #adding the plane Y = (Y - np.min(Y)) / (np.max(Y) - np.min(Y)) #data scaling #plot the initial topological surface ax.plot_surface(X1,X2,Y, rstride = 1, cstride = 1, cmap = jet, linewidth = 0) #Regression X = np.hstack( ( np.reshape(X1, (m*m, 1)) , np.reshape(X2, (m*m, 1)) ) ) X = np.hstack( ( np.ones((m*m, 1)) , X )) YY = np.reshape(Y, (m*m, 1)) theta = np.dot(np.dot( np.linalg.pinv(np.dot(X.transpose(), X)), X.transpose()), YY) plane = np.reshape(np.dot(X, theta), (m, m)); ax = fig.add_subplot(3,1,2, projection='3d') ax.plot_surface(X1,X2,plane) ax.plot_surface(X1,X2,Y, rstride = 1, cstride = 1, cmap = jet, linewidth = 0) #Subtraction Y_sub = Y - plane ax = fig.add_subplot(3,1,3, projection='3d') ax.plot_surface(X1,X2,Y_sub, rstride = 1, cstride = 1, cmap = jet, linewidth = 0) plt.show() ,它将描述所需的平面。为此,您可以使用 Normal Equation

enter image description here

为了演示这种方法,我生成了一些拓扑表面。你可以在图片上看到表面,带有拟合平面的表面和减去后的表面:

regression plane

以下是代码:

    spring:
      cloud:
        config:
          server:
            git:
              uri: https://stash.xxx.com.au/scm/xxx/config
              searchPaths: {application}
or
              searchPaths: {profile}
or
              searchPaths: {application}/{profile}