仿造各種 Python 機器學習類別的風格,建立一個 class,並且實作 fit() 與 predict() 方法。
1 | class LeastSq3D: |
pts 就是所有的三維點,pts[0] 就是第一個點,pts[0][0] 就是第一個點的 x 座標,依此類推。
fit()
就是重現上一篇文章以 Ax=b 求解的過程。
首先初始化矩陣 A
1 | A = [ |
1 | m11 = np.sum(pts[:, 0] * pts[:, 0]) |
再來初始化矩陣 b
1 | b = [xz, yz, z] |
1 | b1 = np.sum(pts[:, 0] * pts[:, 2]) |
最後求A的反矩陣,並且乘上 b,就是最後的結果,把係數 A,B,C 存在 self.coeficient
。
1 | self.coeficient = np.dot(np.linalg.inv(A), b) |
NumPy 還提供了更強的實現
1 | self.coeficient = np.linalg.solve(A, b) |
predict()
這個部分最簡單,就是把所有的點帶入方程式,得到預測的 z 座標。
就只是寫 z = Ax + By + C
。
不過要注意的是,最好用向量化寫法,不要用迴圈,這樣會比較快。
1 | def predict(self, pts): |
範例
我用 Free3D 的一個人體模型來做範例。
1 | if __name__ == '__main__': |