चलती औसत से डेटा बिंदु निकालें?


15

क्या चलती औसत डेटा से डेटा बिंदुओं को निकालना संभव है?

दूसरे शब्दों में, यदि डेटा के एक सेट में केवल पिछले 30 बिंदुओं की सरल चलती औसत है, तो क्या मूल डेटा बिंदुओं को निकालना संभव है?

यदि हां, तो कैसे?


1
उत्तर एक योग्य हाँ है, लेकिन सटीक प्रक्रिया इस बात पर निर्भर करती है कि डेटा के प्रारंभिक खंड का इलाज कैसे किया जाता है। यदि यह बस गिरा दिया जाता है, तो आप प्रभावी रूप से 15 टुकड़ों का डेटा खो चुके हैं, जो आपको रेखीय समीकरणों की एक अनिर्धारित प्रणाली के साथ छोड़ रहा है। उत्थान यह है कि सामान्य रूप से कई मान्य उत्तर मौजूद हैं, लेकिन आप अभी भी कुछ प्रगति कर सकते हैं यदि या तो (ए) छोटी खिड़कियां (या कुछ ऐसी प्रक्रिया) का उपयोग प्रारंभिक 15 चलती औसत के लिए किया जाता है या (बी) आप अतिरिक्त बाधाओं को निर्दिष्ट कर सकते हैं समाधान (बाधाओं के बारे में 15 आयामों के लायक ...)। आप किस स्थिति में हैं?
whuber

@whuber आप को देखने के लिए बहुत बहुत धन्यवाद! मेरे 2,000 अंक हैं। पहला एमए बिंदु सबसे अधिक संभावना है जो पहले 30 मूल बिंदुओं का औसत है। सटीकता आम तौर पर सही परिणाम के लिए दूसरे स्थान पर है, सबसे विशेष रूप से सबसे "हाल" बिंदुओं पर अच्छा अनुमान है। क्या आप अपेक्षाकृत सरल विधि सुझा सकते हैं? अग्रिम में धन्यवाद!

1
(यदि आपको टिप्पणी लिखने में पाँच मिनट से अधिक समय लगता है ...)। जो मैं लिखना चाहता था वह यह है कि आप औसत को एक मैट्रिक्स गुणा के रूप में सोच सकते हैं। मध्य में पंक्तियों में विकर्ण से पहले 1/30 * [1 1 1 ...] होगा। सवाल यह है कि आप मैट्रिक्स को औंधा बनाने के लिए अपने वेक्टर की सीमाओं पर बिंदुओं के साथ कैसे व्यवहार करते हैं। आप यह मानकर कर सकते हैं कि वे कम तत्वों पर औसत का परिणाम हैं या आप अन्य बाधाओं के बारे में सोचते हैं। ध्यान दें कि जबकि मैट्रिक्स व्युत्क्रम इसे समझने का एक आसान तरीका है, यह सबसे कुशल नहीं है। आप शायद ऐसा करने के लिए एक FFT का उपयोग करना चाहते हैं।
फेबी

जवाबों:


4

+1 फेबी के उत्तर के लिए, जो पूरा हो गया है। जिन पैकेजों को मैंने हाथ से संचालन करने के लिए पाया है, उनके आधार पर आर में अनुवाद करने के लिए बस एक नोट। मेरे मामले में, मेरे पास तीन महीने के आधार पर एनओएए तापमान का पूर्वानुमान है जो डेटा था: जनवरी-फरवरी-मार्च, फरवरी-मार्च-अप्रैल, मार्च-अप्रैल-मई, आदि, और मैं इसे (लगभग) तोड़ना चाहता था मासिक मान, यह मानते हुए कि प्रत्येक तीन महीने की अवधि का तापमान अनिवार्य रूप से एक औसत है।

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

जो मेरे लिए बहुत अच्छा काम करता है। धन्यवाद @ फैबी।

संपादित करें: ठीक है, मेरे आर को पायथन में वापस कर रहा हूं, मुझे मिलता है:

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 संस्करण की तुलना में डीबग करने में बहुत अधिक समय लेती है। पहला इसलिए कि मैं आर के साथ पाइथन से परिचित नहीं हूं, लेकिन यह भी क्योंकि आर अंतःक्रियात्मक रूप से अधिक उपयोगी है।)


@Gracchus: क्षमा करें, C ++ पुरुष नहीं, लेकिन हो सकता है कि आपको आर्मडिलो C ++ लीनियर बीजगणित पुस्तकालय ( arma.sourceforge.net ) में जो चाहिए, वह R RppppAmadillo पैकेज के माध्यम से R में भी उपलब्ध हो।
वेन

ठीक है, देखें कि क्या यह आपके लिए काम करता है। यदि हां, तो आप मेरा जवाब चुन सकते हैं ;-)
वेन

