Як вибрати початкові значення для нелінійних найменших квадратів


13

На запитання вище все сказано. В основному моє запитання стосується загальної функції підгонки (може бути довільно складною), яка буде нелінійною в параметрах, які я намагаюся оцінити, як вибирати початкові значення для ініціалізації пристосування? Я намагаюся робити нелінійні найменші квадрати. Чи є якась стратегія чи метод? Це було вивчено? Будь-які посилання? Щось, крім спеціальних здогадок? Зокрема, зараз одна з придатних форм, з якою я працюю, - це гауссова плюс лінійна форма з п'ятьма параметрами, які я намагаюся оцінити, як

у=Ае-(х-БС)2+Dх+Е

де х=журнал10 (дані абсцис) та у=журнал10 (дані ординати), що означає, що в просторі журналу мої дані виглядають як пряма лінія плюс удар, який я наближаю до гаусса. Я не маю ніякої теорії, нічого, що б мене наводило на те, як ініціалізувати нелінійне прилягання, за винятком, можливо, графіки та очного яблука, як нахил лінії та що таке центр / ширина шишки. Але я маю понад сто таких підходів для цього, а не для графіки та здогадок, я б вважав за краще деякий підхід, який можна автоматизувати.

Я не можу знайти посилання в бібліотеці чи в Інтернеті. Єдине, про що я можу придумати - це лише випадковим чином вибрати початкові значення. MATLAB пропонує вибрати значення випадковим чином з [0,1], рівномірно розподілених. Отже, з кожним набором даних я запускаю випадкову ініціалізовану підгонку тисячу разів, а потім вибираю ту, що має найвищий r2 ? Будь-які інші (кращі) ідеї?


Додаток №1

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

хороші дані добрі дані журналу погані дані невдалі дані журналу журналу

Кожна з шести панелей на кожному малюнку показує чотири набори даних, побудовані разом, червоний, зелений, синій та блакитний, і кожен набір даних має рівно 20 точок даних. Я намагаюся встановити кожен з них прямою лінією плюс гауссом через пошкодження, помічені в даних.

Перша цифра - це деякі хороші дані. Друга фігура - це лог-журнальний графік з тих же хороших даних з фігури перший. Третя цифра - це деякі погані дані. Четверта фігура - це лог-журнальний графік фігури три. Даних набагато більше, це лише дві підмножини. Більшість даних (приблизно 3/4) є хорошими, схожими на хороші дані, які я показав тут.

Тепер кілька коментарів, будь ласка, майте на увазі мене, оскільки це може затягнутися, але я думаю, що всі ці деталі необхідні. Я постараюся бути максимально стислим.

Я спочатку очікував простого силового закону (маючи на увазі пряму лінію в просторі журналу). Коли я побудував усе в просторі журналу, я побачив несподіваний удар на рівні приблизно 4,8 мГц. Шишка була ретельно досліджена і виявлена ​​в інших роботах, так що це не те, що ми зіпсували. Це фізично є, і інші опубліковані праці також згадують про це. Тож я просто додав термін гаусса до своєї лінійної форми. Зауважте, що цю підгонку потрібно було зробити в просторі журналу (звідси два мої питання, включаючи це).

Тепер, прочитавши відповідь Ступпі Джо Піта на інше моє питання (зовсім не пов’язане з цими даними) та прочитавши це та це та посилання на нього (речі Клаузета), я розумію, що мені не слід вписуватися в журнал журналу журналів простір. Тож тепер я хочу зробити все у попередньо перетвореному просторі.

Питання 1: Дивлячись на хороші дані, я все ще думаю, що лінійний плюс гаусс у попередньо трансформованому просторі все ще є гарною формою. Мені б хотілося почути від інших, хто має більше досвіду даних, що вони думають. Чи розумна гауссова + лінійна? Чи варто робити лише гаусса? Або зовсім інша форма?

Запитання 2: Якою б не була відповідь на питання 1, мені все одно знадобиться (швидше за все) нелінійні найменші квадрати, тому все ще потрібна допомога з ініціалізацією.

Дані, де ми бачимо два набори, ми дуже віддаємо перевагу захопленню першої шишки приблизно на 4-5 мГц. Тому я не хочу додавати більше гауссових термінів, і наш гауссовий термін повинен бути зосереджений на першому ударі, який майже завжди є більшим. Ми хочемо "більшої точності" між 0,8 і 5 МГц. Ми не надто піклуємося про більш високі частоти, але також не хочемо їх повністю ігнорувати. То, може, якесь зважування? Або B можна завжди ініціалізувати близько 4,8 МГц?

