Làm cách nào để giảm số lượng điểm dữ liệu trong chuỗi?


11

Tôi đã không nghiên cứu thống kê trong hơn 10 năm (và sau đó chỉ là một khóa học cơ bản), vì vậy có lẽ câu hỏi của tôi hơi khó hiểu.

Dù sao, những gì tôi muốn làm là giảm số lượng điểm dữ liệu trong một chuỗi. Trục x là số mili giây kể từ khi bắt đầu đo và trục y là số đọc cho điểm đó.

Thường có hàng ngàn điểm dữ liệu, nhưng tôi có thể chỉ cần vài trăm. Vì vậy, câu hỏi của tôi là: Làm thế nào để tôi giảm chính xác số lượng điểm dữ liệu?

Quá trình được gọi là gì? (Vì vậy tôi có thể google nó) Có thuật toán nào thích không (tôi sẽ triển khai nó trong C #)

Hy vọng bạn có một số manh mối. Xin lỗi vì tôi không có thuật ngữ thích hợp.


Chỉnh sửa: Thêm chi tiết đến đây:

Dữ liệu thô tôi nhận được là dữ liệu nhịp tim và dưới dạng số mili giây kể từ nhịp cuối cùng. Trước khi vẽ dữ liệu, tôi tính số mili giây từ mẫu đầu tiên và bpm (nhịp mỗi phút) tại mỗi điểm dữ liệu (60000 / lầnincelastbeat).

Tôi muốn trực quan hóa dữ liệu, tức là vẽ nó trong biểu đồ đường. Tôi muốn giảm số điểm trong biểu đồ từ hàng ngàn xuống hàng trăm.

Một lựa chọn sẽ là tính bpm trung bình cho mỗi giây trong chuỗi, hoặc có thể cứ sau 5 giây hoặc lâu hơn. Điều đó sẽ khá dễ dàng nếu tôi biết rằng tôi sẽ có ít nhất một mẫu cho mỗi khoảng thời gian đó (giây trong khoảng thời gian 5 giây).


Tôi quên điều này: Các điểm dọc theo trục x đi kèm với khoảng cách khác nhau.

Tôi không chắc tôi hiểu. Bạn không có trục y à?

Ồ xin lỗi. Tôi lầm lạc. Bây giờ tôi đã thay đổi nó ở trên.

Tôi cũng nghĩ rằng bạn cần cung cấp thêm một chút thông tin. Ví dụ, tôi vẫn không thể hình dung biểu đồ. Mục tiêu của bạn là gì?

Được rồi xin lỗi. Tôi đã thêm một số chi tiết ở trên.

Câu trả lời:


10

Bạn có hai vấn đề: quá nhiều điểm và làm thế nào để vượt qua các điểm còn lại.

Làm loãng mẫu của bạn

Nếu bạn có quá nhiều quan sát đến trong thời gian thực, bạn luôn có thể sử dụng lấy mẫu ngẫu nhiên đơn giản để làm mỏng mẫu của bạn. Lưu ý, đối với điều này là quá đúng, số điểm sẽ phải rất lớn.

Giả sử bạn có N điểm và bạn chỉ muốn n điểm trong số đó. Sau đó tạo n số ngẫu nhiên từ phân phối U (0, N-1) thống nhất rời rạc . Đây sẽ là những điểm bạn sử dụng.

Nếu bạn muốn làm điều này một cách tuần tự, tức là tại mỗi điểm bạn quyết định sử dụng nó hay không, thì chỉ cần chấp nhận một điểm có xác suất p . Vì vậy, nếu bạn đặt p = 0,01, bạn sẽ chấp nhận (trung bình) 1 điểm trong một trăm.

Nếu dữ liệu của bạn trải đều không đều và bạn chỉ muốn làm mỏng các vùng dày đặc của điểm, thì chỉ cần làm cho chức năng làm mỏng của bạn tinh vi hơn một chút. Ví dụ: thay vì p , thì sao:

1pexp(λt)

Trong đó là số dương và là thời gian kể từ lần quan sát cuối cùng. Nếu thời gian giữa hai điểm lớn, tức là lớn , xác suất chấp nhận một điểm sẽ là một. Ngược lại, nếu hai điểm gần nhau, xác suất chấp nhận một điểm sẽ là .λtt1p

Bạn sẽ cần thử nghiệm với các giá trị của và .λp

Làm mịn

Có thể một cái gì đó giống như một sơ đồ loại trung bình di chuyển đơn giản. Hoặc bạn có thể tìm kiếm thứ gì đó cao cấp hơn như kernel mượt hơn (như những người khác đề xuất). Bạn sẽ cần phải cẩn thận rằng bạn không làm trơn tru quá nhiều, vì tôi cho rằng việc giảm đột ngột sẽ được xử lý rất nhanh trong kịch bản của bạn.

Cần có thư viện C # cho loại công cụ này.

Phần kết luận

Mỏng nếu cần, sau đó mịn.


Ah, thật thú vị, nhưng tôi cần nó có thể dự đoán được, tức là có cùng kết quả mỗi lần tôi xem dữ liệu.

Trong trường hợp đó, tạo n chỉ mục của các điểm bạn chọn và lưu trữ các chỉ mục đó.
csgillespie

Hoặc lưu trữ hạt giống vào RNG trước khi lấy mẫu.
Dirk Eddelbuettel

Giải pháp của Dirk liên quan đến hạt giống có lẽ là lựa chọn tốt hơn.
csgillespie

Tính trung bình mỗi giây là ok, nhưng tôi sẽ làm gì khi không có dữ liệu cho một giây cụ thể. Tôi đoán rằng tôi có thể thực hiện một số phép nội suy từ giây trước và sau nó, nhưng sẽ rất tuyệt với phương pháp (được đặt tên) cụ thể cho việc này, vì vậy tôi không thử phát minh ra thứ gì đó đã được phát minh.

9

Chà, tôi nghĩ từ bạn đang tìm kiếm là "lấy mẫu", nhưng tôi không chắc tại sao bạn muốn làm điều đó. Hàng ngàn điểm dữ liệu không nhiều. Hay bạn đang tìm kiếm chỉ để vẽ một số lượng nhỏ hơn các điểm cách đều nhau? Điều đó thường được gọi là "binning."

Là mục tiêu của bạn để tạo ra một hình dung? Trong trường hợp đó, bạn có thể muốn giữ dữ liệu thô, vẽ nó dưới dạng một biểu đồ tán xạ, sau đó phủ lên một số xu hướng trung tâm (đường hồi quy, spline, bất cứ điều gì) để truyền đạt bất cứ thông điệp nào cần phải có.

Hoặc là mục tiêu của bạn để tóm tắt số lượng kết quả theo một cách nào đó? Trong trường hợp đó, bạn có thể muốn giải thích vấn đề của bạn chi tiết hơn!


Đúng, trực quan là những gì tôi muốn. Tôi đã thêm một số thông tin trong câu hỏi.

biệt phái vẽ dữ liệu thô với một dòng làm mịn.
JoFrhwld

điều chỉnh âm mưu dữ liệu thô bằng một đường làm mịn --- Bạn cũng có thể muốn vẽ biểu đồ thay đổi trong BPM theo thời gian dưới dạng trực quan hóa riêng biệt.
Giăng

5

Tính trung bình dẫn đến một bộ dữ liệu khác nhau hơn là chỉ đơn giản là giảm số lượng điểm dữ liệu. Nếu một nhịp tim mỗi phút nhanh hơn nhiều so với nhịp tim khác, bạn sẽ mất tín hiệu thông qua quá trình làm mịn của mình.

Nếu bạn tóm tắt 125-125-0-125-125 là 100 so với câu chuyện mà dữ liệu kể là khác nhau thông qua việc làm mịn của bạn.

Đôi khi trái tim thậm chí bỏ qua nhịp đập và tôi tin rằng đó là một sự kiện thú vị tuy nhiên muốn xem xét dữ liệu nhịp tim được vẽ.

Do đó tôi sẽ đề nghị bạn tính khoảng cách giữa hai điểm với công thức như thế nào d=sqrt((time1-time2)^2 + (bpm1-bpm2)).

Bạn đặt một khoảng cách tối thiểu trong chương trình của bạn. Sau đó, bạn lặp lại thông qua dữ liệu của mình và sau mỗi điểm bạn xóa tất cả các điểm sau mà d nhỏ hơn khoảng cách tối thiểu của bạn.

Vì đơn vị thời gian và bpm không giống nhau, bạn có thể muốn nghĩ về cách bạn có thể tìm cách chia tỷ lệ các đơn vị một cách có ý nghĩa. Để thực hiện nhiệm vụ này, bạn nên nói chuyện với các bác sĩ, những người cuối cùng phải giải thích biểu đồ của bạn và hỏi họ những thông tin nào họ cho là cần thiết.


Đăng thú vị. Tôi cũng sẽ xem xét điều đó. Bạn có thể đúng.

2

Nếu BPM không thay đổi so với nhiều mẫu (hoặc thay đổi hoàn toàn theo cách bạn không quan tâm), bạn có thể cắt dữ liệu của mình thành một chữ số có nghĩa mà bạn thực sự quan tâm và sau đó thực hiện Mã hóa Độ dài.

Ví dụ: trong R dữ liệu này:

0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

có đầu ra này

rle(data)
Run Length Encoding
  lengths: int [1:3] 10 15 15
  values : num [1:3] 0 1 2

1

Bạn không cung cấp đủ thông tin. Tại sao bạn muốn giảm các điểm dữ liệu. Một vài ngàn không là gì trong những ngày này.

Cho rằng bạn muốn có cùng kết quả mỗi lần bạn xem cùng một dữ liệu có lẽ bạn chỉ muốn tính trung bình bin. Bạn có khoảng cách thay đổi trên trục x của bạn. Có lẽ bạn đang cố gắng để làm cho phù hợp? Trong trường hợp đó, bạn sẽ đặt chiều rộng của thùng có lẽ là 50 ms hoặc 100, sau đó lấy trung bình tất cả các điểm trong đó. Làm cho chiều rộng thùng lớn như bạn cần để giảm các điểm dữ liệu xuống kích thước của tập bạn muốn.

Đây thực sự là một câu hỏi khó trả lời mà không có lý do tại sao bạn lại loại bỏ dữ liệu.


Được rồi xin lỗi. Tôi đã thêm một số chi tiết ở trên.

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.