Витяг точки даних із ковзної середньої?


15

Чи можливо витягнути точки даних із ковзних середніх даних?

Іншими словами, якщо набір даних має лише прості ковзні середні показники попередніх 30 балів, чи можливо витягнути вихідні точки даних?

Якщо так, то як?


1
Відповідь - це кваліфіковане так, але точна процедура залежить від того, як обробляється початковий сегмент даних. Якщо його просто скинути, то ви фактично втратили 15 фрагментів даних, залишивши вас невизначеною системою лінійних рівнянь. Підсумок полягає в тому, що в цілому існує багато дійсних відповідей, але ви все одно можете досягти певного прогресу, якщо для початкових 15 ковзаючих середніх значень використовуються або (а) коротші вікна (або якась така процедура), або (б) ви можете вказати додаткові обмеження на рішення (близько 15 розмірів - варто обмежень ...). У якій ситуації ви знаходитесь?
whuber

@whuber Дуже дякую за те, що дивились! У мене 2000 очок. Перша точка MA - це, швидше за все, середня кількість перших 30 оригінальних балів. Точність є другою частиною загально правильного результату, найбільш конкретно хороших здогадок у самих "останніх" моментах. Чи можете ви порекомендувати порівняно простий метод? Спасибі заздалегідь!

1
(якщо вам потрібно більше п'яти хвилин, щоб написати коментар ...). Що я хотів написати, - це те, що ви можете думати про усереднення як матричне множення. Рядки посередині матимуть 1/30 * [1 1 1 ...] перед діагоналлю. Питання в тому, як ви поводитеся з точками на межах вашого вектора для того, щоб зробити матрицю незворотною. Це можна зробити, якщо припустити, що вони є результатом усереднення за меншими елементами або ви думаєте про інші обмеження. Зауважте, що хоча інверсія матриці - це простий спосіб її зрозуміти, вона не є найбільш ефективною. Ймовірно, ви хочете використовувати FFT для цього.
fabee

Відповіді:


4

+1 до відповіді феї, яка завершена. Просто примітка для перекладу його на R на основі пакетів, які я виявив робити операції під рукою. У моєму випадку у мене були дані, що прогнозують температуру NOAA на три місяці: січень-лютий-березень, лютий-березень-квітень, березень-квітень-травень тощо, і я хотів їх розбити (приблизно) щомісячні значення, якщо вважати, що температура кожного тримісячного періоду по суті є середньою.

library (Matrix)
library (matrixcalc)

# Feb-Mar-Apr through Nov-Dec-Jan temperature forecasts:

qtemps <- c(46.0, 56.4, 65.8, 73.4, 77.4, 76.2, 69.5, 60.1, 49.5, 41.2)

# Thus I need a 10x12 matrix, which is a band matrix but with the first
# and last rows removed so that each row contains 3 1's, for three months.
# Yeah, the as.matrix and all is a bit obfuscated, but the results of
# band are not what svd.inverse wants.

a <- as.matrix (band (matrix (1, nrow=12, ncol=12), -1, 1)[-c(1, 12),])
ai <- svd.inverse (a)

mtemps <- t(qtemps) %*% t(ai) * 3

Що для мене чудово працює. Дякую @fabee

EDIT: Гаразд, зворотний переклад мого R на Python, я отримую:

from numpy import *
from numpy.linalg import *

qtemps = transpose ([[46.0, 56.4, 65.8, 73.4, 77.4, 76.2, 69.5, 60.1, 49.5, 41.2]])

a = tril (ones ((12, 12)), 2) - tril (ones ((12, 12)), -1)
a = a[0:10,:]

ai = pinv (a)

mtemps = dot (ai, qtemps) * 3

(Для налагодження цього було потрібно набагато більше часу, ніж версія R. По-перше, я не так знайомий з Python, як з R, але також тому, що R набагато більш корисний для інтерактивного використання.)


@Gracchus: Вибачте, не хлопець C ++, але ви можете знайти те, що вам потрібно, в лінійній бібліотеці алгебри Armadillo C ++ ( arma.sourceforge.net ), яка також доступна в R через пакет RcppArmadillo.
Уейн

Гаразд, подивіться, чи працює він для вас. Якщо так, ви можете вибрати мою відповідь ;-)
Уейн,

Найкраща практика FYI в Python - це абсолютний імпорт: python.org/dev/peps/pep-0008/#imports, що робить його набагато легшим для читання коду інших людей, адже ви насправді знаєте, звідки беруться функції, а не потрібно шукайте кожного, кого ви не знаєте. Бажаю, щоб було стандартно в R робити те саме.
Доведеться

Також ноутбуки Юпітера для інтерактивності Python або IPython.
словазвідки

17

xn=2000=30y=Axx

A=130(1...10...001...10...0...1...100...01...1)

3030y19702000

x1,...,x2000y1y2

x1,...,xnxyx

A3030AA

AAz=AyxyAz

2000x

реконструкція вихідного сигналу з ковзної середньої за допомогою псевдоінверси

Багато числових програм пропонують псевдоінверси (наприклад, Matlab, numpy в python тощо).

Тут буде код python для генерації сигналів з мого прикладу:

from numpy import *
from numpy.linalg import *
from matplotlib.pyplot import *
# get A and its inverse     
A = (tril(ones((2000,2000)),-1) - tril(ones((2000,2000)),-31))/30.
A = A[30:,:]
pA = pinv(A) #pseudo inverse

# get x
x = random.randn(2000) + 5
y = dot(A,x)

# reconstruct
x2 = dot(pA,y)

plot(x,label='original x')
plot(y,label='averaged x')
plot(x2,label='reconstructed x')
legend()
show()

Сподіваюся, що це допомагає.


Це чудова відповідь, але я думаю, що ви помиляєтесь, сказавши, що "це мінімізує квадратичну відстань між y та Az". Насправді y і Az - це одне і те ж. Що мінімізується, це норма z, яка добре працює на сигнали реального світу, які я пробував, але це не так добре, якщо у вашого оригінального сигналу є безліч одут.
gdelfino

Я не впевнений, чи слідкую за цим. y і Ax - те саме, але не y і Az Це правда, що це також мінімізує норму z. Я також не бачу, чому це не працює для моїх прикладів. Синя та червона лінія добре співпадають. Я щось пропускаю у вашому коментарі?
fabee

y - ковзаюче середнє значення, обчислене з вихідного сигналу x шляхом множення на A. Ця процедура дає нам сигнал z, який має однакову ковзну середню. Тому y = Az Отже, лише норма z стає мінімізованою. Якщо вихідний сигнал має велике значення норми, то процедура не дасть хороших результатів. Приклад сигналу з великим значенням норми знаходиться нижче:
gdelfino

{42.8, -33.7, 13.2, -45.6, 10.2, 35.8, -41.4, 20.253, 43.3429, -33.2735, 13.6135, -45.1067, 10.6346, 36.1352, -40.9703, 20.6616, 43.6796, -32.8966, 14.0406, -44.7001, 10.9988 , 36.4675; , 13.5468, -45.2374, 10.3787, 35.8235, -41.5161, 19.9717, 43.0658, -33.7125, 13.0321}
gdelfino

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