Làm cách nào để tôi có thể lập trình phát hiện các phân đoạn của chuỗi dữ liệu để phù hợp với các đường cong khác nhau?


14

Có bất kỳ thuật toán tài liệu nào để tách các phần của một tập dữ liệu nhất định thành các đường cong khác nhau phù hợp nhất không?

Ví dụ, hầu hết mọi người nhìn vào biểu đồ dữ liệu này sẽ dễ dàng chia nó thành 3 phần: phân đoạn hình sin, phân đoạn tuyến tính và phân đoạn hàm mũ nghịch đảo. Trong thực tế, tôi đã tạo ra cái đặc biệt này với sóng hình sin, đường thẳng và công thức hàm mũ đơn giản.

Biểu đồ dữ liệu với ba phần riêng biệt có thể nhìn thấy

Có các thuật toán hiện có để tìm các phần như vậy, sau đó có thể được gắn riêng rẽ vào các đường cong / đường khác nhau để tạo ra một chuỗi các chuỗi con phù hợp nhất của dữ liệu không?

Lưu ý rằng mặc dù ví dụ có phần cuối của các phân đoạn xếp hàng khá nhiều, nhưng điều này không nhất thiết phải là trường hợp; cũng có thể có một sự thay đổi đột ngột trong các giá trị tại một điểm cắt phân đoạn. Có lẽ những trường hợp đó sẽ dễ dàng phát hiện hơn.

Cập nhật: Đây là hình ảnh của một chút dữ liệu trong thế giới thực: Biểu đồ thế giới thực

Cập nhật 2: đây là một tập hợp dữ liệu trong thế giới thực nhỏ bất thường (chỉ có 509 điểm dữ liệu):

4,53,53,53,53,58,56,52,49,52,56,51,44,39,39,39,37,33,27,21,18,12,19,30,45,66,92,118,135,148,153,160,168,174,181,187,191,190,191,192,194,194,194,193,193,201,200,199,199,199,197,193,190,187,176,162,157,154,144,126,110,87,74,57,46,44,51,60,65,66,90,106,99,87,84,85,83,91,95,99,101,102,102,103,105,110,107,108,135,171,171,141,120,78,42,44,52,54,103,128,82,103,46,27,73,123,125,77,24,30,27,36,42,49,32,55,20,16,21,31,78,140,116,99,58,139,70,22,44,7,48,32,18,16,25,16,17,35,29,11,13,8,8,18,14,0,10,18,2,1,4,0,61,87,91,2,0,2,9,40,21,2,14,5,9,49,116,100,114,115,62,41,119,191,190,164,156,109,37,15,0,5,1,0,0,2,4,2,0,48,129,168,112,98,95,119,125,191,241,209,229,230,231,246,249,240,99,32,0,0,2,13,28,39,15,15,19,31,47,61,92,91,99,108,114,118,121,125,129,129,125,125,131,135,138,142,147,141,149,153,152,153,159,161,158,158,162,167,171,173,174,176,178,184,190,190,185,190,200,199,189,196,197,197,196,199,200,195,187,191,192,190,186,184,184,179,173,171,170,164,156,155,156,151,141,141,139,143,143,140,146,145,130,126,127,127,125,122,122,127,131,134,140,150,160,166,175,192,208,243,251,255,255,255,249,221,190,181,181,181,181,179,173,165,159,153,162,169,165,154,144,142,145,136,134,131,130,128,124,119,115,103,78,54,40,25,8,2,7,12,25,13,22,15,33,34,57,71,48,16,1,2,0,2,21,112,174,191,190,152,153,161,159,153,71,16,28,3,4,0,14,26,30,26,15,12,19,21,18,53,89,125,139,140,142,141,135,136,140,159,170,173,176,184,180,170,167,168,170,167,161,163,170,164,161,160,163,163,160,160,163,169,166,161,156,155,156,158,160,150,149,149,151,154,156,156,156,151,149,150,153,154,151,146,144,149,150,151,152,151,150,148,147,144,141,137,133,130,128,128,128,136,143,159,180,196,205,212,218,222,225,227,227,225,223,222,222,221,220,220,220,220,221,222,223,221,223,225,226,227,228,232,235,234,236,238,240,241,240,239,237,238,240,240,237,236,239,238,235

Dưới đây là, danh xếp hạng, với appoximate vị trí của một số yếu tố thực tế được biết đến mép được đánh dấu bằng đường chấm, một sự xa xỉ, chúng tôi sẽ không bình thường có:

nhập mô tả hình ảnh ở đây

