Методы, которые мы использовали бы для подбора этого вручную (то есть исследовательского анализа данных), могут замечательно работать с такими данными.
Я хочу немного изменить параметры модели , чтобы сделать ее параметры положительными:
Y= а х - б / х--√,
Для данного , давайте предположим, что существует единственное действительное удовлетворяющее этому уравнению; назовите это или, для краткости, когда поняты.x f ( y ; a , b ) f ( y ) ( a , b )YИксе( у; а , б )е( у)( а , б )
Мы наблюдаем набор упорядоченных пар где отклоняются от независимыми случайными переменными с нулевым средним. В этом обсуждении я предполагаю, что все они имеют общую дисперсию, но расширение этих результатов (с использованием взвешенных наименьших квадратов) возможно, очевидно и легко реализуемо. Вот смоделированный пример такого набора из значений с , и общей дисперсией .x i f ( y i ; a , b ) 100 a = 0,0001 b = 0,1 σ 2 = 4(xi,yi)xif(yi;a,b)100a=0.0001b=0.1σ2=4
Это (намеренно) жесткий пример, который можно оценить по нефизическим (отрицательным) значениям и их необычайному разбросу (который обычно равен горизонтальным единицам, но может варьироваться до или по оси ). Если мы сможем получить разумное соответствие этим данным, которое приблизится к оценке используемых , и , мы действительно преуспеем.± 2 5 6 x a b σ 2x±2 56xabσ2
Поисковая примерка носит итеративный характер. Каждая стадия состоит из двух этапов: оценки (на основе данных , и предыдущих оценки и из и , из которого предыдущих предсказанных значений может быть получены для ), а затем оценить . Поскольку ошибки в x , подгонки оценивают по , а не наоборот. К первому порядку ошибок по , когда достаточно большой,б в б х я х я б х I ( у я ) х хaa^b^abx^ixibxi(yi)xx
xi≈1a(yi+b^x^i−−√).
Поэтому мы можем обновить , подгоняя эту модель наименьшими квадратами (обратите внимание, что она имеет только один параметр - наклон, - и не перехватывая) и принимая обратную величину коэффициента в качестве обновленной оценки .a^aa
Затем, когда достаточно мало, обратный квадратичный член доминирует, и мы находим (снова в первом порядке по ошибкам), чтоx
xi≈b21−2a^b^x^3/2y2i.
Еще раз, используя метод наименьших квадратов (только с углом наклона ), мы получаем обновленную оценку через корень квадратный из подогнанного наклона.бbb^
Чтобы понять, почему это работает, грубая исследовательская аппроксимация этой подгонки может быть получена путем построения графика против для меньшего . Еще лучше, потому что измеряются с ошибкой, а монотонно изменяется с , мы должны сосредоточиться на данных с большими значениями . Вот пример из нашего смоделированного набора данных, показывающий наибольшую половину красным, наименьшую половину синим и линию через начало координат, подходящую к красным точкам. 1 / y 2 i x i x i y i x i 1 / y 2 i y ixi1/y2ixixiyixi1/y2iyi
Точки приблизительно совпадают, хотя при малых значениях и наблюдается небольшая кривизна . (Обратите внимание на выбор осей: поскольку является измерением, условно нанести его на вертикальную ось.) Сосредоточив посадку на красных точках, где кривизна должна быть минимальной, мы должны получить разумную оценку . Значение указанное в заголовке, является квадратным корнем наклона этой линии: это только на % меньше истинного значения!у х б 0,096 4xyxb0.0964
На данный момент прогнозируемые значения могут быть обновлены с помощью
x^i=f(yi;a^,b^).
Повторяйте до тех пор, пока оценки не стабилизируются (что не гарантируется) или пока они не пройдут через небольшие диапазоны значений (которые по-прежнему не могут быть гарантированы).
Оказывается, что трудно оценить, если у нас нет хорошего набора очень больших значений , но который определяет вертикальную асимптоту в исходном графике (в вопросе) и является предметом вопроса - может быть точно определено, если в вертикальной асимптоте есть некоторые данные. В нашем рабочем примере итерации сходятся к (что почти вдвое больше правильного значения ) и (что близко к правильному значению ). Этот график еще раз показывает данные, на которые накладываются (а) истинныех б = 0.000196 0.0001 б = 0,1073 0,1axba^=0.0001960.0001b^=0.10730.1кривая серым цветом (пунктирная) и (b) расчетная кривая красным цветом (сплошная):
Эта подгонка настолько хороша, что трудно отличить истинную кривую от подгоночной кривой: они перекрываются почти везде. Кстати, оценочная дисперсия ошибки очень близка к истинному значению .43.734
Есть некоторые проблемы с этим подходом:
Оценки предвзяты. Смещение становится очевидным, когда набор данных небольшой, и относительно немного значений находятся близко к оси x. Подгонка систематически немного низкая.
Процедура оценки требует, чтобы метод отличал "большие" от "маленьких" значений . Я мог бы предложить исследовательские способы определения оптимальных определений, но на практике вы можете оставить их как «настраивающие» константы и изменить их, чтобы проверить чувствительность результатов. Я установил их произвольно, разделив данные на три равные группы в соответствии со значением и используя две внешние группы.у яyiyi
Процедура не будет работать для всех возможных комбинаций и или всех возможных диапазонов данных. Однако он должен работать хорошо, когда в наборе данных представлено достаточно кривой, чтобы отразить обе асимптоты: вертикальную на одном конце и наклонную на другом конце.бab
Код
Следующее написано в Mathematica .
estimate[{a_, b_, xHat_}, {x_, y_}] :=
Module[{n = Length[x], k0, k1, yLarge, xLarge, xHatLarge, ySmall,
xSmall, xHatSmall, a1, b1, xHat1, u, fr},
fr[y_, {a_, b_}] := Root[-b^2 + y^2 #1 - 2 a y #1^2 + a^2 #1^3 &, 1];
k0 = Floor[1 n/3]; k1 = Ceiling[2 n/3];(* The tuning constants *)
yLarge = y[[k1 + 1 ;;]]; xLarge = x[[k1 + 1 ;;]]; xHatLarge = xHat[[k1 + 1 ;;]];
ySmall = y[[;; k0]]; xSmall = x[[;; k0]]; xHatSmall = xHat[[;; k0]];
a1 = 1/
Last[LinearModelFit[{yLarge + b/Sqrt[xHatLarge],
xLarge}\[Transpose], u, u]["BestFitParameters"]];
b1 = Sqrt[
Last[LinearModelFit[{(1 - 2 a1 b xHatSmall^(3/2)) / ySmall^2,
xSmall}\[Transpose], u, u]["BestFitParameters"]]];
xHat1 = fr[#, {a1, b1}] & /@ y;
{a1, b1, xHat1}
];
Примените это к данным (заданным параллельными векторами x
и y
сформированными в матрицу из двух столбцов data = {x,y}
) до сходимости, начиная с оценок :a=b=0
{a, b, xHat} = NestWhile[estimate[##, data] &, {0, 0, data[[1]]},
Norm[Most[#1] - Most[#2]] >= 0.001 &, 2, 100]