2012-07-10 3 views
1

Если бы это был ответ, где-то я не мог найти, не стесняйтесь, форум ударил меня.Регрессия матриц с наименьшими квадратами

Я рассчитываю рассчитать линейную регрессию наименьших квадратов из матрицы N на M и набор известных решений наземной правды в матрице N-1. Оттуда я хотел бы получить наклон, перехват и остаточную ценность каждой регрессии. Основная идея заключается в том, что я знаю, что фактическая ценность этого должна быть предсказана для каждого образца в строке N, и я хотел бы определить, какой набор прогнозируемых значений в столбце M наиболее точным, используя остатки.

Я не описываю матрицы хорошо, так вот рисунок:

(N,M) matrix with predicted values for each row N 
in each column of M... 

##NOTE: Values of M and N are not actually 4 and 3, just examples 
    4 columns in "M" 
    [1, 1.1, 0.8, 1.3] 
    [2, 1.9, 2.2, 1.7] 3 rows in "N" 
    [3, 3.1, 2.8, 3.3] 


(1,N) matrix with actual values of N 


    [1] 
    [2] Actual value of each sample N, in a single column 
    [3] 

Итак, еще раз, для ясности, я ищу, чтобы вычислить lstsq регрессии между каждой колонкой (N, M) матрицы и матрицы (1, N).

Например, регрессии между

[1] and [1] 
[2]  [2] 
[3]  [3] 

затем регрессии между

[1] and [1.1] 
[2]  [1.9] 
[3]  [3.1] 

и так далее, вывода наклона, перехват и стандартная ошибка (средний остаточный) для каждой регрессии, рассчитанной.

До сих пор в документации numpy/scipy и вокруг «сети» я нашел примеры, вычисляющие только одну колонку за раз. Я думал NumPy имел возможность вычислять регрессию на каждой колонке в комплекте со стандартным

np.linalg.lstsq(arrayA,arrayB) 

Но что возвращает ошибку

ValueError: array dimensions must agree except for d_0 

мне нужно разделить столбцы в свои массивы делать, затем вычислить по одному? Есть ли параметр или матрица, которую мне нужно использовать, чтобы numpy вычислить регрессии по каждому столбцу независимо?

Я чувствую, что должно быть проще? Я просмотрел все это, и я не могу найти никого, кто бы делал что-то подобное.

+0

Вы говорите, что ваши матрицы (N, M) (1, N). Lstsq ожидает (N, M) и (N), вы пытались использовать транспонирование arrayB?Я получаю от вас несколько другое исключение (LinAlgError: Несовместимые измерения), я использую Python2.7, с numpy1.6 – Dhara

ответ

1

Возможно, вы переключили A и b?

следующие работы для меня:

A=np.random.rand(4)+np.arange(3)[:,None] 
# A is now a (3,4) array 
b=np.arange(3) 
np.linalg.lstsq(A,b) 
0

0-я размерность arrayB должна быть такой же, как 0-й размерности Arraya (исх: официальной документации np.linalg.lstsq). Вам нужны матрицы с размерами (N, M) and (N, 1) или (N, M) and (N) вместо (N,M) and (1,N) матриц, которые вы используете сейчас.

Обратите внимание, что размерные матрицы (N, 1) и N дают одинаковые результаты - но формы массивов будут разными.

Я получаю немного другое исключение из вас, но это может быть из-за разные версии (я использую Python 2.7, Numpy 1.6 на Windows):

>>> A = np.arange(12).reshape(3, 4) 
>>> b = np.arange(3).reshape(1, 3) 

>>> np.linalg.lstsq(A,b) 
# This gives "LinAlgError: Incompatible dimensions" exception 

>>> np.linalg.lstsq(A,b.T) 
# This works, note that I am using the transpose of b here 
Смежные вопросы