Закрытая форма хребта регрессии - PullRequest
0 голосов
/ 19 февраля 2019

У меня проблемы с пониманием вывода моей функции для реализации множественной регрессии.Я делаю это с нуля в Python для закрытой формы метода.Эта закрытая форма показана ниже:

Closed form

У меня есть тренировочный набор X, который 100 rows x 10 columns, и вектор y, который 100x1.

Моя попытка заключается в следующем:

def ridgeRegression(xMatrix, yVector, lambdaRange):
    wList = []

    for i in range(1, lambdaRange+1):
        lambVal = i

        # compute the inner values (X.T X + lambda I)
        xTranspose = np.transpose(x)
        xTx = xTranspose @ x
        lamb_I = lambVal * np.eye(xTx.shape[0])

        # invert inner, e.g. (inner)**(-1)
        inner_matInv = np.linalg.inv(xTx + lamb_I)

        # compute outer (X.T y)
        outer_xTy = np.dot(xTranspose, y)

        # multiply together
        w = inner_matInv @ outer_xTy
        wList.append(w)

    print(wList)

Для тестирования я запускаю его с первыми 5 лямбда-значениями.wList становится 5 numpy.arrays каждый длиной 10 (я предполагаю для 10 коэффициентов).

Вот первый из этих 5 массивов:

array([ 0.29686755,  1.48420319,  0.36388528,  0.70324668, -0.51604451,
        2.39045735,  1.45295857,  2.21437745,  0.98222546,  0.86124358])

Мой вопрос,и пояснение:

Разве не должно быть 11 коэффициентов (1 для y-точки пересечения + 10 наклонов)?Как мне получить Minimum Square Error из этого вычисления?Что будет дальше, если я захочу построить эту линию?

Мне кажется, я просто очень озадачен тем, на что я смотрю, так как я все еще работаю над своей линейной алгеброй.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019

Во-первых, я бы изменил вашу регрессию гребня так, чтобы она выглядела следующим образом:

import numpy as np
def ridgeRegression(X, y, lambdaRange):
    wList = []
    # Get normal form of `X`
    A = X.T @ X 
    # Get Identity matrix
    I = np.eye(A.shape[0])
    # Get right hand side
    c = X.T @ y
    for lambVal in range(1, lambdaRange+1):
        # Set up equations Bw = c        
        lamb_I = lambVal * I
        B = A + lamb_I
        # Solve for w
        w = np.linalg.solve(B,c)
        wList.append(w)        
    return wList

Обратите внимание, что я заменил ваш inv вызов для вычисления обратной матрицы на неявное решение.Это намного более численно устойчиво, что является важным фактором для решения проблем такого типа.

Я также извлек из цикла вычисления A=X.T@X, генерацию единичной матрицы I и вычисление вектора правой стороны c=X.T@y - они не меняются внутри цикла и относительнодорого вычислять.

Как указывалось @qwr, количество столбцов X будет определять количество имеющихся у вас коэффициентов.Вы не описали свою модель, поэтому неясно, как базовый домен, x, структурирован в X.

Традиционно можно использовать полиномиальную регрессию, в этом случае X является матрицей Вандермонда .В этом случае первый коэффициент будет связан с y-перехватом.Однако, исходя из контекста вашего вопроса, вы, похоже, интересуетесь многомерной линейной регрессией.В любом случае модель должна быть четко определена.Если это так, то возвращенные веса могут использоваться для дальнейшего анализа ваших данных.

0 голосов
/ 21 февраля 2019

Кроме того, вы не должны принимать lambVal как целое число.Он может быть небольшим (близким к 0), если целью является просто избежать числовой ошибки, когда xTx плохо обусловлен.

Я бы посоветовал вам использовать логарифмический диапазон вместо линейного, начиная с 0,001 и доходя до 100 или более, если хотите.Например, вы можете изменить свой код следующим образом:

powerMin = -3
powerMax = 3

for i in range(powerMin, powerMax):
    lambVal = 10**i
    print(lambVal)

И затем вы можете попробовать меньший диапазон или линейный диапазон, как только вы выясните, каков правильный порядок lambVal с вашими данными из перекрестныхПроверка.

0 голосов
/ 19 февраля 2019
  1. Как правило, чтобы сделать нотацию более компактной, матрица X содержит столбец единиц для перехвата, поэтому, если у вас есть p предикторов, матрица имеет размеры n на p+1,См. статью Wikipedia по линейной регрессии для примера.

  2. Чтобы вычислить MSE в выборке, используйте определение для MSE: среднее квадратов невязок .Чтобы вычислить ошибку обобщения, вам необходима перекрестная проверка.

...