gpt4 book ai didi

python - 使用 numpy 和 lstsq 求解 3 维系统

转载 作者:太空宇宙 更新时间:2023-11-03 15:07:53 27 4
gpt4 key购买 nike

我正在尝试将 x,y,z 现实世界坐标转换为我自己的 x,y,z 虚拟世界坐标。由于获取现实世界坐标时存在噪音,我需要使用最小二乘法。我有 3 个变量作为输入:r_x,r_y,r_z,我需要有 3 个变量输出v_x, v_y, v_z。我知道我需要的只是一个矩阵 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]])
>>> 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 矩阵的精确反转。考虑以下因素:

测试代码:

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

这个问题是 [1, 2, 3] 和 [4, 5, 6] 在同一个向量上,并且不提供更多信息,因此通过稍微混合这些对可以提高排名。但我们需要 4 阶矩阵,因为我们还要获取偏移量,因此我们至少需要 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

关于python - 使用 numpy 和 lstsq 求解 3 维系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44477851/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com