cara membandingkan rangkaian data deret waktu yang berbeda


8

Saya mencoba untuk melakukan beberapa deteksi anomali antara seri waktu # menggunakan Python dan sklearn (tetapi saran paket lainnya pasti diterima!).

Saya memiliki 10 seri waktu; setiap deret waktu terdiri dari data yang dikumpulkan dari nilai torsi ban (jadi total 10 ban) dan set mungkin tidak mengandung jumlah titik data yang sama (ukuran set berbeda) . Setiap data time-series cukup banyak hanya nilai ban_id, timestamp, dan sig_value (nilai dari sinyal, atau sensor). Data sampel untuk satu rangkaian waktu terlihat seperti ini:

tire_id        timestamp        sig_value
tire_1           23:06.1            12.75
tire_1           23:07.5                0
tire_1           23:09.0            -10.5

Sekarang saya memiliki 10 dari mereka, dan 2 dari mereka berperilaku aneh. Saya mengerti bahwa ini adalah masalah pendeteksian anomali, tetapi sebagian besar artikel yang saya baca online mendeteksi titik anomali dalam seri waktu yang sama (alias jika pada beberapa titik nilai torsi tidak normal untuk ban itu).

Untuk mendeteksi 2 ban mana yang berperilaku tidak normal, saya mencoba menggunakan metode clustering, pada dasarnya k-means clustering (karena tidak diawasi).

Untuk menyiapkan data untuk dimasukkan ke dalam pengelompokan k-means, untuk setiap seri waktu (alias untuk setiap ban), saya menghitung:

  1. 3 set teratas maksimum lokal yang berdekatan dan minimum lokal dengan amplitudo tertinggi (perbedaan)
  2. Nilai tengah torsi
  3. Standar deviasi dari nilai torsi

Saya juga mengatur jumlah cluster menjadi hanya 2, jadi apakah cluster 1 atau 2.

Jadi hasil akhir saya (setelah menetapkan kelompok) terlihat seperti berikut:

        amplitude  local maxima  local minima  sig_value_std  \
tire_0     558.50        437.75       -120.75      77.538645   
tire_0     532.75        433.75        -99.00      77.538645   
tire_0     526.25        438.00        -88.25      77.538645   
tire_1     552.50       -116.50        436.00      71.125912   
tire_1     542.75        439.25       -103.50      71.125912   

        sig_value_average  cluster  
tire_0          12.816990        0  
tire_0          12.816990        0  
tire_0          12.816990        0  
tire_1          11.588038        1  
tire_1          11.588038        0 

Sekarang saya memiliki pertanyaan tentang apa yang harus dilakukan dengan hasil ini ... sehingga setiap ban memiliki 3 baris data, karena saya telah memilih 3 pasang top lokal / min dengan 3 amplitudo terbesar, dan itu berarti setiap baris dapat ditugaskan ke sebuah cluster, dan kadang-kadang mereka ditugaskan ke cluster yang berbeda untuk 1 ban genap. Juga ukuran cluster biasanya lebih besar dari hanya 2.

Pertanyaan saya adalah:

  1. Bagaimana cara melakukan deteksi anomali tentang "serangkaian waktu" bukan hanya titik data individual?
  2. Apakah pendekatan saya masuk akal / logis? Jika ya, bagaimana saya bisa membersihkan hasil saya untuk mendapatkan apa yang saya inginkan? Dan jika tidak, apa yang bisa saya lakukan untuk meningkatkan?

Jawaban:


1

Pertanyaan yang cukup menarik!

Pertama-tama lihat edit saya karena pertanyaan Anda agak tidak jelas menurut terminologi standar. Anda memiliki serangkaian Time-Series dan Anda ingin mendeteksi outlier (kelainan).

  1. Pendekatan Anda cukup jelas dan logis dan menunjukkan pemahaman tentang masalah dan solusi. Intinya adalah tentang cara Anda memilih untuk menerapkannya.
  2. K-means bukan cara terbaik. Saya ingin menunjukkan bahwa pilihan 2 cluster sangat cerdas di sini karena Anda berharap cluster terbentuk berdasarkan struktur normal / tidak normal. Itu tidak bekerja dengan baik dalam praktik jika fitur yang Anda ekstrak dari time-series Anda tidak menghambat perilaku abnormal.
  3. Saya berasumsi algoritma Embedding adalah cara yang tepat untuk melakukannya. Kemungkinan besar jika Anda menerapkan PCA sederhana, Anda akan melihat rangkaian waktu yang abnormal di suatu tempat lebih jauh dari yang lain. Di bawah ini saya menulis kode. Cobalah dan berikan saya garis jika tidak berhasil, jadi saya mencari solusi yang lebih canggih (mis. Anda dapat membangun ruang fase dan melihat data Anda di sana atau memantau berulangnya rangkaian waktu, dll.)
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

pca = PCA(n_components=2)
X_new = pca.fit_transform(X)
plt.figure(figsize=(10,10))
plt.plot(X_new[:,0],X_new[:,1],"*")
plt.show()

di mana X adalah matriks 10xN di mana setiap baris adalah satu deret waktu.

Anda dapat memilih lebih banyak komponen untuk PCA dan memeriksa PC yang berbeda satu sama lain.

Bagaimanapun masalahnya tidak terlalu sulit dan jika tidak berhasil saya akan memperbarui jawaban saya dengan solusi lain.

Semoga ini bisa membantu dan semoga berhasil!


hai Kasra! Terima kasih banyak untuk membantu! Saya mencoba metode Anda dan saya perhatikan satu kekurangan / keterbatasan metode Anda ... yaitu bahwa pendekatan Anda mengasumsikan bahwa setiap rangkaian data seri waktu yang saya gunakan memiliki jumlah titik data yang sama, yang tidak terjadi di sini ... ada saran lain? :(
alwaysaskingquestions

Yakin jika Anda memilih / menerima jawaban jika itu berhasil. Pada tahap pertama hanya klip seri-waktu. Potong mereka menjadi ukuran yang sama dengan seri waktu terpendek. Jika tidak membantu, berikan komentar lain di sini.
Kasra Manshaei

Hai Kasra, saya tidak ingin kehilangan data; Apakah mungkin untuk tidak memotong data? Saya ingin menggunakan semuanya.
mengajukan pertanyaan

Jadi, ganti buntut seri waktu Anda dengan nilai terakhir. Coba saja dan beri tahu saya jika itu berhasil
Kasra Manshaei

bukankah itu mengubah data pada dasarnya? cuz sekarang aku menambahkan nilai ke set data yang lebih pendek .... sehingga mengubah hasil saya kan? (terima kasih banyak untuk bersabar dengan saya!)
alwaysaskingquestions
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.