Tuy nhiên, một điều xa xỉ mà chúng ta có là nhận thức muộn: dữ liệu trong trường hợp của tôi không phải là một chuỗi thời gian, mà là liên quan đến không gian; chỉ có ý nghĩa để phân tích toàn bộ dữ liệu (thường là 5000 - 15000 điểm dữ liệu) cùng một lúc, không phải theo cách liên tục.


1
ps đăng bài đầu tiên lên CV; Tôi là một nhà phát triển phần mềm và tôi thường đi chơi trên SO nhiều hơn. Xin lỗi nếu tôi đã vi phạm bất kỳ điều cấm kỵ địa phương. Nhiều tìm kiếm của tôi cho câu trả lời đã dẫn ở đây, vì vậy tôi nghĩ đây sẽ là nơi tốt nhất để hỏi.
whybird

Tại sao bạn không đăng dữ liệu và tôi sẽ cố gắng trả lời câu hỏi của bạn bằng ví dụ.
IrishStat

Một khả năng sẽ phù hợp với cả gia đình đường cong cùng một lúc, sử dụng mô hình meta. Để làm cho mọi thứ chính xác hơn, giả sử mục tiêu cuối cùng của bạn là làm trơn biểu đồ đó, giả sử sử dụng KDE. Sau đó, ước tính trơn tru của bạn từ KDE sẽ chính xác hơn nếu bạn sử dụng mô hình trong đó độ rộng của hạt nhân được phép thay đổi trong phạm vi giá trị của như trong mô hình được sử dụng ở đây, phương trình (2) - (3)x
user603

1
Bạn xây dựng ví dụ sao cho ý tưởng có ý nghĩa: cho đến nay, rất tốt. Với biểu đồ thực, phổ biến hơn nhiều là hình dạng phức tạp phản ánh hỗn hợp các phân phối chồng chéo: sự quan tâm không phải là thay đổi trên biểu đồ quan sát mà thường không tồn tại một cách thuyết phục hoặc không phải là cách suy nghĩ đúng đắn về hỗn hợp. Tuy nhiên, có thể bạn đang sử dụng "biểu đồ" theo cách rộng hơn nhiều so với tiêu chuẩn trong khoa học thống kê trong đó có nghĩa là biểu đồ thanh phân phối tần suất hoặc xác suất (chỉ).
Nick Cox

@IrishStat - bộ dữ liệu thông thường có 5000 đến 15000 mục. Tôi đã cố gắng chuẩn bị một bản tóm tắt thực sự ở đây, nhưng hóa ra đó là một ví dụ tồi tệ, và tôi phải làm lại từ đầu. Mặt khác, làm điều đó đã gợi ý cho tôi một câu trả lời một phần chỉ đơn giản là làm mịn và lấy trung bình các cụm dữ liệu để tìm kiếm các mẫu ban đầu, để được giải quyết sau đó vì vậy cảm ơn vì điều đó :) Tôi có một cái thực sự chỉ rộng 509 có vẻ như nó có thể tốt Tôi sẽ thêm nó vào câu hỏi khi tôi có thể.
whybird

Câu trả lời:


2

Giải thích của tôi về câu hỏi là OP đang tìm kiếm các phương pháp phù hợp với hình dạng của các ví dụ được cung cấp, chứ không phải phần dư của HAC. Ngoài ra, các thói quen tự động không cần sự can thiệp đáng kể của con người hoặc nhà phân tích là mong muốn. Box-Jenkins có thể không phù hợp, mặc dù sự nhấn mạnh của họ trong chủ đề này, vì họ yêu cầu sự tham gia của nhà phân tích đáng kể.

Các mô-đun R tồn tại cho loại không khớp, dựa trên mô hình này. Phân cụm phân phối cho phép là một kỹ thuật khớp mẫu như vậy được phát triển bởi một nhà khoa học của Viện Max Planck đáp ứng các tiêu chí bạn đã vạch ra. Ứng dụng của nó là dữ liệu chuỗi thời gian, nhưng nó không giới hạn ở đó. Đây là một trích dẫn cho mô-đun R đã được phát triển:

pdc: Gói R dành cho chuỗi thời gian dựa trên độ phức tạp của Andreas Brandmaier

Ngoài PDC, còn có máy học, thói quen iSax được phát triển bởi Eamon Keogh tại UC Irvine cũng đáng để so sánh.

