Чи існують алгоритми для обчислення параметрів лінійної або логістичної регресії “працює”?


32

Документ "Точне обчислення дисперсії бігу" на веб- сайті http://www.johndcook.com/standard_deviation.html показує, як обчислити середнє, дисперсійне та стандартне відхилення.

Чи існують алгоритми, де параметри лінійної або логістичної регресійної моделі можуть аналогічно "динамічно" оновлюватися, коли надається кожен новий запис навчання?


1
Завдяки величезному навчальному набору або безперервному потоку введення даних, ви можете використовувати ітеративні алгоритми, такі як Stochastic Gradient Descent і захоплювати вхід невеликими партіями під час руху. Це те, про що ви питали?
andreister

1
Алгоритм пошуку RLS та його варіантів. en.wikipedia.org/wiki/Recursive_least_squares_filter
Спогад

Відповіді:


20

Коефіцієнти лінійної регресії є і .y=ax+ba=cov(x,y)/var(x)b=mean(y)amean(x)

Тому все, що вам дійсно потрібно, - це покроковий метод для обчислення . З цього значення та дисперсії та середнього значення і можна обчислити параметри і . Як ви побачите в наведеному нижче псевдо коді, інкрементальне обчислення дуже схоже на інкрементальне обчислення . Це не повинно бути сюрпризом, тому що .cov(x,y)xyxabcov(x,y)var(x)var(x)=cov(x,x)

Ось псевдо-код, який ви, ймовірно, шукаєте:

init(): meanX = 0, meanY = 0, varX = 0, covXY = 0, n = 0

update(x,y):
n += 1
dx = x - meanX
dy = y - meanY
varX += (((n-1)/n)*dx*dx - varX)/n
covXY += (((n-1)/n)*dx*dy - covXY)/n
meanX += dx/n
meanY += dy/n

getA(): return covXY/varX
getB(): return meanY - getA()*meanX

Я знайшов це питання під час пошуку еквівалентного алгоритму, який поступово обчислює багатозмінну регресію як так щоR=(XX)1XYXR=Y+ϵ


4
Дякую за ваш внесок! Частина питання про лінійну регресію насправді є дублікатом stats.stackexchange.com/questions/6920/… , відповіді якого показують, як оновити множину лінійну регресійну модель. Ця нитка може стояти через те, що частина питання логістичної регресії питання не залежить. Насправді навіть логістична частина копіюється на stats.stackexchange.com/questions/59174/… .
whuber

1
Я вважав, що ця відповідь буде корисною, враховуючи текст посилання, наведений у запитанні. Дякую за посилання Однак це не те, що я шукаю. Мій випадок використання, мабуть, особливий.
chmike

3
Я вважаю, що це може бути корисним та унікальним у наданні робочого коду.
whuber

Чи можу я запитати вас, чому ви дозволяєте dx * dy разів (n-1) / n?
FavorMylikes

Чи можете ви покращити код для обчислення р-значення?
Натан

12

Для ваших двох конкретних прикладів:

Лінійна регресія У статті "Онлайн-лінійна регресія та її застосування до моделювання навчального підкріплення" Олександра Стреля та Майкла Літтмана описаний алгоритм під назвою "Лінійна регресія KWIK" (див. Алгоритм 1), який забезпечує наближення до рішення лінійної регресії за допомогою поступових оновлень . Зауважте, що це не є регульованим (тобто це не Регрес хребта). Я майже впевнений, що метод Strehl & Littman не може поширюватися на ці налаштування.

Логістична регресія

Ця нитка проливає деяке світло на справу. Цитування:

Навіть без обмеження регуляризації логістична регресія є нелінійною проблемою оптимізації. Вже зараз немає аналітичного рішення, що, як правило, є необхідною умовою для отримання оновленого рішення. З обмеженням регуляризації це стає обмеженою проблемою оптимізації. Це вводить цілий новий набір неаналітичних ускладнень, окрім тих, які вже мали необмежена проблема.

Однак існують і інші онлайн (або додаткові) методи регресії, які ви можете переглянути, наприклад, місцево-зважена проекційна регресія (LWPR)