Дані абсцис є частотою в одиницях мілігерца, позначають його . Дані осі ординат коефіцієнт ми обчислюємо, позначимо його через L . Тож не перетворення журналу, а форма єfL

L=Ае-(f-БС)2+Df+Е.
  • частота, завжди позитивна.f
  • - позитивний коефіцієнт. Тож ми працюємо в першому квадранті.L
  • АА>0А
  • Б
  • СС-С
  • D
  • ЕLЕLf=0 ) було б

Ае-(Б/С)2+Е.

ЕЕf=0

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

Запитання 3: Як ви думаєте, хлопці, екстраполяція у цьому випадку? Якісь плюси / мінуси? Будь-які інші ідеї для екстраполяції? Знову ми дбаємо лише про нижчі частоти, тому екстраполюючи між 0 і 1 МГц ... іноді дуже маленькі частоти, близькі до нуля. Я знаю, що ця публікація вже запакована. Я поставив це питання тут, тому що відповіді можуть бути пов’язані, але якщо ви хочете, хлопці, я можу відокремити це питання і задати інший пізніше.

Нарешті, ось два набір вибіркових даних на запит.

0.813010000000000   0.091178000000000   0.012728000000000
1.626000000000000   0.103120000000000   0.019204000000000
2.439000000000000   0.114060000000000   0.063494000000000
3.252000000000000   0.123130000000000   0.071107000000000
4.065000000000000   0.128540000000000   0.073293000000000
4.878000000000000   0.137040000000000   0.074329000000000
5.691100000000000   0.124660000000000   0.071992000000000
6.504099999999999   0.104480000000000   0.071463000000000
7.317100000000000   0.088040000000000   0.070336000000000
8.130099999999999   0.080532000000000   0.036453000000000
8.943100000000001   0.070902000000000   0.024649000000000
9.756100000000000   0.061444000000000   0.024397000000000
10.569000000000001   0.056583000000000   0.025222000000000
11.382000000000000   0.052836000000000   0.024576000000000
12.194999999999999   0.048727000000000   0.026598000000000
13.008000000000001   0.045870000000000   0.029321000000000
13.821000000000000   0.041454000000000   0.067300000000000
14.633999999999999   0.039596000000000   0.081800000000000
15.447000000000001   0.038365000000000   0.076443000000000
16.260000000000002   0.036425000000000   0.075912000000000

Перший стовпець - це частоти в мГц, однакові у кожному наборі даних. Другий стовпець - це хороший набір даних (хороша цифра даних один і два, панель 5, червоний маркер), а третій стовпець - це неправильний набір даних (неправильна фігура даних три і чотири, панель 5, червоний маркер).

Сподіваюся, цього достатньо, щоб стимулювати ще якусь освічену дискусію. Дякую всім


+1 для додаткової інформації, але зараз це виглядає як нове запитання. До речі, якщо ви хочете видалити попередню зараз, я думаю, що це було б добре, схоже, ви зараз висвітлили додаткову інформацію, яку вона мала.
Glen_b -Встановити Моніку

@Glen_b Чому це так? Чому це виглядає як нове запитання? Що стосується старого питання, то ми всі балуємося за бали ;-D і у старого є два оновлення, будь-який спосіб злити його з цим, щоб я міг зберегти і ці два голоси?
Фіксована точка

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

@Glen_b Досить справедливо, я викреслив зайві питання. Отже, питання все ще є, у мене є деякі дані, які я хочу помістити, використовуючи лінійну + гауссову форму, чи можу я краще, ніж випадкова ініціалізація?
Фіксована точка

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

Відповіді:


10

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

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

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

х 'дають деяке уявлення), тим більше можна зробити для створення гарного вибору вихідного значення.

ух

А

Деякі зразкові дані допоможуть - типові випадки і важкі, якщо ви в змозі.


Редагувати: Ось приклад того, як можна зробити досить добре, якщо проблема не надто шумна:

Ось деякі дані, створені з вашої моделі (значення сукупності A = 1,9947, B = 10, C = 2,828, D = 0,09, E = 5):

nls дані

Стартові значення, які я зміг оцінити, - це
Стартові (As = 1.658, Bs = 10.001, Cs = 3.053, Ds = 0.0881, Es = 5.026)