Cuối cùng, có bài viết về Đập vỡ dữ liệu: Khám phá trật tự ẩn giấu trong dữ liệubởi Hayopadhyay và Lipson. Ngoài tiêu đề thông minh, có một mục đích nghiêm túc trong công việc. Đây là bản tóm tắt: "Từ nhận dạng giọng nói tự động đến khám phá các ngôi sao bất thường, cơ bản gần như tất cả các tác vụ khám phá tự động là khả năng so sánh và đối chiếu các luồng dữ liệu với nhau, để xác định các kết nối và phát hiện ra các ngoại lệ. Một trở ngại chính là hầu hết các thuật toán so sánh dữ liệu ngày nay đều dựa vào một chuyên gia về con người để xác định 'tính năng' của dữ liệu có liên quan để so sánh. Ở đây, chúng tôi đề xuất một nguyên tắc mới để ước tính sự giống nhau giữa các nguồn tùy ý Chúng tôi chứng minh việc áp dụng nguyên tắc này vào việc phân tích dữ liệu từ một số vấn đề thách thức trong thế giới thực, bao gồm sự định hướng của các mẫu điện não đồ liên quan đến động kinh, phát hiện hoạt động tim bất thường từ các bản ghi âm yêu thích và phân loại các vật thể thiên văn từ trắc quang thô. Trong tất cả các trường hợp này và không có quyền truy cập vào bất kỳ kiến ​​thức tên miền nào, chúng tôi chứng minh hiệu suất ngang bằng với độ chính xác đạt được bằng các thuật toán chuyên dụng và phương pháp phỏng đoán do các chuyên gia tên miền nghĩ ra. Chúng tôi đề nghị rằng các nguyên tắc đập dữ liệu có thể mở ra cơ hội để hiểu các quan sát ngày càng phức tạp, đặc biệt là khi các chuyên gia không biết phải tìm gì. " Trong tất cả các trường hợp này và không có quyền truy cập vào bất kỳ kiến ​​thức tên miền nào, chúng tôi chứng minh hiệu suất ngang bằng với độ chính xác đạt được bằng các thuật toán chuyên dụng và phương pháp phỏng đoán do các chuyên gia tên miền nghĩ ra. Chúng tôi đề nghị rằng các nguyên tắc đập dữ liệu có thể mở ra cơ hội để hiểu các quan sát ngày càng phức tạp, đặc biệt là khi các chuyên gia không biết phải tìm gì. " Trong tất cả các trường hợp này và không có quyền truy cập vào bất kỳ kiến ​​thức tên miền nào, chúng tôi chứng minh hiệu suất ngang bằng với độ chính xác đạt được bằng các thuật toán chuyên dụng và phương pháp phỏng đoán do các chuyên gia tên miền nghĩ ra. Chúng tôi đề nghị rằng các nguyên tắc đập dữ liệu có thể mở ra cơ hội để hiểu các quan sát ngày càng phức tạp, đặc biệt là khi các chuyên gia không biết phải tìm gì. "

Cách tiếp cận này đi xa hơn phù hợp với đường cong. Đó là giá trị kiểm tra.


Cảm ơn bạn - bạn đã đúng rằng những gì tôi muốn là tự động tìm các cụm, mà không cần sự can thiệp của nhà phân tích. Đối với những gì tôi muốn làm để làm việc, tôi sẽ cần chia các bộ dữ liệu 5000-15000 điểm dữ liệu thành các cụm mà mỗi công thức phù hợp với các công thức đơn giản (bao gồm cả các công thức lặp đi lặp lại) mà không cần sự can thiệp của con người vào khoảng 50000 bộ dữ liệu như vậy trong khung thời gian có thể chấp nhận được bởi con người trên phần cứng máy tính trong nước.
whybird

Đối với đường cong nào phù hợp với từng cụm, một khi tôi đã phát hiện ra các ranh giới bằng bất kỳ phương tiện nào, tôi nghĩ đơn giản là chỉ cần thử các mô hình khác nhau (sóng hình sin, đa thức, hàm mũ) và xem cái nào mang lại mức bình thường tốt hơn r ^ 2.
whybird

2
OK, tôi nghĩ rằng thông tin sai lệch phát sinh từ điều này: Sax và iSax là các định dạng biểu diễn để lưu trữ và xử lý chuỗi thời gian, chúng không phải là thuật toán phát hiện phân cụm hoặc phân đoạn / mẫu (trên mỗi bài đăng của OP). Tôi hiểu từ câu trả lời của bạn là Keogh đã đưa ra một thuật toán dựa trên định dạng đại diện SAX và tình cờ giải quyết vấn đề của OP. Nhưng tôi nghĩ đây không phải là ý bạn?
Zhubarb

