Python 用numpy和lstsq求解三维系统
我正在尝试将x,y,z真实世界坐标转换为我自己的x,y,z虚拟世界坐标。由于在获取真实世界坐标时存在噪声,我需要使用最小二乘法。我有3个变量作为输入:r\ux,r\uy,r\uz,我需要有3个变量输出v\ux,v\uy,v\uz。我知道我需要的只是一个矩阵a所以[r_x,r_y,r_z]a=[v_x,v_y,v_z] 这是我的密码:Python 用numpy和lstsq求解三维系统,python,numpy,Python,Numpy,我正在尝试将x,y,z真实世界坐标转换为我自己的x,y,z虚拟世界坐标。由于在获取真实世界坐标时存在噪声,我需要使用最小二乘法。我有3个变量作为输入:r\ux,r\uy,r\uz,我需要有3个变量输出v\ux,v\uy,v\uz。我知道我需要的只是一个矩阵a所以[r_x,r_y,r_z]a=[v_x,v_y,v_z] 这是我的密码: >>> import numpy as np >>> x = np.array([[1,2,3],[4,5,6],[7,8,9]
>>> import numpy as np
>>> x = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> y = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> A = np.vstack([x, np.ones(len(x))]).T
>>> c, resid, rank, sigma =np.linalg.lstsq(A,y)
>>> c,m = c[0:3], c[-1]
>>> x1 = np.array([1,2,3])
>>> np.dot(x1,c) + m
array([ 1.94736842, 2.31578947, 2.68421053])
可以看出,答案是错误的,因为初始系统有唯一的解,而最小二乘法的结果是一个非常糟糕的近似值。有人知道我做错了什么吗 主要问题是,输入数据的秩不足以允许对
A
矩阵进行精确反演。考虑以下事项:
测试代码:
矩阵等级:
这个问题是[1,2,3]和[4,5,6]在同一个向量上,并且不提供任何信息,因此通过稍微混合这些对,可以增加秩。但是我们需要秩4,因为我们也得到偏移量,所以我们至少需要4个样本来得到秩4矩阵
例子
结果:
import numpy as np
def build_a(x_data):
return np.column_stack((x_data, np.ones(len(x_data))))
def lstsq(x_data, y_data):
return np.linalg.lstsq(build_a(x_data), y_data)
def show_rank(x_data):
print(lstsq(x_data, x_data)[2])
show_rank([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
show_rank([[1, 2, 3], [4, 6, 6], [7, 8, 9]])
show_rank([[1, 2, 3], [4, 6, 6], [7, 7, 9]])
show_rank([[1, 2, 3], [4, 6, 6], [7, 7, 9], [7, 8, 10]])
show_rank(np.random.rand(10, 3))
2
3
3
4
4
x = np.array([[1, 2, 3], [4, 5, 16], [17, 8, 9], [7, 8, 19]])
C, resid, rank, sigma = lstsq(x, x + 1)
c, m = C[0:3], C[-1]
x1 = np.array([1, 2, 4])
print(np.dot(x1, c) + m)
print(rank)
[ 2. 3. 5.]
4