orthogonal projection with numpy

后端 未结 3 2088
情话喂你
情话喂你 2020-12-14 22:50

I have a list of 3D-points for which I calculate a plane by numpy.linalg.lstsq - method. But Now I want to do a orthogonal projection for each point into this plane, but I c

3条回答
  •  伪装坚强ぢ
    2020-12-14 23:23

    You can simply do everything in matrices is one option.

    If you add your points as row vectors to a matrix X, and y is a vector, then the parameters vector beta for the least squares solution are:

    import numpy as np
    
    beta = np.linalg.inv(X.T.dot(X)).dot(X.T.dot(y))
    

    but there's an easier way, if we want to do projections: QR decomposition gives us an orthonormal projection matrix, as Q.T, and Q is itself the matrix of orthonormal basis vectors. So, we can first form QR, then get beta, then use Q.T to project the points.

    QR:

    Q, R = np.linalg.qr(X)
    

    beta:

    # use R to solve for beta
    # R is upper triangular, so can use triangular solver:
    beta = scipy.solve_triangular(R, Q.T.dot(y))
    

    So now we have beta, and we can project the points using Q.T very simply:

    X_proj = Q.T.dot(X)
    

    Thats it!

    If you want more information and graphical piccies and stuff, I made a whole bunch of notes, whilst doing something similar, at: https://github.com/hughperkins/selfstudy-IBP/blob/9dedfbb93f4320ac1bfef60db089ae0dba5e79f6/test_bases.ipynb

    (Edit: note that if you want to add a bias term, so the best-fit doesnt have to pass through the origin, you can simply add an additional column, with all-1s, to X, which acts as the bias term/feature)

提交回复
热议问题