Щодо логістичної регресії, я вважаю, що ви надмірно песимістичні. Логістична регресія еквівалентна обчисленню ймовірностей заднього класу для двокласової задачі з кожним класом Гаусса, розподіленим, з різними засобами та спільною коваріацією. MLE для коваріації - це лише зважена сума коваріацій за один клас, тому достатньою статистикою є лише кількість класів, сума та сума квадратів. Очевидно, що легко оновити точне оновлення, використовуючи достатню статистику.
Роберт Дод'є

3
@RobertDodier Ви описали лінійний дискримінантний аналіз, а не логістичну регресію. Останній абзац вступного розділу тут з'ясовує взаємозв'язок.
ахфосс

@ahfoss Навіть якщо дані по класу зазвичай не розподіляються, все одно можна побудувати модель, еквівалентну логістичній регресії через коваріації по класу.
Роберт Дод'є

1
@RobertDodier Що таке еквівалентна модель? Ви, здається, маєте на увазі, що очевидне рішення суттєво важкої проблеми є очевидним. Ваше рішення або блискучіше, ніж ви розумієте, або набагато менше.
ахфосс

11

Як загальний принцип:

0) ви ведете достатню статистику та поточні оцінки ML

1) отримуючи нові дані, оновлюйте достатню статистику та кошториси

2) Якщо у вас немає достатньої статистики, вам потрібно буде використовувати всі дані.

3) Зазвичай у вас немає рішень закритої форми; використовувати попередні MLE як вихідну точку, скористайтеся зручним методом оптимізації, щоб знайти звідти новий оптимум. Можливо, вам доведеться трохи експериментувати, щоб знайти, які підходи дають найкращі компроміси для ваших конкретних випадків проблеми.

Якщо ваша проблема має особливу структуру, ви, ймовірно, можете її використовувати.

Кілька потенційних посилань, які можуть або не мають певного значення:

McMahan, HB та M. Streeter (2012),
Відкрита проблема: кращі межі для інтернет-логістичної регресії ,
JMLR: Практикуми семінарів та конференцій , т. 23, 44.1–44.3

Penny, WD та SJ Roberts (1999),
Динамічна логістична регресія ,
Матеріали IJCNN '99


Я погоджуюся з ідеєю зберігати достатню кількість статистичних даних (якщо вони існують для проблеми), але чи відсутність достатньої статистики не робить інші речі непотрібними? Якщо у вас є достатня статистика, ви можете обчислити оновлені параметри точно так, як якщо б ви використовували весь набір даних. Немає необхідності враховувати поточні параметри і не потрібно експериментувати з методами оптимізації.
Роберт Дод'є

2
Важливо зазначити, що наявність достатньої статистики не означає, що ви маєте рішення для рівнянь.
Glen_b -Встановіть Моніку

8

Додаючи до відповіді tdc, невідомі методи обчислення точних оцінок коефіцієнтів в будь-який момент часу з просто постійним часом на ітерацію. Однак є деякі альтернативи, які є розумними та цікавими.

Перша модель, на яку слід звернути увагу - це налаштування онлайн-навчання . У цьому налаштуванні світ спочатку оголошує значення x, ваш алгоритм прогнозує значення y, світ оголошує справжнє значення y ', а ваш алгоритм зазнає втрати l (y, y'). Для цієї установки відомо, що прості алгоритми (градієнтне спуску та експонентний градієнт, серед інших) досягають підлінійного жалю. Це означає, що оскільки ви бачите більше прикладів, кількість зайвих помилок, які робить ваш алгоритм (у порівнянні з найкращим лінійним прогноктором), не зростає з кількістю прикладів. Це працює навіть у змагальних налаштуваннях. Існує хороший документ, що пояснює одну популярну стратегію доведення цих меж жалю. Корисні також лекційні записи Шая Шалєва-Шварца .

Існує розширення онлайн-налаштування навчання, яке називається бандітським налаштуванням, де алгоритму присвоєно лише число, яке відображає, наскільки воно було неправильним (і немає вказівника на правильну відповідь). Вражає, що багато результатів навчання в Інтернеті переносяться на цю установку, за винятком того, що тут змушені досліджувати, а також експлуатувати, що призводить до всіляких цікавих проблем.


6

