Saya perlu melakukan korelasi otomatis dari satu set angka, yang seperti yang saya pahami itu hanya korelasi dari himpunan itu sendiri.
Saya sudah mencobanya menggunakan fungsi korelasi numpy, tetapi saya tidak percaya hasilnya, karena hampir selalu memberikan vektor di mana angka pertama bukan yang terbesar, seperti yang seharusnya.
Jadi, pertanyaan ini sebenarnya adalah dua pertanyaan:
- Apa sebenarnya yang
numpy.correlate
dilakukannya? - Bagaimana saya bisa menggunakannya (atau yang lainnya) untuk melakukan korelasi otomatis?
Jawaban:
Untuk menjawab pertanyaan pertama Anda,
numpy.correlate(a, v, mode)
lakukan konvolusia
dengan kebalikan dariv
dan memberikan hasil dipotong oleh mode yang ditentukan. The definisi lilit , C (t) = Σ -∞ <i <∞ sebuah i v t + i mana -∞ <t <∞, memungkinkan untuk hasil dari -∞ hingga ∞, tetapi Anda jelas tidak bisa menyimpan panjang tak terhingga Himpunan. Jadi itu harus dipotong, dan di situlah mode masuk Ada 3 mode berbeda: penuh, sama, & valid:t
tempata
danv
memiliki beberapa tumpang tindih.a
atauv
).a
danv
benar - benar tumpang tindih satu sama lain. The dokumentasi untuknumpy.convolve
memberikan detail lebih lanjut tentang mode.Untuk pertanyaan kedua Anda, menurut saya
numpy.correlate
adalah memberi Anda autokorelasi, itu hanya memberi Anda sedikit lebih banyak juga. Autokorelasi digunakan untuk menemukan seberapa mirip suatu sinyal, atau fungsinya, dengan dirinya sendiri pada perbedaan waktu tertentu. Pada perbedaan waktu 0, korelasi otomatis harus menjadi yang tertinggi karena sinyalnya identik dengan dirinya sendiri, jadi Anda berharap bahwa elemen pertama dalam larik hasil autokorelasi akan menjadi yang terbesar. Namun, korelasi tidak dimulai pada perbedaan waktu 0. Ini dimulai pada perbedaan waktu negatif, mendekati 0, dan kemudian menjadi positif. Artinya, Anda mengharapkan:autokorelasi (a) = ∑ -∞ <i <∞ a i v t + i dimana 0 <= t <∞
Tapi yang Anda dapatkan adalah:
autokorelasi (a) = ∑ -∞ <i <∞ a i v t + i dimana -∞ <t <∞
Yang perlu Anda lakukan adalah mengambil separuh terakhir dari hasil korelasi Anda, dan itu harus menjadi autokorelasi yang Anda cari. Fungsi python sederhana untuk melakukan itu adalah:
Anda tentu saja memerlukan pemeriksaan kesalahan untuk memastikan bahwa
x
itu sebenarnya adalah larik 1-d. Juga, penjelasan ini mungkin bukan yang paling teliti secara matematis. Saya telah membahas ketidakterbatasan karena definisi konvolusi menggunakannya, tetapi itu tidak selalu berlaku untuk autokorelasi. Jadi, porsi teoritis dari penjelasan ini mungkin sedikit miring, tapi semoga hasil praktisnya bermanfaat. Halaman - halaman tentang autokorelasi ini cukup membantu, dan dapat memberi Anda latar belakang teoretis yang jauh lebih baik jika Anda tidak keberatan mengarungi notasi dan konsep yang berat.sumber
return numpy.correlate(x, x, mode='same')
np.correlate(x,x,mode='full')[len(x)//2:] != np.correlate(x,x,mode='same')
. Misalnya,x = [1,2,3,1,2]; np.correlate(x,x,mode='full');
{>>> array([ 2, 5, 11, 13, 19, 13, 11, 5, 2])
}np.correlate(x,x,mode='same');
{>>> array([11, 13, 19, 13, 11])
}. Yang benar adalah:np.correlate(x,x,mode='full')[len(x)-1:];
{>>> array([19, 13, 11, 5, 2])
} lihat item pertama adalah yang terbesar .[len(x)-1:]
dimulai dari 0-lag. Karenafull
mode memberikan ukuran hasil2*len(x)-1
, A.Levy[result.size/2:]
sama dengan[len(x)-1:]
. Lebih baik membuatnya menjadi int, seperti[result.size//2:]
.Korelasi otomatis hadir dalam dua versi: statistik dan konvolusi. Keduanya melakukan hal yang sama, kecuali untuk sedikit detail: Versi statistik dinormalisasi menjadi pada interval [-1,1]. Berikut adalah contoh bagaimana Anda melakukan statistik:
sumber
numpy.corrcoef[x:-i], x[i:])[0,1]
di baris kedua sebagai nilai kembaliancorrcoef
adalah matriks 2x2Gunakan
numpy.corrcoef
fungsi sebagai gantinumpy.correlate
menghitung korelasi statistik untuk lag dari t:sumber
Menurut saya ada 2 hal yang menambah kebingungan pada topik ini:
Saya telah membuat 5 fungsi yang menghitung korelasi otomatis dari array 1d, dengan perbedaan parsial vs non-parsial. Beberapa menggunakan rumus dari statistik, beberapa menggunakan korelasi dalam pengertian pemrosesan sinyal, yang juga dapat dilakukan melalui FFT. Tetapi semua hasil merupakan korelasi otomatis dalam definisi statistik , jadi hasil tersebut menggambarkan bagaimana mereka ditautkan satu sama lain. Kode di bawah ini:
Berikut adalah gambar keluarannya:
Kami tidak melihat semua 5 baris karena 3 di antaranya tumpang tindih (di ungu). Semua tumpang tindih adalah korelasi otomatis non-parsial. Ini karena perhitungan dari metode pemrosesan sinyal (
np.correlate
, FFT) tidak menghitung mean / std yang berbeda untuk setiap tumpang tindih.Perhatikan juga bahwa hasil
fft, no padding, non-partial
(garis merah) berbeda, karena tidak mengisi deretan waktu dengan 0 sebelum melakukan FFT, jadi FFT melingkar. Saya tidak bisa menjelaskan secara detail mengapa, itulah yang saya pelajari dari tempat lain.sumber
Karena saya baru saja mengalami masalah yang sama, saya ingin berbagi beberapa baris kode dengan Anda. Sebenarnya ada beberapa posting yang agak mirip tentang autokorelasi di stackoverflow sekarang. Jika Anda mendefinisikan autokorelasi sebagai
a(x, L) = sum(k=0,N-L-1)((xk-xbar)*(x(k+L)-xbar))/sum(k=0,N-1)((xk-xbar)**2)
[ini adalah definisi yang diberikan dalam fungsi a_correlate IDL dan itu sesuai dengan apa yang saya lihat dalam jawaban 2 dari pertanyaan # 12269834 ], maka berikut ini tampaknya memberikan hasil yang benar:Seperti yang Anda lihat, saya telah menguji ini dengan kurva dosa dan distribusi acak yang seragam, dan kedua hasil terlihat seperti yang saya harapkan. Perhatikan bahwa saya menggunakan
mode="same"
alih-alihmode="full"
seperti yang dilakukan orang lain.sumber
Pertanyaan Anda 1 telah dibahas secara ekstensif dalam beberapa jawaban yang sangat baik di sini.
Saya berpikir untuk berbagi dengan Anda beberapa baris kode yang memungkinkan Anda untuk menghitung autokorelasi sinyal hanya berdasarkan pada sifat matematika dari autokorelasi. Artinya, autokorelasi dapat dihitung dengan cara berikut:
kurangi mean dari sinyal dan dapatkan sinyal yang tidak bias
hitung transformasi Fourier dari sinyal yang tidak bias
hitung kepadatan spektral daya sinyal, dengan mengambil norma kuadrat dari setiap nilai transformasi Fourier dari sinyal yang tidak bias
menghitung transformasi Fourier terbalik dari kepadatan spektral daya
menormalkan transformasi Fourier terbalik dari kepadatan spektral daya dengan jumlah kuadrat dari sinyal yang tidak bias, dan hanya mengambil setengah dari vektor yang dihasilkan
Kode untuk melakukan ini adalah sebagai berikut:
sumber
p = np.abs(f)
?Saya seorang ahli biologi komputasi, dan ketika saya harus menghitung auto / korelasi silang antara pasangan rangkaian waktu proses stokastik, saya menyadari bahwa
np.correlate
tidak melakukan pekerjaan yang saya butuhkan.Memang, apa yang tampaknya hilang
np.correlate
adalah rata - rata dari semua kemungkinan pasangan titik waktu pada jarak 𝜏.Berikut adalah cara saya mendefinisikan fungsi melakukan apa yang saya butuhkan:
Menurut saya, tidak ada jawaban sebelumnya yang mencakup contoh auto / korelasi silang ini: semoga jawaban ini berguna bagi seseorang yang mengerjakan proses stokastik seperti saya.
sumber
Saya menggunakan talib.CORREL untuk autokorelasi seperti ini, saya curiga Anda dapat melakukan hal yang sama dengan paket lain:
sumber
Menggunakan transformasi Fourier dan teorema konvolusi
Kompleksitas waktu adalah N * log (N)
Ini adalah versi yang dinormalisasi dan tidak bias, ini juga N * log (N)
Metode yang disediakan oleh A. Levy berfungsi, tetapi saya mengujinya di PC saya, kerumitan waktunya tampaknya N * N
sumber
Alternatif untuk numpy.correlate tersedia di statsmodels.tsa.stattools.acf () . Ini menghasilkan fungsi autokorelasi yang terus menurun seperti yang dijelaskan oleh OP. Menerapkannya cukup sederhana:
Perilaku defaultnya adalah berhenti di 40 nlag, tetapi ini dapat disesuaikan dengan
nlag=
opsi untuk aplikasi spesifik Anda. Ada kutipan di bagian bawah halaman untuk statistik di balik fungsi tersebut .sumber
Saya pikir jawaban sebenarnya untuk pertanyaan OP secara ringkas terkandung dalam kutipan dari dokumentasi Numpy.correlate ini:
Ini menyiratkan bahwa, ketika digunakan tanpa definisi 'mode', fungsi Numpy.correlate akan mengembalikan skalar, ketika diberi vektor yang sama untuk dua argumen inputnya (yaitu - ketika digunakan untuk melakukan autokorelasi).
sumber
Solusi sederhana tanpa panda:
sumber
Plot autokorelasi statistik yang diberi seri datatime panda:
sumber
autocorrelation_plot()
dalam kasus ini? (cf. stats.stackexchange.com/questions/357300/… )