Підхід цієї стартової моделі виглядає приблизно так:

nlstart

Етапи:

  1. Встановіть регресію Філла, щоб отримати приблизну оцінку D і E
  2. Відніміть відповідність регресії Теїла
  3. Використовуйте LOESS для встановлення гладкої кривої
  4. Знайдіть пік, щоб отримати приблизну оцінку A, і значення x, відповідне піку, щоб отримати приблизну оцінку B
  5. Візьміть LOESS-відповідність, у-значення якої> 60% від оцінки А як спостереження, і відповідає квадратиці
  6. Використовуйте квадратичну для оновлення оцінки B і для оцінки C
  7. Від вихідних даних відніміть оцінку гаусса
  8. Іншу регресію Філла підганяйте до цих скоригованих даних, щоб оновити оцінку D і E

У цьому випадку величини дуже підходять для початку нелінійної підгонки.

Я написав це як Rкод, але те саме можна зробити і в MATLAB.

Я думаю, що краще, ніж це можливо.

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


Edit2: Це код, який я використовував у R, якщо когось цікавить:

gausslin.start <- function(x,y) {

  theilreg <- function(x,y){
    yy <- outer(y, y, "-")
    xx <- outer(x, x, "-")
    z  <- yy / xx
    slope     <- median(z[lower.tri(z)])
    intercept <- median(y - slope * x)
    cbind(intercept=intercept,slope=slope)
  }

  tr <- theilreg(x,y1)
  abline(tr,col=4)
  Ds = tr[2]
  Es = tr[1]
  yf  <- y1-Ds*x-Es
  yfl <- loess(yf~x,span=.5)

  # assumes there are enough points that the maximum there is 'close enough' to 
  #  the true maximum

  yflf   <- yfl$fitted    
  locmax <- yflf==max(yflf)
  Bs     <- x[locmax]
  As     <- yflf[locmax]

  qs     <- yflf>.6*As
  ys     <- yfl$fitted[qs]
  xs     <- x[qs]-Bs
  lf     <- lm(ys~xs+I(xs^2))
  bets   <- lf$coefficients
  Bso    <- Bs
  Bs     <-  Bso-bets[2]/bets[3]/2
  Cs     <- sqrt(-1/bets[3])
  ystart <- As*exp(-((x-Bs)/Cs)^2)+Ds*x+Es

  y1a <- y1-As*exp(-((x-Bs)/Cs)^2)
  tr  <- theilreg(x,y1a)
  Ds  <- tr[2]
  Es  <- tr[1]
  res <- data.frame(As=As, Bs=Bs, Cs=Cs, Ds=Ds, Es=Es)
  res
}

.

# population parameters: A = 1.9947 , B = 10, C = 2.828, D = 0.09, E = 5
# generate some data
set.seed(seed=3424921)
x  <- runif(50,1,30)
y  <- dnorm(x,10,2)*10+rnorm(50,0,.2)
y1 <- y+5+x*.09 # This is the data
xo <- order(x)

starts <- gausslin.start(x,y1)
ystart <- with(starts, As*exp(-((x-Bs)/Cs)^2)+Ds*x+Es)
plot(x,y1)
lines(x[xo],ystart[xo],col=2)

3
+1. Повторення придатності тисячу разів і вибір найкращого (якщо я це правильно розумію) звучить дивно: ідея нелінійних найменших квадратів повинна сходитися, якщо модель є розумною для даних і є хороші початкові значення. Природно, що ви просите про друге. Але це песимістично означає, що вам може знадобитися вибрати різні вихідні значення для кожного пристосування.
Нік Кокс

1
@ NickCox Це зводиться до кола проблем, що виникають - якщо я згадую прямо з попередніх постів, то ОП отримує величезну кількість цих проблем, але я не пригадав, щоб побачити достатньо деталей, щоб зробити хороші пропозиції раніше, хоча я вклав трохи час розігруватися з потенційними підходами (які не дали нічого остаточного для публікації). ОП, ймовірно, має такий тип доменних знань, який може дати хороші стартові значення, які вирішують його проблеми майже завжди.
Glen_b -Встановити Моніку

1
Зовсім так. Я пропустив попередню публікацію на stats.stackexchange.com/questions/61724/…
Нік Кокс

3
|А|БА>0СА1/4А>0А<0

2
ББ

6

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

Ми з Шнуте вирішили це приблизно в 1982 році, коли підходили для росту риб.

