arrays - 将平面拟合到二维数组

标签 arrays python-3.x regression plane

我有一个拓扑图像,我正在尝试使用 Python 执行平面减法。该图像是一个 256x256 的二维数组,其中包含 0 到 1 之间的 float32 值。

我想要做的是使用线性回归来拟合这个数据的平面,然后从原始值中减去这个平面。

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

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

最佳答案

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

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

然后需要将参数和目标展开成矩阵[m*m x 3][m*m x 1]分别。你想找到向量 theta ,这将描述所需的平面。为此,您可以使用 正规方程 :

enter image description here

为了演示该方法,我生成了一些拓扑表面。您可以在图片上看到曲面、拟合平面的曲面和减法后的曲面:

regression plane

这是代码:

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()

关于arrays - 将平面拟合到二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35005386/

相关文章:

python-3.x - 根据条件更改行值的Python for循环工作正常,但不会更改pandas数据帧上的值?

python - python 列表的子集基于同一列表的元素组,pythonically

machine-learning - 将所有特征置于与目标变量相同的范围内对性能有何影响?

R : Finding x value (predictor) for a particular y value (outcome)中的回归(物流)

Java:了解泛型数组的类型删除

c - 存储和调用动态数组中的值时出错 : program output not as expected

javascript - 无法写入 CSV 文件

C++如何在不使用排序的情况下打印大小为n的数组中的最小数字

python - Pygame 加载图像

python - Pandas : Compute a new column based on linear regression of previous row