Мне нужен способ определения локальных минимумов и максимумов в данных временных рядов с помощью Mathematica. Кажется, что это должно быть легко сделать, но становится сложно. Я разместил это на MathForum, но подумал, что, возможно, мне удастся получить дополнительные сведения здесь.
Вы можете найти статью, в которой обсуждается проблема по адресу: http://www.cs.cmu.edu/~eugene /research/full/compress-series.pdf
Я пробовал это до сих пор…
Получить и отформатировать некоторые данные:
data = FinancialData["SPY", {"May 1, 2006", "Jan. 21, 2011"}][[All, 2]];
data = data/First@data;
data = Transpose[{Range[Length@data], data}];
Определить 2 функции:
Первый метод:
findMinimaMaxima[data_, window_] := With[{k = window},
data[[k + Flatten@Position[Partition[data[[All, 2]], 2 k + 1, 1], x_List /; x[[k + 1]] < Min[Delete[x, k + 1]] || x[[k + 1]] > Max[Delete[x, k + 1]]]]]]
Теперь другой подход, хотя и не такой гибкий:
findMinimaMaxima2[data_] := data[[Accumulate@(Length[#] & /@ Split[Prepend[Sign[Rest@data[[All, 2]] - Most@data[[All, 2]]], 0]])]]
Посмотрите, что делает каждая функция. Сначала findMinimaMaxima2 []:
minmax = findMinimaMaxima2[data];
{Length@data, Length@minmax}
ListLinePlot@minmax
Это выбирает все минимумы и максимумы и приводит (в данном случае) к сжатию данных примерно на 49%, но не имеет гибкости для расширения окна.
Вы можете найти статью, в которой обсуждается проблема: http://www.cs.cmu.edu/~eugene/research/full/compress-series.pdf
Я пробовал это, поэтому far…
Получить и отформатировать некоторые данные:
data = FinancialData["SPY", {"May 1, 2006", "Jan. 21, 2011"}][[All, 2]];
data = data/First@data;
data = Transpose[{Range[Length@data], data}];
Определить 2 функции:
Первый метод:
findMinimaMaxima[data_, window_] := With[{k = window},
data[[k + Flatten@Position[Partition[data[[All, 2]], 2 k + 1, 1], x_List /; x[[k + 1]] < Min[Delete[x, k + 1]] || x[[k + 1]] > Max[Delete[x, k + 1]]]]]]
Теперь другой подход, хотя и не такой гибкий:
findMinimaMaxima2[data_] := data[[Accumulate@(Length[#] & /@ Split[Prepend[Sign[Rest@data[[All, 2]] - Most@data[[All, 2]]], 0]])]]
Посмотрите, что делает каждая функция. Сначала findMinimaMaxima2 []:
minmax = findMinimaMaxima2[data];
{Length@data, Length@minmax}
ListLinePlot@minmax
Это выбирает все минимумы и максимумы и приводит (в данном случае) к сжатию данных примерно на 49%, но не имеет гибкости для расширения окна.
Вы можете найти статью, в которой обсуждается проблема: http://www.cs.cmu.edu/~eugene/research/full/compress-series.pdf
Я пробовал это, поэтому far…
Получить и отформатировать некоторые данные:
data = FinancialData["SPY", {"May 1, 2006", "Jan. 21, 2011"}][[All, 2]];
data = data/First@data;
data = Transpose[{Range[Length@data], data}];
Определить 2 функции:
Первый метод:
findMinimaMaxima[data_, window_] := With[{k = window},
data[[k + Flatten@Position[Partition[data[[All, 2]], 2 k + 1, 1], x_List /; x[[k + 1]] < Min[Delete[x, k + 1]] || x[[k + 1]] > Max[Delete[x, k + 1]]]]]]
Теперь другой подход, хотя и не такой гибкий:
findMinimaMaxima2[data_] := data[[Accumulate@(Length[#] & /@ Split[Prepend[Sign[Rest@data[[All, 2]] - Most@data[[All, 2]]], 0]])]]
Посмотрите, что делает каждая функция. Сначала findMinimaMaxima2 []:
minmax = findMinimaMaxima2[data];
{Length@data, Length@minmax}
ListLinePlot@minmax
Это выбирает все минимумы и максимумы и приводит (в данном случае) к сжатию данных примерно на 49%, но не имеет гибкости для расширения окна. Этот другой метод работает. Окно 2 дает меньше и, возможно, более важных экстремумов:
minmax2 = findMinimaMaxima[data, 2];
{Length@data, Length@minmax2}
ListLinePlot@minmax2
Но посмотрите, что происходит, когда мы расширяем окно до 60:
minmax2 = findMinimaMaxima[data, 60];
ListLinePlot[{data, minmax2}]
Некоторые из минимумов и максимумов больше не чередуются. Применение findMinimaMaxima2 [] к выходным данным findMinimaMaxima [] дает обходной путь ...
minmax3 = findMinimaMaxima2[minmax2];
ListLinePlot[{data, minmax2, minmax3}]
, но это кажется неуклюжим способом решения проблемы.
Итак, идея использования фиксированного окна для просмотра влево и вправо не совсем делает все, что хотелось бы. Я начал думать об альтернативе, которая могла бы использовать значение диапазона R (например, процентное движение вверх или вниз), которому функция должна будет соответствовать или превышать, чтобы установить следующие минимумы или максимумы. Вот моя первая попытка:
findMinimaMaxima3[data_, R_] := Module[{d, n, positions},
d = data[[All, 2]];
n = Transpose[{data[[All, 1]], Rest@FoldList[If[(#2 <= #1 + #1*R && #2 >= #1) || (#2 >= #1 - #1* R && #2 <= #1), #1, #2] &, d[[1]], d]}];
n = Sign[Rest@n[[All, 2]] - Most@n[[All, 2]]];
positions = Flatten@Rest[Most[Position[n, Except[0]]]];
data[[positions]]
]
minmax4 = findMinimaMaxima3[data, 0.1];
ListLinePlot[{data, minmax4}]
Это тоже выигрывает от постобработки с помощью findMinimaMaxima2 []
ListLinePlot[{data, findMinimaMaxima2[minmax4]}]
Но если вы присмотритесь, вы увидите, что он пропускает крайние значения, если они выходят за пределы значения R в нескольких позициях, включая абсолютный минимум диаграммы и максимум, а также вдоль больших движений вверх и вниз. Изменение значения R показывает, что он еще больше пропускает верх и низ:
minmax4 = findMinimaMaxima3[data, 0.15];
ListLinePlot[{data, minmax4}]
Итак, Мне нужно пересмотреть. Любой может взглянуть на график данных и легко определить важные минимумы и максимумы. Кажется, сложнее найти алгоритм для этого. Окно и / или значение R кажутся важными для решения, но ни то, ни другое само по себе не кажется достаточным (по крайней мере, не в подходах выше).
Может ли кто-нибудь расширить любой из показанных подходов или предложить альтернативу идентификации важных минимумы и максимумы?
Рад пересылать блокнот со всем этим кодом и обсуждениями в нем. Дайте мне знать, если это кому-нибудь понадобится.
Спасибо,
Может ли кто-нибудь расширить какой-либо из показанных подходов или предложить альтернативу определению важных минимумов и максимумов?
С радостью отправлю блокнот со всем этим кодом и обсуждениями в нем. Дайте мне знать, если это кому-нибудь понадобится.
Спасибо,
Может ли кто-нибудь расширить какой-либо из показанных подходов или предложить альтернативу определению важных минимумов и максимумов?
С радостью отправлю блокнот со всем этим кодом и обсуждениями в нем. Дайте мне знать, если это кому-нибудь понадобится.
Спасибо, Jagra