Làm mịn dữ liệu chuỗi thời gian


14

Tôi đang xây dựng một ứng dụng Android ghi lại dữ liệu gia tốc trong khi ngủ, để phân tích xu hướng giấc ngủ và tùy ý đánh thức người dùng gần thời gian mong muốn trong khi ngủ nhẹ.

Tôi đã xây dựng thành phần thu thập và lưu trữ dữ liệu, cũng như báo động. Tôi vẫn cần phải giải quyết con thú hiển thị và lưu dữ liệu giấc ngủ theo cách thực sự có ý nghĩa và rõ ràng, một cách tốt nhất cũng là cho vay để phân tích.

Một vài bức ảnh nói hai ngàn từ: (Tôi chỉ có thể đăng một liên kết do đại diện thấp)

Đây là dữ liệu chưa được lọc, tổng số chuyển động, được thu thập tại các khoảng thời gian 30 giây

Và cùng một dữ liệu, được làm mịn bằng biểu hiện của riêng tôi về làm mịn trung bình di chuyển

chỉnh sửa) cả hai biểu đồ phản ánh hiệu chuẩn - có bộ lọc 'nhiễu' tối thiểu và bộ lọc cắt tối đa, cũng như mức kích hoạt cảnh báo (đường trắng)

Thật không may, cả hai đều không phải là giải pháp tối ưu - thứ nhất hơi khó hiểu đối với người dùng trung bình và thứ hai, dễ hiểu hơn, ẩn giấu rất nhiều điều đang thực sự xảy ra. Cụ thể, tính trung bình loại bỏ chi tiết của các gai trong chuyển động - và tôi nghĩ chúng có thể có ý nghĩa.

Vậy tại sao những biểu đồ này rất quan trọng? Các chuỗi thời gian này được hiển thị suốt đêm dưới dạng phản hồi cho người dùng và sẽ được lưu trữ để xem xét / phân tích sau đó. Việc làm mịn lý tưởng sẽ giảm chi phí bộ nhớ (cả RAM và lưu trữ) và giúp hiển thị nhanh hơn trên các điện thoại / thiết bị bị thiếu tài nguyên này.

Rõ ràng có một cách tốt hơn để làm mịn dữ liệu - Tôi có một số ý tưởng mơ hồ, chẳng hạn như sử dụng hồi quy tuyến tính để tìm ra những thay đổi 'sắc nét' trong chuyển động và điều chỉnh độ mịn trung bình di chuyển của tôi theo. Tôi thực sự cần thêm một số hướng dẫn và đầu vào trước khi tôi lao đầu vào một cái gì đó có thể được giải quyết tối ưu hơn.

Cảm ơn!

Câu trả lời:


16

Trước hết, các yêu cầu về nén và phân tích / trình bày không nhất thiết phải giống nhau - thực sự, để phân tích, bạn có thể muốn giữ tất cả dữ liệu thô và có khả năng cắt và xắt nó theo nhiều cách khác nhau. Và những gì làm việc tốt nhất cho bạn sẽ phụ thuộc rất nhiều vào những gì bạn muốn thoát khỏi nó. Nhưng có một số thủ thuật tiêu chuẩn mà bạn có thể thử:

  • Sử dụng sự khác biệt thay vì dữ liệu thô
  • Sử dụng ngưỡng để loại bỏ tiếng ồn ở mức độ thấp. (Kết hợp với sự khác biệt để bỏ qua những thay đổi nhỏ.)
  • Sử dụng phương sai trên một số cửa sổ thời gian hơn là trung bình, để nắm bắt mức độ hoạt động thay vì chuyển động
  • Thay đổi cơ sở thời gian từ các khoảng thời gian cố định thành chiều dài thay đổi chạy và tích lũy thành một chuỗi điểm dữ liệu duy nhất về các thay đổi mà một số tiêu chí giữ (ví dụ: sự khác biệt theo cùng một hướng, cho đến một số ngưỡng)
  • Chuyển đổi dữ liệu từ giá trị thực sang thứ tự (ví dụ: thấp, trung bình, cao); bạn cũng có thể thực hiện việc này trên các thùng thời gian thay vì các mẫu riêng lẻ - ví dụ: mức độ hoạt động cho mỗi lần kéo dài 5 phút
  • Sử dụng hạt nhân tích chập thích hợp * để làm mịn một cách tinh tế hơn mức trung bình di chuyển của bạn hoặc chọn ra các tính năng quan tâm, chẳng hạn như thay đổi mạnh.
  • Sử dụng thư viện FFT để tính toán phổ công suất

