基于您的second refernce
[]
假设你有 n 个样本 (x,y,z)
我将这 3 个术语称为 M*A=V,并定义 column 数组
X=[ x_0, x_1 .. x_n ]'
Y=[ y_0, y_1 .. y_n ]'
Z=[ z_0, z_1 .. z_n ]'
定义(n×3)矩阵XY1=[X,Y,1n]:
[[x_0,y_0,1],
XY1= [x_1,y_1,1],
...
[x_n,y_n,1]]
矩阵M可以得到为
M = XY1' * XY1
其中撇号 (') 是转置运算符, (*) 是矩阵乘积。
而数组V是
V = XY1'*Z
通过moore-penrose pseoudoinverse可以得到最小二乘解:[(M'*M)^-1 * M']
~A = [(M'*M)^-1 * M'] * V
示例代码:
import numpy as np
from mpl_toolkits import mplot3d
import matplotlib.pyplot as plt
#Input your values
A=3
B=2
C=1
#reserve memory
xy1=np.ones([n,3])
#Make random data, n ( x,y ) tuples.
n=30 #samples
xy1[:,:2]=np.random.rand(n,2)
#plane: A*x+B*y+C = z , the z coord is calculated from random x,y
z=xy1.dot (np.array([[A,B,C],]).transpose() )
#addnoise
xy1[:,:2]+=np.random.normal(scale=0.05,size=[n,2])
z+=np.random.normal(scale=0.05,size=[n,1])
#calculate M and V
M=xy1.transpose().dot(xy1)
V=xy1.transpose().dot(z)
#pseudoinverse:
Mp=np.linalg.inv(M.transpose().dot(M)).dot(M.transpose())
#Least-squares Solution
ABC= Mp.dot(V)
输出
In [24]: ABC
Out[24]:
array([[3.11395111],
[2.02909874],
[1.01340411]])