如何修复秩不足的线性拟合

时间:2019-04-20 17:11:36

标签: python numpy

我正在尝试使用numpy的linalg.lstsq函数将2D多项式拟合为大图像。我使用polynomial.polynomial.polyvander2d和图像中每个像素的X / Y点生成2D Vandermonde矩阵,然后将其插入具有图像数据的lstsq中。当我对大量像素执行此操作时,lstsq返回的等级小于矩阵的预期等级,并且拟合返回奇怪的结果。对于大于2的多项式,输出在整个图像上看起来很平坦,没有任何迹象表明它试图与数据匹配。

我尝试将方法应用于图像的较小部分(200x400像素),并从中获得正确的结果。我最好的猜测是,当我使用完整图像(〜250,000像素)时,9x250,000矩阵对计算机的排名似乎不足,即使不是这样。我还尝试了诸如scipy.optimizer之类的非线性优化器,有时确实会得到结果,但是经过很长一段时间,我不得不花很多精力来对参数进行正确的猜测。

这是我一直在使用的代码:

# Get the image we will fit
fitting_image = masked_images[0][200:400,100:500]

# Get the y values and determine the mask we will use
y = np.log(np.abs(fitting_image.ravel()))
mask_indices = y.mask == False
y = np.array(y[mask_indices])

# Create the grid we will use
M, N = np.mgrid[:fitting_image.shape[0], :fitting_image.shape[1]]
mm = M.ravel()[mask_indices]
nn = N.ravel()[mask_indices]

# Get the Vandermonde matrix
A = np.polynomial.polynomial.polyvander2d(mm, nn, [deg, deg])

# Perform the linear fit
x, _, rank, _ = np.linalg.lstsq(A, y, rcond=None)

我希望拟合能够识别出我给出的矩阵的完整等级,并且拟合将定性地匹配图像。

0 个答案:

没有答案