Как выбрать начальные значения для подгонки нелинейных наименьших квадратов


13

Вопрос выше говорит обо всем. По сути, мой вопрос касается общей функции подбора (может быть произвольно сложной), которая будет нелинейной по параметрам, которые я пытаюсь оценить. Как выбрать начальные значения для инициализации подбора? Я пытаюсь сделать нелинейные наименьшие квадраты. Есть ли стратегия или метод? Это изучалось? Любые ссылки? Что-нибудь кроме специальных предположений? В частности, сейчас одна из подходящих форм, с которыми я работаю, - это гауссовская плюс линейная форма с пятью параметрами, которые я пытаюсь оценить, например:

y=Ae(xBC)2+Dx+E

где (данные абсциссы) и y = log 10 (данные ординат), означающие, что в пространстве log-log мои данные выглядят как прямая линия плюс выступ, который я аппроксимирую гауссианом. У меня нет теории, нет ничего, что могло бы помочь мне в инициализации нелинейного подбора, кроме, возможно, построения графиков и глазного яблока, например, наклона линии и того, каков центр / ширина выступа. Но у меня есть более сотни таких подходов, вместо того чтобы строить графики и догадки, я бы предпочел какой-то подход, который можно автоматизировать.x=log10y=log10

Я не могу найти никаких ссылок, в библиотеке или в Интернете. Единственное, о чем я могу думать, это просто случайным образом выбрать начальные значения. MATLAB предлагает выбирать значения случайным образом из [0,1], равномерно распределенные. Итак, с каждым набором данных я запускаю произвольно инициализированное совпадение тысячу раз, а затем выбираю тот, у которого наибольшее значение ? Любые другие (лучшие) идеи?r2


Приложение № 1

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

хорошие данные log-log хорошие данные плохие данные log-log неверные данные

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

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

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

Первоначально я ожидал простой степенной закон (имеется в виду прямая линия в пространстве журнала). Когда я нарисовал все в пространстве журнала, я увидел неожиданный удар на частоте около 4,8 мГц. Удар был тщательно исследован и обнаружен в других работах, так что мы не ошиблись. Это есть физически, и другие опубликованные работы тоже упоминают об этом. Тогда я просто добавил гауссовский термин в мою линейную форму. Обратите внимание, что это соответствие должно было быть сделано в пространстве log-log (отсюда и два моих вопроса, включая этот).

Теперь, прочитав ответ Стампи Джо Пита на другой мой вопрос (вообще не связанный с этими данными) и прочитав это и это и ссылки в них (материал Clauset), я понимаю, что я не должен вписываться в log-log Космос. Так что теперь я хочу делать все в предварительно преобразованном пространстве.

Вопрос 1: Глядя на хорошие данные, я все еще думаю, что линейный плюс гауссиан в предварительно преобразованном пространстве - все еще хорошая форма. Я хотел бы услышать от других, у кого больше данных, что они думают. Гауссово + линейно разумно? Должен ли я сделать только гауссовский? Или совсем другая форма?

Вопросы 2: Каким бы ни был ответ на вопрос 1, мне все равно понадобится (скорее всего) нелинейное подгонка наименьших квадратов, поэтому мне все еще нужна помощь с инициализацией.

На данных, где мы видим два набора, мы очень сильно предпочитаем фиксировать первый удар на частоте около 4-5 мГц. Поэтому я не хочу добавлять больше гауссовских терминов, и наш гауссовский термин должен быть сосредоточен на первом выступе, который почти всегда является большим ударом. Мы хотим «больше точности» между 0,8 и 5 мГц. Мы не слишком заботимся о высоких частотах, но не хотим полностью их игнорировать. Так может быть какое-то взвешивание? Или B всегда можно инициализировать на частоте около 4,8 МГц?

fL

L=Ae(fBC)2+Df+E.
  • f
  • L
  • AA>0A
  • B
  • CCC
  • D
  • ELELf=0

Ae(B/C)2+E.

EEf=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

Первый столбец - это частоты в мГц, одинаковые в каждом наборе данных. Второй столбец - это хороший набор данных (хорошие данные на рис. 1 и 2, панель 5, красный маркер), а третий столбец - неправильный набор данных (плохие данные на рис. 3 и 4, панель 5, красный маркер).

Надеюсь, что этого достаточно, чтобы стимулировать более просвещенную дискуссию. Спасибо вам всем.


