2014-02-16 6 views
0

Почему этот код не работает? Я пытаюсь сделать многовариантную регрессию. Четыре уравнения вида:Регрессия наименьших квадратов Python qs

Ax + By + c = d 

A + 2B + C = 0.2 etc. 

A = np.array([[ 0., 1, 1.], 
    [ 1., 2, 1.], 
    [ 2., 3, 1.], 
    [ 3., 4, 1.]]) 

y = np.array([-1, 0.2, 0.9, 2.1]) 
m, c = np.linalg.lstsq(A, y)[0] 
print m, c 

Что я делаю неправильно?

+1

Что с этим не происходит? Ошибка? Плохой выход? Показать нам! – mhlester

+0

Попробуйте сами и выясните. Я дал код. nnatarr - спасибо за ответ !! – user3210796

ответ

0

Я предполагаю, что вы взяли строку m, c = np.linalg.lstsq(A, y)[0] от lstsqexample.
В этом примере решаются задачи линейной регрессии с один переменный и постоянный. В результате np.linalg.lstsq(A, y) для этой задачи возвращает четырехэлементный кортеж (array([ 1. , -0.95]), array([ 0.05]), 2, array([ 4.10003045, 1.09075677])) (первый элемент - решение, второй - остатки, третий - ранжирование матрицы коэффициентов, последний элемент - сингулярные значения матрицы коэффициентов). Итак, np.linalg.lstsq(A, y)[0] (в примере) возвращает массив с двумя элементами, которые могут быть распакованы так, как они это делают: m, c = np.linalg.lstsq(A, y)[0] (m = 1., c = -0.95).

Вы решаете регрессию с двумя переменными и постоянными. Поэтому np.linalg.lstsq(A, y)[0] будет возвращать массив с тремя элементами, и если вы хотите распаковать его так, как это было в примере вы можете сделать это следующим образом:

x1, x2, c = np.linalg.lstsq(A, y)[0] 

Но более удобный способ будет (на мой взгляд):

x, residuals, rank, s = np.linalg.lstsq(A, y) #lstsq func always return four-element tuple 

print 'solution is %s.' % str(x) 
print 'matrix A rank is %d.' % rank 
print 'residuals are %s.' % str(residuals) 
print 'singular values of A are %s.' % str(s) 

print 'first variable is %f.' % x[0] 
print 'second variable is %f.' % x[1] 
print 'constant is %f.' % x[2] 
Смежные вопросы