Інші відповіді вказують на світ машинного навчання, і це, безумовно, одне місце, де ця проблема була вирішена.

Однак іншим підходом, який може краще відповідати вашим потребам, є використання QR-факторизації із оновленнями низького рангу. Підходи до цього та його використання для вирішення найменших задач у квадраті наведено у:

Оновлення QR-факторизації та задачі з найменшими квадратами за допомогою Hammerling та Lucas.


5

Ви можете використовувати для цього якийсь стандартний пакет фільтрів Kalman в R - sspir, dlm, kfas тощо. Я вважаю, що KF є значно розвиненішою сферою, ніж онлайн-навчання, тому це може бути більш практичним. Ви можете використовувати модель щоб дозволити вашим коефіцієнтам регресії повільно змінюватися з часом, і KF буде переоцінювати їх на кожному крок (з постійною витратою часу) на основі останніх даних. Крім того, ви можете встановити їх постійними і KF все одно буде переоцінювати їх на кожному кроці, але на цей раз, припускаючи, що вони постійні і просто включають нові спостережувані дані для отримання кращих і кращих оцінок однакових коефіцієнтів значення.β t = β t - 1

yt=βtxt+εt,βt=βt1+ηt
βt=βt1

Ви можете сформулювати подібну модель для логістичної регресії, оскільки це буде нелінійно, вам потрібно буде використовувати нелінійний метод фільтрації з вищевказаних пакетів - EKF або UKF.

yt=logit(βtxt+εt),βt=βt1+ηt

2

Це потрібно додати до відповіді @chmike.

Цей метод схожий на онлайн-алгоритм BP Welford для стандартного відхилення, який також обчислює середнє значення. Джон Кук дає хороше пояснення тут . Тоні Фінч у 2009 році пропонує метод експоненціальної ковзної середньої величини та стандартного відхилення:

diff := x – mean 
incr := alpha * diff 
mean := mean + incr 
variance := (1 - alpha) * (variance + diff * incr)

Зазирнувши в попередньо опубліковану відповідь і розширивши її, щоб включити експоненціальне вікно, що рухається:

init(): 
    meanX = 0, meanY = 0, varX = 0, covXY = 0, n = 0,
    meanXY = 0, varY = 0, desiredAlpha=0.01 #additional variables for correlation

update(x,y):
    n += 1
    alpha=max(desiredAlpha,1/n) #to handle initial conditions

    dx = x - meanX
    dy = y - meanY
    dxy = (x*y) - meanXY #needed for cor

    varX += ((1-alpha)*dx*dx - varX)*alpha
    varY += ((1-alpha)*dy*dy - varY)*alpha #needed for corXY
    covXY += ((1-alpha)*dx*dy - covXY)*alpha

    #alternate method: varX = (1-alpha)*(varX+dx*dx*alpha)
    #alternate method: varY = (1-alpha)*(varY+dy*dy*alpha) #needed for corXY
    #alternate method: covXY = (1-alpha)*(covXY+dx*dy*alpha)

    meanX += dx * alpha
    meanY += dy * alpha
    meanXY += dxy  * alpha

getA(): return covXY/varX
getB(): return meanY - getA()*meanX
corXY(): return (meanXY - meanX * meanY) / ( sqrt(varX) * sqrt(varY) )

У наведеному вище "коді" бажаний Альфа міг би бути встановлений на 0, і якщо так, код діятиме без експоненціального зважування. Можна запропонувати встановити бажанийAlpha на 1 / бажанийWindowSize, як запропоновано Modified_moving_average для розміру вікна, що рухається.

Побічне запитання: про альтернативні розрахунки вище, будь-які коментарі щодо того, що краще з точки зору точності?

Список літератури:

chmike (2013) https://stats.stackexchange.com/a/79845/70282

Кук, Джон (другий) Точне обчислення дисперсії, що працює, http://www.johndcook.com/blog/standard_deviation/

Фінч, Тоні. (2009) Інкрементний розрахунок середньозваженої середньої величини та дисперсії. https://fanf2.user.srcf.net/hermes/doc/antiforgery/stats.pdf

Вікіпедія. (й) Інтернет-алгоритм Велфорда https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Online_algorithm

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.