+1 за дополнительную информацию, но теперь это выглядит как новый вопрос. Кстати, если вы хотите удалить предыдущую версию сейчас, я думаю, что все будет в порядке, похоже, что вы уже раскрыли дополнительную информацию, которая у него была.
Glen_b

@Glen_b Почему это так? Почему это выглядит как новый вопрос? Что касается старого вопроса, мы все блуждаем по очкам; -D, а у старого есть два возражения, есть ли способ объединить его с этим, чтобы я тоже мог сохранить эти два голоса?
Фиксированная точка

Ну, для начала, теперь вы спрашиваете о том, что вы должны соответствовать, а не указывать, что подходит, как раньше. Есть ряд других отличий, некоторые из которых я считаю довольно значительными. Я посмотрю на изменение своего ответа, но я думаю, что этот ответ мог бы стать первоначальным вопросом и ответом, а ваши новые части, в которых вы задаете другие вопросы, могут быть новыми. Я оставлю это на ваше усмотрение пока.
Glen_b

@Glen_b Справедливо, я вычеркнул лишние вопросы. Таким образом, вопросы все еще, у меня есть некоторые данные, которые я хочу подогнать, используя линейную + гауссову форму, могу ли я лучше, чем случайная инициализация?
Фиксированная точка

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

Ответы:


10

Если бы существовала стратегия, которая была бы хорошей и общей - та, которая всегда работала, - она ​​уже была бы реализована в каждой нелинейной программе наименьших квадратов, и начальные значения не были бы проблемой.

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

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

x

yx

A

Некоторые примеры данных могут помочь - типичные случаи и сложные, если вы можете.


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

Вот некоторые данные, которые генерируются из вашей модели (значения популяции: 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, у которых значения y> 60% от оценки A, и подгоните к квадратичному
  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
|A|BA>0CA1/4A>0A<0

2
BB

6

Существует общий подход к подгонке такого рода нелинейных моделей. Он включает в себя повторную параметризацию линейных параметров со значениями зависимой переменной, например, в первом, последнем значении частоты, и хорошей точкой в ​​середине, например, в 6-й точке. затем вы можете сохранить эти параметры фиксированными и найти нелинейный параметр в первой фазе минимизации, а затем минимизировать все 5 параметров.

Мы с Шнутом выяснили это примерно в 1982 году, когда подбирали модели роста для рыб.

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

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

M

M=(exp(((x(1)B)/C)2)x(1)1exp(((x(6)B)/C)2)x(6)1exp(((x(n)B)/C)2)x(n)1)
n=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

BCBBC оцениваютсяНаконец, на этапе 3 оцениваются все параметры. На графике зеленая линия - это подгонка после фазы 1, а синяя линия - это окончательная подгонка.

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

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

         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

Я имею в виду такие модели, как vonbertalanffy, или логистические или двойные экспоненты, например. Во всех случаях модель является линейной по некоторым параметрам и нелинейной по другим. Люди обычно пытаются преобразовать их, чтобы получить более стабильные параметризации, концентрируясь на нелинейных параметрах. Однако это неправильный подход. Это линейная параметризация, которая должна быть изменена. Так, например, для логистики с четырьмя параметрами модель является линейной в верхней и нижней асимптотах, но вместо использования этих параметров следует использовать предсказанные значения для наименьшего и наибольшего индекса. вар.
Дэйв Фурнье,

@davefournier Спасибо, что ответили и указали на вашу статью. Ваша статья кажется немного трудной для понимания, но техника звучит интересно, поэтому не могу дождаться, чтобы прочитать ее.
Фиксированная точка

2

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

С другой стороны, вы можете использовать GEOGEBRA, чтобы создать функцию, используя ползунки для параметров, и поиграть с ними, чтобы получить начальные значения.

ИЛИ начальные значения из данных могут быть оценены путем наблюдения.

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

1

Для начальных значений вы можете сделать обычные наименьшие квадраты. Его наклон и точка пересечения будут начальными значениями для D и E. Самым большим остатком будет начальное значение для A. Положение самого большого остатка будет начальным значением для B. Возможно, кто-то другой может предложить начальное значение для сигмы.

Тем не менее, нелинейные наименьшие квадраты без выведения какого-либо механистического уравнения из предметных знаний - рискованное дело, а выполнение множества отдельных подгонок делает вещи еще более сомнительными. Есть ли какие-либо предметные знания за вашим предложенным уравнением? Существуют ли другие независимые переменные, которые относятся к разнице между 100 или около того отдельными подгонками? Это может помочь, если вы сможете объединить эти различия в одно уравнение, которое будет соответствовать всем данным одновременно.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.