获得超定线性均匀系统numpy的解决方案

时间:2016-11-06 15:56:16

标签: python numpy math linear-regression

我正在尝试使用numpy找到超定线性齐次系统(Ax = 0)的解决方案,以获得线性回归的最小线性平方解。

这是我用来生成线性回归的代码:

N = 100
x_data = np.linspace(0, N-1, N)
m = +5
n = -5
y_model = m*x_data + n
y_noise = y_model + np.random.normal(0, +5, N)

我想从 y_noise 恢复 m n 。换句话说,我想解决同构系统(Ax = 0),其中“ x =(m,n) ”和“ A = (x_data | 1 | -y_noise) “。所以我使用以下代码将非齐次(Ax = y)转换为齐次(Ax = 0):

A = np.array(np.vstack((x_data, np.ones(N), -y_noise)).T)

我知道我可以使用 np.linalg.lstsq((x_data | 1),y_noise)) 来解决非同类系统,但我想得到解决方案同质系统。我发现这个函数有问题,因为它只返回普通解决方案(x = 0):

x = np.linalg.lstsq(A, np.zeros(N))[0] => array([ 0.,  0.,  0.])

我正在考虑使用特征向量来获得解决方案,但它似乎不起作用:

A_T_A = np.dot(A.T, A)
eigen_values, eigen_vectors = np.linalg.eig(A_T_A)
# eigenvectors
[[ -2.03500000e-01   4.89890000e+00   5.31170000e+00]
 [ -3.10000000e-03   1.02230000e+00  -2.64330000e+01]
 [  1.00000000e+00   1.00000000e+00   1.00000000e+00]]
# eigenvectors normalized
[[ -0.98365497700  -4.744666220   1.0]  # (m1, n1, 1)
 [  0.00304878118   0.210130914   1.0]  # (m2, n2, 1)
 [  25.7752417000  -5.132910010   1.0]] # (m3, n3, 1)

其中没有一个适合模型参数(m = + 5,n = -5)

如何正确找到(m,n)?谢谢!

1 个答案:

答案 0 :(得分:0)

我已经找到了如何解决它,问题是我如何解释 np.linalg.eig 函数的输出,但使用特征向量的方法是正确的。尽管如此,当他说函数 np.linalg.lstsq 返回普通解决方案(x = 0)时, @Stelios 就在右边,因为矩阵A已满专栏排名。

我假设 np.linalg.eig 的输出是:

[[m1 n1  1]
 [m2 n2  1]
 [m3 n3  1]]

但事实并非如此,正确的格式是:

[[m1 m2 m3]
 [n1 n2 n3]
 [ 1  1  1]]

因此,如果我们想得到更适合模型参数(m,n)的解,我们必须选择具有最小特征值的特征向量并对其进行归一化:

A_T_A = np.dot(A_homo.T, A_homo)
eigen_values, eigen_vectors = np.linalg.eig(A_T_A)  
# eigenvectors
[[  1.96409304e-01   9.48763118e-01  -2.47531678e-01]
 [  2.94608003e-04   2.52391765e-01   9.67625088e-01]
 [ -9.80521952e-01   1.90123494e-01  -4.92925776e-02]]
# MIN eigenvector
eigen_vector_min = eigen_vectors[:, np.argmin(eigen_values)]
[-0.24753168  0.96762509 -0.04929258]
# MIN eigenvector normalized
[  5.02168258 -19.63023915   1.        ]   # [m, n, 1]

最后我们得到 m = 5.02 n = -19,6 ,这是一个非常好的近似值。