仅对数组的n个最佳值计算最小二乘

时间:2019-07-19 10:59:29

标签: python numpy scipy least-squares

我有:

print(self.L.T.shape)
print(self.M.T.shape)

(8, 3)
(8, 9082318)

self.N = np.linalg.lstsq(self.L.T, self.M.T, rcond=None)[0].T

可以正常工作并返回

(9082318, 3)

但是

我想对M执行某种排序,并且仅对M的最佳8-n值计算解。 或者忽略低于和/或高于特定值的M值。

任何有关如何做到这一点的指针将不胜感激。 谢谢。

试图准确复制this solution,但返回错误

原始工作功能,但基本上只是一行。 M是8幅经过重塑的灰度图像的堆栈。 L是8个光方向向量的堆栈。

M包含阴影,但并不总是在图像中的同一位置。 因此,我需要从计算中删除那些像素,但L必须保留其尺寸。

def _solve_l2(self):
    """
    Lambertian Photometric stereo based on least-squares
    Woodham 1980
    :return: None

    Compute surface normal : numpy array of surface normal (p \times 3)
    """
    self.N = np.linalg.lstsq(self.L.T, M.T, rcond=None)[0].T
    print(self.N.shape)
    self.N = normalize(self.N, axis=1)  # normalize to account for diffuse reflectance

这是从链接借来的代码,用于尝试解决此问题: 以前使用的L和M

    Ma = self.M.copy()
    thresh = 300
    Ma[self.M <= thresh] = 0
    Ma[self.M > thresh] = 1
    Ma = Ma.T

    self.M = self.M.T
    self.L = self.L.T
    print(self.L.shape)
    print(self.M.shape)
    print(Ma.shape)
    A = self.L  
    B = self.M
    M = Ma  #http://alexhwilliams.info/itsneuronalblog/2018/02/26/censored-lstsq/

    # else solve via tensor representation
    rhs = np.dot(A.T, M * B).T[:,:,None] # n x r x 1 tensor
    T = np.matmul(A.T[None,:,:], M.T[:,:,None] * A[None,:,:]) # n x r x r tensor
    self.N = np.squeeze(np.linalg.solve(T, rhs)).T # transpose to get r x n

返回

numpy.linalg.LinAlgError: Singular matrix

0 个答案:

没有答案