2
OK, không cần phải tiếp cận với Keogh, tôi biết về iSaxSax , chúng là các định dạng đại diện để khai thác hiệu quả chuỗi thời gian. Các liên kết giải thích chúng. iSax là phiên bản mới hơn. Tôi rất phấn khích vì sự hiểu lầm của tôi về câu trả lời của bạn, do đó các câu hỏi (không cố gắng mang tính mô phạm) :).
Zhubarb

2
Tôi đã không cố gắng che giấu bất cứ điều gì, tôi đã giải thích 'thói quen isax' là một thuật toán hoạt động trên isax. Tôi đề nghị câu trả lời của bạn cần diễn đạt lại / sửa đổi sau khi làm rõ.
Zhubarb

2

Việc phát hiện các điểm thay đổi trong chuỗi thời gian yêu cầu xây dựng mô hình ARIMA toàn cầu mạnh mẽ (chắc chắn bị thiếu sót bởi thay đổi mô hình và thay đổi tham số theo thời gian trong trường hợp của bạn) và sau đó xác định điểm thay đổi quan trọng nhất trong các tham số của mô hình đó. Sử dụng các giá trị 509 của bạn, điểm thay đổi đáng kể nhất là vào khoảng 353. Tôi đã sử dụng một số thuật toán độc quyền có sẵn trong AUTOBOX (mà tôi đã giúp phát triển) có thể được cấp phép cho ứng dụng tùy chỉnh của bạn. Ý tưởng cơ bản là tách dữ liệu thành hai phần và khi tìm thấy điểm thay đổi quan trọng nhất, hãy phân tích lại từng khoảng thời gian của hai khoảng thời gian riêng biệt (1-352; 353-509) để xác định các điểm thay đổi tiếp theo trong mỗi hai bộ. Điều này được lặp lại cho đến khi bạn có k tập con. Tôi đã đính kèm bước đầu tiên sử dụng phương pháp này.nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


Tại sao 353 bị gắn cờ khi 153 và 173 có giá trị P thấp hơn?
Nick Cox

@NickCox Câu hỏi hay! Nhận xét tuyệt vời Đối với mục đích dự báo, toàn bộ ý tưởng là tách biệt tập hợp con gần đây nhất (đáng kể) khỏi tập hợp cũ hơn, đó là lý do tại sao 353 won .... Đối với mục đích ở đây, người ta thực sự sẽ chọn 173.
IrishStat

Tiêu đề "ĐIỂM BREAK
TÍN HIỆU TUYỆT VỜI NHẤT

Cảm ơn bạn! Điều này thực sự thú vị và được đánh giá cao. Tôi có thể liên lạc với bạn để biết thêm chi tiết.
whybird

Cảm ơn đã giải thích: ý tưởng thực sự rõ ràng trong ghi chú cuối cùng. (tình cờ, tôi đã không nhìn thấy quá nhiều UPPER CASE trong đầu ra chương trình từ khoảng đầu những năm 1990 Tôi muốn giới thiệu thay đổi "95% mức độ tin cậy" đến "5% mức ý nghĩa" giả định đó là những gì có ý nghĩa..)
Nick Cox

2

Tôi nghĩ rằng tiêu đề của chủ đề là sai lệch: Bạn không muốn so sánh các hàm mật độ nhưng bạn thực sự đang tìm kiếm sự phá vỡ cấu trúc trong một chuỗi thời gian. Tuy nhiên, bạn không xác định liệu các phá vỡ cấu trúc này được cho là được tìm thấy trong cửa sổ thời gian lăn hoặc trong nhận thức muộn bằng cách xem xét tổng lịch sử của chuỗi thời gian. Theo nghĩa này, câu hỏi của bạn thực sự là một bản sao cho điều này: Phương pháp nào để phát hiện sự phá vỡ cấu trúc trên chuỗi thời gian?

Như Rob Hyndman đã đề cập trong liên kết này, R cung cấp gói strucchange cho mục đích này. Tôi đã chơi xung quanh với dữ liệu của bạn nhưng tôi phải nói rằng kết quả đang thất vọng [là điểm dữ liệu đầu tiên thực sự là 4 hoặc được cho là 54?]:

