क्या चलती औसत डेटा से डेटा बिंदुओं को निकालना संभव है?
दूसरे शब्दों में, यदि डेटा के एक सेट में केवल पिछले 30 बिंदुओं की सरल चलती औसत है, तो क्या मूल डेटा बिंदुओं को निकालना संभव है?
यदि हां, तो कैसे?
क्या चलती औसत डेटा से डेटा बिंदुओं को निकालना संभव है?
दूसरे शब्दों में, यदि डेटा के एक सेट में केवल पिछले 30 बिंदुओं की सरल चलती औसत है, तो क्या मूल डेटा बिंदुओं को निकालना संभव है?
यदि हां, तो कैसे?
जवाबों:
+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 संस्करण की तुलना में डीबग करने में बहुत अधिक समय लेती है। पहला इसलिए कि मैं आर के साथ पाइथन से परिचित नहीं हूं, लेकिन यह भी क्योंकि आर अंतःक्रियात्मक रूप से अधिक उपयोगी है।)
मैंने उत्तर में व्हाट्सएप को डालने की कोशिश की। मान लीजिए कि आपके पास n = 2000 प्रविष्टियों के साथ एक बड़ा वेक्टर । यदि आप एक चलती औसत की गणना ℓ = 30 की खिड़की के साथ करते हैं , तो आप इसे वेक्टर मैट्रिक्स गुणन y = मैट्रिक्स के साथ वेक्टर x के एक x के रूप में लिख सकते हैं।
जिसके पास पंक्तियाँ हैं जिन्हें आप पंक्तियों के माध्यम से आगे बढ़ाते हैं मैट्रिक्स के अंत तक हिट न हो जाएं। यहां औसतन वेक्टर y में 1970 आयाम हैं। मैट्रिक्स में 1970 पंक्तियाँ और 2000 स्तंभ हैं। इसलिए, यह उलटा नहीं है।
आप चर के लिए खोज रहे हैं: आप मैट्रिक्स से परिचित नहीं हैं, तो एक रेखीय समीकरण प्रणाली के रूप में इसके बारे में सोचो जैसे कि पहले तीस पैदावार y 1 पर औसत, दूसरे तीस पैदावार y 2 पर औसत और इसी तरह।
समीकरण प्रणाली (और मैट्रिक्स) के साथ समस्या यह है कि इसमें समीकरणों की तुलना में अधिक अज्ञात हैं। इसलिए, आप अद्वितीय रूप से आपके अज्ञात पहचान नहीं कर सकते । सहज कारण यह है कि आप औसतन आयामों को ढीला करते हैं, क्योंकि x के पहले तीस आयामों को y में एक संबंधित तत्व नहीं मिलता है क्योंकि आप औसत विंडो को x के बाहर शिफ्ट नहीं कर सकते हैं ।
या, समतुल्य समीकरण प्रणाली को बनाने का एक तरीका , सॉल्वेबल है अधिक समीकरणों (या A के लिए 30 और पंक्तियों) केहै जो अतिरिक्त जानकारी प्रदान करते हैं ( A के अन्य सभी पंक्तियों के लिए रैखिक रूप से स्वतंत्र हैं)।
एक और, हो सकता है आसान, जिस तरह से Pseudoinverse उपयोग करने के लिए है की एक । यह एक वेक्टर उत्पन्न जेड = एक † y जो रूप में एक ही आयाम है x और जो संपत्ति है कि यह बीच द्विघात दूरी को कम करता है और एक जेड (देखें विकिपीडिया )।
कई संख्यात्मक कार्यक्रम छद्म-व्युत्क्रम (जैसे मतलूब, अजगर में सुन्न, आदि) पेश करते हैं।
मेरे उदाहरण से संकेत उत्पन्न करने के लिए यहां अजगर कोड होगा:
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()
उम्मीद है की वो मदद करदे।