http://www.nrcresearchpress.com/doi/abs/10.1139/f80-172

Однак читати цей документ не обов’язково. Через те, що параметри лінійні, просто необхідно встановити і вирішити 3x3 лінійну систему рівнянь, щоб використовувати стабільну параметризацію моделі.

М

М=(досвід(-((х(1)-Б)/С)2)х(1)1досвід(-((х(6)-Б)/С)2)х(6)1досвід(-((х(н)-Б)/С)2)х(н)1)
н=20
DATA_SECTION
  init_int n
  int mid
 !! mid=6;
  init_matrix data(1,n,1,3)
  vector x(1,n)
  vector y(1,n)
 !! x=column(data,1);
 !! y=column(data,3);   //use column 3
PARAMETER_SECTION
  init_number L1(3)     //(3) means estimate in phase 3
  init_number Lmid(3)
  init_number Ln(3)

  vector L(1,3)
  init_number log_B       // estimate in phase 1
  init_number log_C(2)    // estimate in phase 2 
  matrix M(1,3,1,3);
  objective_function_value f
  sdreport_vector P(1,3)
  sdreport_number B
  sdreport_number C
  vector pred(1,n);
PROCEDURE_SECTION
  L(1)=L1;
  L(2)=Lmid;
  L(3)=Ln;
  B=exp(log_B);
  C=exp(log_C);
  M(1,1)=exp(-square((x(1)-B)/C));
  M(1,2)=x(1);
  M(1,3)=1;
  M(2,1)=exp(-square((x(mid)-B)/C));
  M(2,2)=x(mid);
  M(2,3)=1;
  M(3,1)=exp(-square((x(n)-B)/C));
  M(3,2)=x(n);
  M(3,3)=1;

  P=solve(M,L);  // solve for standard parameters 
                 // P is vector corresponding to A,D,E

  pred=P(1)*exp(-square((x-B)/C))+P(2)*x+P(3);
  if (current_phase()<4)
    f+=norm2(y-pred);
  else
    f+=0.5*n*log(norm2(y-pred))  //concentrated likelihood

БСББС

введіть тут опис зображення

Для вашого випадку з поганими даними він підходить досить легко, і (звичайні) параметри оцінюють:

         estimate    std dev
A      2.0053e-01 5.8723e-02
D      1.6537e-02 4.7684e-03
E     -1.8197e-01 7.3355e-02
B      3.0609e+00 5.0197e-01
C      5.6154e+00 9.4564e-01]

Дейв, це цікаво, але воно викликає деякі питання. Що саме ви маєте на увазі під "такими нелінійними моделями"? Питання починається з посилання на "загальну функцію підгонки", але ваш опис стосується лише "загальних 5 параметрів".
whuber

Я маю на увазі такі моделі, як фонберталанфі, або логістичні чи подвійні експоненції, наприклад. У всіх випадках модель в деяких параметрах лінійна, а в інших - нелінійна. Люди, як правило, намагаються перетворити їх, щоб отримати стабільніші параметризації, концентруючись на нелінійних параметрах. Однак це неправильний підхід. Саме лінійну параметризацію слід модифікувати. Наприклад, для логістики з 4 параметрами модель лінійна у верхній та нижній асимптоті, але замість використання цих параметрів слід використовувати передбачувані значення для найменших та найбільших інд. вар.
Дейв Фурньє

@davefournier Дякуємо за відповідь та вказівку на ваш документ. Ваш документ здається трохи важким, але техніка звучить цікаво, тому не можу дочекатися його читання.
Фіксована точка

2

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

З іншого боку, ви можете використовувати GEOGEBRA для створення функції, використовуючи повзунки для параметрів, і грати з ними, щоб отримати початкові значення.

АБО вихідні значення з даних можна оцінити за допомогою спостереження.

  1. D і E походять зі схилу та перехоплення даних (ігнорування Гаусса)
  2. A - вертикальна відстань максимуму гаусса від оцінки лінії Dx + E.
  3. B - значення x максимуму гаусса
  4. C - половина видимої ширини гаусса

1

Для початкових значень ви можете виконати звичайні найменші квадрати. Його нахил та перехоплення були б початковими значеннями для D і E. Найбільшим залишковим значенням було б початкове значення для А. Положення найбільшого залишкового значення було б початковим значенням для В. Можливо, хтось інший може запропонувати початкове значення сигми.

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

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