raw = c(54,53,53,53,53,58,56,52,49,52,56,51,44,39,39,39,37,33,27,21,18,12,19,30,45,66,92,118,135,148,153,160,168,174,181,187,191,190,191,192,194,194,194,193,193,201,200,199,199,199,197,193,190,187,176,162,157,154,144,126,110,87,74,57,46,44,51,60,65,66,90,106,99,87,84,85,83,91,95,99,101,102,102,103,105,110,107,108,135,171,171,141,120,78,42,44,52,54,103,128,82,103,46,27,73,123,125,77,24,30,27,36,42,49,32,55,20,16,21,31,78,140,116,99,58,139,70,22,44,7,48,32,18,16,25,16,17,35,29,11,13,8,8,18,14,0,10,18,2,1,4,0,61,87,91,2,0,2,9,40,21,2,14,5,9,49,116,100,114,115,62,41,119,191,190,164,156,109,37,15,0,5,1,0,0,2,4,2,0,48,129,168,112,98,95,119,125,191,241,209,229,230,231,246,249,240,99,32,0,0,2,13,28,39,15,15,19,31,47,61,92,91,99,108,114,118,121,125,129,129,125,125,131,135,138,142,147,141,149,153,152,153,159,161,158,158,162,167,171,173,174,176,178,184,190,190,185,190,200,199,189,196,197,197,196,199,200,195,187,191,192,190,186,184,184,179,173,171,170,164,156,155,156,151,141,141,139,143,143,140,146,145,130,126,127,127,125,122,122,127,131,134,140,150,160,166,175,192,208,243,251,255,255,255,249,221,190,181,181,181,181,179,173,165,159,153,162,169,165,154,144,142,145,136,134,131,130,128,124,119,115,103,78,54,40,25,8,2,7,12,25,13,22,15,33,34,57,71,48,16,1,2,0,2,21,112,174,191,190,152,153,161,159,153,71,16,28,3,4,0,14,26,30,26,15,12,19,21,18,53,89,125,139,140,142,141,135,136,140,159,170,173,176,184,180,170,167,168,170,167,161,163,170,164,161,160,163,163,160,160,163,169,166,161,156,155,156,158,160,150,149,149,151,154,156,156,156,151,149,150,153,154,151,146,144,149,150,151,152,151,150,148,147,144,141,137,133,130,128,128,128,136,143,159,180,196,205,212,218,222,225,227,227,225,223,222,222,221,220,220,220,220,221,222,223,221,223,225,226,227,228,232,235,234,236,238,240,241,240,239,237,238,240,240,237,236,239,238,235)
raw = log(raw+1)
d = as.ts(raw,frequency = 12)
dd = ts.intersect(d = d, d1 = lag(d, -1),d2 = lag(d, -2),d3 = lag(d, -3),d4 = lag(d, -4),d5 = lag(d, -5),d6 = lag(d, -6),d7 = lag(d, -7),d8 = lag(d, -8),d9 = lag(d, -9),d10 = lag(d, -10),d11 = lag(d, -11),d12 = lag(d, -12))

(breakpoints(d ~d1 + d2+ d3+ d4+ d5+ d6+ d7+ d8+ d9+ d10+ d11+ d12, data = dd))
>Breakpoints at observation number:
>151 
>Corresponding to breakdates:
>163 

(breakpoints(d ~d1 + d2, data = dd))
>Breakpoints at observation number:
>95 178 
>Corresponding to breakdates:
>107 190 

Tôi không phải là người sử dụng thường xuyên của gói. Như bạn có thể thấy nó phụ thuộc vào mô hình bạn phù hợp với dữ liệu. Bạn có thể thử nghiệm với

library(forecast)
auto.arima(raw)

cung cấp cho bạn mô hình ARIMA phù hợp nhất.


Cảm ơn bạn! Tôi đã chỉnh sửa từ 'biểu đồ' từ tiêu đề; Tôi đã sử dụng nó không chính xác ban đầu và quên chỉnh sửa tiêu đề khi tôi xóa nó khỏi cơ thể trong một chỉnh sửa trước đó để phản hồi bình luận.
whybird

Dữ liệu của tôi thực sự là một chuỗi các dữ liệu liên quan đến không gian, nó không dựa trên thời gian và thường sẽ không tồn tại trên một đường thẳng hoặc thậm chí trong một mặt phẳng thường là đủ - nhưng bạn có quyền rằng ở một mức độ cơ bản nào đó có thể được xem xét như nhau đường; Tôi đoán đó có thể là một phần lý do tại sao các tìm kiếm trước đây của tôi không tìm thấy câu trả lời tôi mong đợi.
whybird

Điểm dữ liệu đầu tiên trong ví dụ đó thực sự là số 4, nhưng cũng có thể là chúng ta đã tình cờ chạm vào phần cuối của cấu trúc trước đó hoặc có lẽ đó là nhiễu; Tôi rất vui khi để nó ra ngoài như một ngoại lệ, nhưng bất kỳ hệ thống nào tôi nghĩ ra cũng sẽ phải đối phó với những thứ như vậy.
whybird

Oh, và phân tích là trong nhận thức muộn màng. Tôi sẽ chỉnh sửa câu hỏi để làm rõ.
whybird
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.