আমি মনে করি 2 টি বিষয় রয়েছে যা এই বিষয়টিতে বিভ্রান্তি যুক্ত করে:
- পরিসংখ্যান বনাম সিগন্যাল প্রসেসিং সংজ্ঞা: অন্যরা যেমন উল্লেখ করেছে, পরিসংখ্যানগুলিতে আমরা [-1,1] এ স্বয়ংক্রিয়-সম্পর্ককে স্বাভাবিক করি।
- আংশিক বনাম অ আংশিক গড় / বৈকল্পিক: যখন টাইমসারিগুলি একটি পিছনে> 0 এ পরিবর্তন হয়, তখন তাদের ওভারল্যাপের আকারটি সর্বদা <আসল দৈর্ঘ্য will আমরা কি মূল (অ-আংশিক) এর গড় এবং স্টাড ব্যবহার করি, বা সর্বদা পরিবর্তনশীল ওভারল্যাপ (আংশিক) ব্যবহার করে একটি নতুন গড় এবং স্টাডি গণনা করি কোনও তাত্পর্য তৈরি করে। (এটির জন্য সম্ভবত একটি আনুষ্ঠানিক শব্দ রয়েছে, তবে আমি আপাতত "আংশিক" ব্যবহার করব)।
আমি 5 টি ফাংশন তৈরি করেছি যা আংশিক বনাম অ আংশিক পার্থক্যের সাথে 1 ডি অ্যারের স্বতঃসংযোগ গণনা করে। কিছু পরিসংখ্যান থেকে সূত্র ব্যবহার করে, কিছু সিগন্যাল প্রক্রিয়াকরণ অর্থে ব্যবহার করে, যা এফএফটি এর মাধ্যমেও করা যেতে পারে। তবে সমস্ত ফলাফল পরিসংখ্যান সংজ্ঞাতে স্ব-সম্পর্কিত হয় , সুতরাং তারা কীভাবে একে অপরের সাথে যুক্ত রয়েছে তা চিত্রিত করে। নীচে কোড:
import numpy
import matplotlib.pyplot as plt
def autocorr1(x,lags):
'''numpy.corrcoef, partial'''
corr=[1. if l==0 else numpy.corrcoef(x[l:],x[:-l])[0][1] for l in lags]
return numpy.array(corr)
def autocorr2(x,lags):
'''manualy compute, non partial'''
mean=numpy.mean(x)
var=numpy.var(x)
xp=x-mean
corr=[1. if l==0 else numpy.sum(xp[l:]*xp[:-l])/len(x)/var for l in lags]
return numpy.array(corr)
def autocorr3(x,lags):
'''fft, pad 0s, non partial'''
n=len(x)
# pad 0s to 2n-1
ext_size=2*n-1
# nearest power of 2
fsize=2**numpy.ceil(numpy.log2(ext_size)).astype('int')
xp=x-numpy.mean(x)
var=numpy.var(x)
# do fft and ifft
cf=numpy.fft.fft(xp,fsize)
sf=cf.conjugate()*cf
corr=numpy.fft.ifft(sf).real
corr=corr/var/n
return corr[:len(lags)]
def autocorr4(x,lags):
'''fft, don't pad 0s, non partial'''
mean=x.mean()
var=numpy.var(x)
xp=x-mean
cf=numpy.fft.fft(xp)
sf=cf.conjugate()*cf
corr=numpy.fft.ifft(sf).real/var/len(x)
return corr[:len(lags)]
def autocorr5(x,lags):
'''numpy.correlate, non partial'''
mean=x.mean()
var=numpy.var(x)
xp=x-mean
corr=numpy.correlate(xp,xp,'full')[len(x)-1:]/var/len(x)
return corr[:len(lags)]
if __name__=='__main__':
y=[28,28,26,19,16,24,26,24,24,29,29,27,31,26,38,23,13,14,28,19,19,\
17,22,2,4,5,7,8,14,14,23]
y=numpy.array(y).astype('float')
lags=range(15)
fig,ax=plt.subplots()
for funcii, labelii in zip([autocorr1, autocorr2, autocorr3, autocorr4,
autocorr5], ['np.corrcoef, partial', 'manual, non-partial',
'fft, pad 0s, non-partial', 'fft, no padding, non-partial',
'np.correlate, non-partial']):
cii=funcii(y,lags)
print(labelii)
print(cii)
ax.plot(lags,cii,label=labelii)
ax.set_xlabel('lag')
ax.set_ylabel('correlation coefficient')
ax.legend()
plt.show()
এখানে আউটপুট চিত্র:
আমরা সমস্ত 5 টি লাইন দেখতে পাচ্ছি না কারণ তাদের মধ্যে 3 টি ওভারল্যাপ হয় (বেগুনি রঙে)। ওভারল্যাপগুলি সমস্ত অ আংশিক স্বয়ংক্রিয়-সম্পর্কিত lations এটি কারণ সিগন্যাল প্রক্রিয়াজাতকরণ পদ্ধতি ( np.correlate
, এফএফটি) থেকে গণনা প্রতিটি ওভারল্যাপের জন্য আলাদা গড় / স্টাডি গণনা করে না।
আরও মনে রাখবেন যে fft, no padding, non-partial
(লাল রেখা) ফলাফলটি আলাদা, কারণ এটি এফএফটি করার আগে 0 সেকেন্ডের সাথে টাইমসারিগুলিকে প্যাড করেনি, সুতরাং এটি বিজ্ঞপ্তি এফএফটি। আমি কোথাও কোথাও শিখেছি কেন, সে সম্পর্কে আমি বিশদভাবে ব্যাখ্যা করতে পারি না।