Cái cuối cùng có thể hơi tốn kém cho mục đích của bạn, nhưng có lẽ sẽ cung cấp cho bạn một số tùy chọn trình bày rất hữu ích, về mặt "nhịp điệu giấc ngủ" và như vậy. (Tôi không biết gì về Android, nhưng có thể hiểu được rằng một số / nhiều / tất cả các thiết bị cầm tay có thể được tích hợp trong phần cứng DSP mà bạn có thể tận dụng.)


* Cho biết cách tích chập trung tâm để xử lý tín hiệu số, thật khó để tìm thấy phần giới thiệu có thể truy cập trực tuyến. Hoặc ít nhất trong 3 phút của googling. Gợi ý chào mừng!


10

Có nhiều thuật toán làm mịn không đối xứng bao gồm spline và hoàng thổ. Nhưng họ cũng sẽ làm dịu đi những thay đổi đột ngột. Bộ lọc thông thấp cũng vậy. Tôi nghĩ rằng bạn có thể cần một máy mượt hơn dựa trên wavelet, cho phép nhảy đột ngột nhưng vẫn làm dịu tiếng ồn.

Kiểm tra Percival và Walden (2000)gói R liên quan . Mặc dù bạn muốn có một giải pháp java, các thuật toán trong gói R là nguồn mở và bạn có thể dịch chúng.


3

Điều này hơi tiếp tuyến với những gì bạn đang hỏi, nhưng có thể đáng để xem qua bộ lọc Kalman.


1

Làm mịn Savitzky-Golay có thể là một câu trả lời tốt. Đó là một triển khai cực kỳ hiệu quả của việc làm mịn các ô vuông nhỏ nhất qua cửa sổ thời gian trượt (tích chập trên dữ liệu đó) để nhân dữ liệu trong mỗi cửa sổ thời gian bằng các hằng số cố định. Bạn có thể phù hợp với các giá trị, công cụ phái sinh, công cụ phái sinh thứ hai và cao hơn.

Bạn chọn mức độ nhọn cho phép kết quả, dựa trên kích thước của cửa sổ thời gian trượt và mức độ phù hợp của đa thức trên cửa sổ thời gian đó. Điều đó ban đầu được phát triển cho sắc ký, trong đó các đỉnh là một phần thiết yếu của kết quả. Một đặc tính mong muốn của việc làm mịn SG là vị trí của các đỉnh được bảo tồn. Chẳng hạn, một cửa sổ 5 đến 11 điểm với đường cong hình khối phù hợp để giảm tiếng ồn nhưng vẫn giữ được các đỉnh.

Có một bài viết hay trên Wikipedia, mặc dù nó được gọi là bộ lọc Savitzky-Golay (thực hiện bạo lực nhẹ đối với thuật ngữ thông thường từ lý thuyết điều khiển hệ thống và phân tích chuỗi thời gian, cũng như bài báo gốc, trong đó nó được gọi là làm mịn chính xác). Ngoài ra, hãy lưu ý rằng có (một đối số trên) một lỗi trong bài viết Wikipedia cho các công thức cho các ước tính phái sinh thứ hai - xem phần Talk cho bài viết đó. EDIT: Bài viết Wikipedia đã được sửa

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.