पायथन में FYI सर्वोत्तम अभ्यास पूर्ण आयात करने के लिए हैं: python.org/dev/peps/pep-0008/#imports जो अन्य लोगों के कोड को पढ़ने के लिए इतना आसान बनाता है, क्योंकि आप वास्तव में जानते हैं कि फ़ंक्शन कहाँ से आने के बजाय आते हैं हर एक को देखो जिसे तुम नहीं जानते। काश ऐसा करने के लिए R में मानक होता। किसी और के कोड में हर छोटे कार्यों को देखने के लिए वास्तव में मेरे गियर पीसता है ...
शब्दभेदी

इसके अलावा, पाइथन इंटरएक्टिविटी या आईपीथॉन के लिए जुपिटर नोटबुक।
wordsforthewise

17

मैंने उत्तर में व्हाट्सएप को डालने की कोशिश की। मान लीजिए कि आपके पास n = 2000 प्रविष्टियों के साथ एक बड़ा वेक्टर । यदि आप एक चलती औसत की गणना = 30 की खिड़की के साथ करते हैं , तो आप इसे वेक्टर मैट्रिक्स गुणन y = मैट्रिक्स के साथ वेक्टर x के एक x के रूप में लिख सकते हैं।xn=2000=30y=Axx

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

जिसके पास पंक्तियाँ हैं जिन्हें आप पंक्तियों के माध्यम से आगे बढ़ाते हैं30 मैट्रिक्स के अंत तक हिट न हो जाएं। यहां औसतन वेक्टर y में 1970 आयाम हैं। मैट्रिक्स में 1970 पंक्तियाँ और 2000 स्तंभ हैं। इसलिए, यह उलटा नहीं है।30y19702000

आप चर के लिए खोज रहे हैं: आप मैट्रिक्स से परिचित नहीं हैं, तो एक रेखीय समीकरण प्रणाली के रूप में इसके बारे में सोचो जैसे कि पहले तीस पैदावार y 1 पर औसत, दूसरे तीस पैदावार y 2 पर औसत और इसी तरह।x1,...,x2000y1y2

समीकरण प्रणाली (और मैट्रिक्स) के साथ समस्या यह है कि इसमें समीकरणों की तुलना में अधिक अज्ञात हैं। इसलिए, आप अद्वितीय रूप से आपके अज्ञात पहचान नहीं कर सकते । सहज कारण यह है कि आप औसतन आयामों को ढीला करते हैं, क्योंकि x के पहले तीस आयामों को y में एक संबंधित तत्व नहीं मिलता है क्योंकि आप औसत विंडो को x के बाहर शिफ्ट नहीं कर सकते हैं ।x1,...,xnxyx

या, समतुल्य समीकरण प्रणाली को बनाने का एक तरीका , सॉल्वेबल हैA अधिक समीकरणों (या A के लिए 30 और पंक्तियों) केहै जो अतिरिक्त जानकारी प्रदान करते हैं ( A के अन्य सभी पंक्तियों के लिए रैखिक रूप से स्वतंत्र हैं)।3030AA

एक और, हो सकता है आसान, जिस तरह से Pseudoinverse उपयोग करने के लिए है की एक । यह एक वेक्टर उत्पन्न जेड = एक y जो रूप में एक ही आयाम है xAAz=Ayx और जो संपत्ति है कि यह बीच द्विघात दूरी को कम करता है और एक जेड (देखें विकिपीडिया )।yAz

2000x

छद्म बिंदु का उपयोग करके चलती औसत से मूल संकेत का पुनर्निर्माण

कई संख्यात्मक कार्यक्रम छद्म-व्युत्क्रम (जैसे मतलूब, अजगर में सुन्न, आदि) पेश करते हैं।

मेरे उदाहरण से संकेत उत्पन्न करने के लिए यहां अजगर कोड होगा:

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 के आदर्श को भी कम करता है। मैं यह भी नहीं देखता कि यह मेरे उदाहरणों के लिए काम क्यों नहीं करता है। नीले और लाल रेखा बहुत अच्छी तरह से मेल खाते हैं। क्या मुझे आपकी टिप्पणी में कुछ याद आ रहा है?
फेबी

y, मूविंग एवरेज की गणना मूल सिग्नल x से ए से गुणा करके की जाती है। यह प्रक्रिया हमें एक सिग्नल z देती है जिसमें एक ही मूविंग एवरेज y होता है। इसलिए 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.3352, -40.9703, 20.6616, 43.6796, -32.8966, 14.0406, 1440406 , 36.4675, -40.7277, 20.8823, 43.7878, -32.7415, 13.9951, -44.7947, 11.044, 36.3873, -40.7117, 20.7505, 43.8204, और -32.9399, 13.9129, -44.9549, 10.8703, 36.43, 36553, 36553, 36.43 , 13.5468, -45.2374, 10.3787, 35.8235, -41.5161, 19.9717, 43.0658, -33.7125, 13.0321}
Gdelfino

कृपया ऊपर दिए गए संकेत के लिए 8 के विंडो आकार का उपयोग करें। इस तरह फ़िल्टर्ड सिग्नल मूल सिग्नल से आकार में बहुत अलग है।
gdelfino
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.