Làm thế nào để so sánh các bộ dữ liệu chuỗi thời gian khác nhau


8

Tôi đang cố gắng thực hiện một số phát hiện bất thường giữa chuỗi thời gian # bằng Python và sklearn (nhưng các đề xuất gói khác chắc chắn được chào đón!).

Tôi có một bộ gồm 10 chuỗi thời gian; mỗi chuỗi thời gian bao gồm dữ liệu được thu thập từ giá trị mô-men xoắn của lốp xe (tổng cộng 10 lốp) và các bộ có thể không chứa cùng một số điểm dữ liệu (kích thước cài đặt khác nhau) . Mỗi dữ liệu chuỗi thời gian có khá nhiều chỉ là lốp_id, dấu thời gian và sig_value (giá trị từ tín hiệu hoặc cảm biến). Dữ liệu mẫu cho một chuỗi thời gian trông như thế này:

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

Bây giờ tôi có 10 người trong số họ, và 2 người trong số họ cư xử kỳ lạ. Tôi hiểu rằng đây là một vấn đề phát hiện bất thường, nhưng hầu hết các bài báo tôi đọc trực tuyến đều phát hiện các điểm bất thường trong cùng một chuỗi thời gian (hay tại một số điểm, giá trị mô-men xoắn không bình thường đối với lốp xe đó).

Để phát hiện 2 lốp xe đang hoạt động bất thường, tôi đã thử sử dụng phương pháp phân cụm, về cơ bản là phân cụm k-nghĩa (vì nó không được giám sát).

Để chuẩn bị dữ liệu để đưa vào cụm k-nghĩa, cho mỗi chuỗi thời gian (còn gọi là cho mỗi lốp xe), tôi đã tính toán:

  1. 3 bộ trên cùng của tối đa cục bộ và tối thiểu cục bộ liền kề với biên độ (chênh lệch) cao nhất
  2. Giá trị trung bình của giá trị mô-men xoắn
  3. Độ lệch chuẩn của giá trị mô-men xoắn

Tôi cũng đặt số cụm là 2, vì vậy, cụm 1 hoặc 2.

Vì vậy, kết quả cuối cùng của tôi (sau khi gán các cụm) trông như sau:

        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 

Bây giờ tôi có một câu hỏi phải làm gì với kết quả này ... vì vậy mỗi lốp xe có 3 hàng dữ liệu, vì tôi đã chọn 3 cặp max / min cục bộ hàng đầu với 3 biên độ lớn nhất và điều đó có nghĩa là mỗi hàng có thể được gán cho một cụm, và đôi khi chúng được gán cho các cụm khác nhau cho 1 lốp chẵn. Ngoài ra kích thước cụm thường lớn hơn chỉ 2.

Câu hỏi của tôi là:

  1. Làm thế nào để phát hiện sự bất thường về "tập hợp chuỗi thời gian" không chỉ các điểm dữ liệu riêng lẻ?
  2. Là cách tiếp cận của tôi hợp lý / hợp lý? Nếu có, làm thế nào tôi có thể làm sạch kết quả của mình để có được những gì tôi muốn? Và nếu không, tôi có thể làm gì để cải thiện?

Câu trả lời:


1

Câu hỏi khá thú vị!

Trước hết hãy xem bản chỉnh sửa của tôi vì câu hỏi của bạn hơi không rõ ràng theo thuật ngữ tiêu chuẩn. bạn có một bộ Dòng thời gian và bạn muốn phát hiện các ngoại lệ (bất thường).

  1. Cách tiếp cận của bạn là khá rõ ràng và logic và cho thấy sự hiểu biết về vấn đề và giải pháp. Vấn đề là về cách bạn chọn để áp dụng nó.
  2. K-nghĩa không phải là cách tốt nhất. Tôi muốn chỉ ra rằng sự lựa chọn của 2 cụm rất thông minh ở đây vì bạn hy vọng các cụm được hình thành dựa trên cấu trúc bình thường / bất thường. Nó chỉ không hoạt động tốt trong thực tế nếu các tính năng bạn trích xuất từ ​​chuỗi thời gian của bạn không ngăn chặn hành vi bất thường.
  3. Tôi giả sử thuật toán nhúng là cách đúng đắn để làm như vậy. Rất có thể nếu bạn áp dụng một PCA đơn giản, bạn sẽ thấy chuỗi thời gian bất thường ở đâu đó xa hơn những nơi khác. Dưới đây tôi viết mã. Hãy thử và thả cho tôi một dòng nếu nó không hoạt động vì vậy tôi tìm giải pháp phức tạp hơn (ví dụ: bạn có thể xây dựng không gian pha và xem dữ liệu của mình ở đó hoặc theo dõi sự tái diễn của chuỗi thời gian, v.v.)
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()

Trong đó X là ma trận 10 x trong đó mỗi hàng là một chuỗi thời gian.

Bạn có thể chọn nhiều thành phần hơn cho PCA và kiểm tra các PC khác nhau.

Dù sao, vấn đề không phải là khó khăn và nếu nó không hoạt động tôi sẽ cập nhật câu trả lời của tôi với một giải pháp khác.

Hy vọng nó sẽ giúp bạn và may mắn!


chào Kasra! Cảm ơn bạn SOOO rất nhiều vì đã cố gắng giúp đỡ! Tôi đang thử phương pháp của bạn và tôi nhận thấy một thiếu sót / hạn chế của phương pháp của bạn ... đó là cách tiếp cận của bạn giả định rằng mỗi tập dữ liệu chuỗi thời gian tôi đang sử dụng có cùng số điểm dữ liệu, không phải vậy đây ... có gợi ý nào khác không? :(
alwaysaskingquestions

Chắc chắn nếu bạn upvote / chấp nhận câu trả lời nếu nó hoạt động. Ở giai đoạn đầu tiên chỉ là clip thời gian. Cắt chúng để có cùng kích thước với chuỗi thời gian ngắn nhất. Nếu nó không giúp đỡ, bỏ bình luận khác ở đây.
Kasra Manshaei

Xin chào Kasra, tôi không muốn mất dữ liệu; Có thể không cắt dữ liệu? Tôi muốn sử dụng tất cả chúng.
alwaysaskingquestions

Vì vậy, thay thế đuôi của chuỗi thời gian của bạn bằng giá trị cuối cùng. Chỉ cần thử nó và cho tôi biết nếu nó hoạt động
Kasra Manshaei

Điều đó không thay đổi dữ liệu về cơ bản? Bây giờ tôi đang thêm giá trị cho các tập dữ liệu ngắn hơn .... vậy đó là thay đổi kết quả của tôi phải không? (cảm ơn bạn rất nhiều vì đã kiên nhẫn với tôi!)
alwaysaskingquestions
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.