Fit dữ liệu tuyến tính phù hợp


18

Một cách mạnh mẽ để phù hợp với dữ liệu tuyến tính nhưng ồn ào là gì?

Tôi đang đo một tín hiệu, bao gồm một số đoạn gần như tuyến tính. Tôi muốn điều chỉnh một cách tự nhiên một số dòng cho dữ liệu để phát hiện các chuyển đổi.

Bộ dữ liệu bao gồm vài nghìn điểm, với 1-10 phân đoạn và tôi biết số lượng phân khúc.

Đây là một ví dụ về những gì tôi muốn làm tự động.

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


Tôi không nghĩ câu hỏi này có thể được trả lời một cách hợp lý trừ khi bạn cho chúng tôi biết chính xác bạn muốn biết vị trí của các điểm dừng như thế nào, dự đoán của bạn là gì cho độ dài ngắn nhất của một đoạn tuyến tính và có bao nhiêu mẫu trong một điển hình vùng chuyển tiếp. Nếu các nhãn trục ngang trong hình của bạn là số mẫu, thì, với hai lần chuyển đổi trong khoảng từ sang , nhiệm vụ sẽ khó khăn hơn nếu các đoạn thẳng có thời lượng dài hơn (trong mẫu). x [ 0 ]x[5]x[0]
Dilip Sarwate

@DilipSarwate Tôi đã cập nhật Câu hỏi với các yêu cầu (btw xaxis là từ trường trong tesla)
P3trus

Bạn có thể thử hộp công cụ này nếu bạn đang làm việc với hộp công cụ khớp đường cong
Rhei

Câu trả lời:


12

Tôi đã thử hai cách tiếp cận, ngây thơ (chỉ sử dụng 3 phân đoạn). Chắc chắn sẽ có phương pháp fancier ngoài kia.

    RANSAC, được cho là một cơ chế phù hợp mạnh mẽ. Thật dễ dàng để dừng thuật toán sau một số phân đoạn. Tuy nhiên, có thể khó thực thi tính liên tục giữa các phân đoạn - như có vẻ bắt buộc trong ứng dụng của bạn - ít nhất là với một triển khai đơn giản. Để chứng minh khái niệm, tôi đã tạo một hình ảnh từ các điểm dữ liệu để tôi có thể sử dụng công cụ RANSAC có sẵn trong , chức năng phát hiện dòng của Mathicala.ImageLineS

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

    Lắp một mô hình tuyến tính từng phần bằng cách sử dụng bộ giảm thiểu mục đích chung. Thật dễ dàng để thực thi các phân đoạn liên tục. Thật thú vị, thử nghiệm cho phần dư và các thuộc tính khác có thể cung cấp đủ thông tin để tự động xác định số lượng phân khúc - mặc dù tôi chưa thử. Đó là giao diện của Mathicala:

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


Trông giống như một câu trả lời tuyệt vời. Cảm ơn đã đóng góp.
Jason R

7

x[n]

  • x[n]y[n]

    y[n]= ={1,nếu |(x[n+1]-x[n])-(x[n]-x[n-1])|<ε,0,nếu không thì.
    εx[n1],x[n],x[n+1](n1,x[n1])(n,x[n])(n,x[n])(n+1,x[n+1])
  • y[n]1011ϵ

  • y[n]x[3]x[88]x[94]x[120]x[129], và như thế. Kéo dài A sang phải và B sang trái để tìm nơi chúng giao nhau; mở rộng B sang phải và C sang trái để tìm ra nơi chúng giao nhau, v.v ... Xin chúc mừng, giờ đây bạn đã có một mô hình tuyến tính liên tục và từng phần cho dữ liệu của mình.


Hoàn toàn đánh cắp câu trả lời của tôi! =)
Phonon

Ý tưởng can thiệp nhưng đáng buồn là do nhiễu trên tín hiệu Tôi không nhận được kết quả tốt.
P3trus

1
Biểu thức mà đại học của nó đang được so sánh với epsilon thực sự là một xấp xỉ với đạo hàm thứ hai của dữ liệu. Có nhiều cách khác để tính toán điều này bằng cách sử dụng nhiều hơn ba điểm mà không phản hồi với nhiễu nhiều như vậy. Tra cứu Savitzky-Golay.
DarenW

4

(Năm sau) các hàm piecewise-linear là các spline bậc 1, mà hầu hết các hàm spline có thể được yêu cầu làm. ví dụ scipy.interpolate.UnivariateSpline có thể được chạy với k=1 và một tham số làm mịn s, mà bạn sẽ phải chơi với - xem scipy-interpolation-with-univariate-splines .
Trong Matlab, xem cách chọn nút thắt .

Đã thêm: tìm kiếm các nút thắt tối ưu là không dễ dàng, bởi vì có thể có nhiều tối ưu cục bộ. Thay vào đó, bạn cung cấp cho UnivariateSpline một mục tiêu s, tổng lỗi ^ 2 và để nó xác định số lượng nút thắt. Sau khi lắp, get_residual()sẽ nhận được tổng số lỗi thực tế ^ 2 và get_knots()các nút thắt. Một thay đổi nhỏ trong scó thể thay đổi các nút thắt rất nhiều, đặc biệt là trong tiếng ồn cao - ymmv.
Cốt truyện cho thấy phù hợp với chức năng tuyến tính ngẫu nhiên ngẫu nhiên + nhiễu cho nhiều loại khác nhau s.

Để biết các hằng số piecewise phù hợp, xem Bước phát hiện . Điều đó có thể được sử dụng cho tuyến tính pw? Đừng biết; bắt đầu bằng cách phân biệt dữ liệu nhiễu sẽ làm tăng tiếng ồn, sai.

Các chức năng kiểm tra khác, và / hoặc liên kết đến giấy tờ hoặc mã, sẽ được hoan nghênh. Một vài liên kết:
piecewise-linear-regression-with-knots-as -ameter
Các spline tuyến tính rất nhạy cảm với các nút được đặt
nút chọn-cho-khối-hồi quy-splines
Đây là một vấn đề khó khăn và hầu hết mọi người chỉ chọn các nút thắt bằng cách dùng thử và lỗi.
Thay vào đó, một cách tiếp cận đang ngày càng phổ biến là sử dụng các spline hồi quy bị phạt thay thế.


Đã thêm vào tháng 3 năm 2014: Lập trình động là một phương pháp chung cho các vấn đề với các bài toán con lồng nhau như thế này:

optimal k lines
    = optimal k - 1 lines up to some x
    + cost of the last line x to the end
over x  (all x in theory, nearby x in practice)

Lập trình động rất thông minh, nhưng liệu nó có thể đánh bại lực lượng vũ phu + heuristic cho nhiệm vụ này không?
Xem các ghi chú khóa học tuyệt vời của Erik Demaine trong MIT 6,006 Giới thiệu về thuật toán
cũng là hồi quy tuyến tính phân đoạn google
cũng hội chứng John Henry.


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


Vấn đề, ít nhất là với scipy là vị trí của các nút thắt. scipy sử dụng các nút cách đều nhau.
P3trus

@ P3trus, có để bắt đầu, nhưng sau đó họ có thể di chuyển - xem cốt truyện. Dù sao nó cũng nhắm mục tiêu tổng lỗi, không phải nút thắt.
chối

@ P3trus Bạn đã thử sử dụng phương pháp splines hồi quy đa biến tự động chọn các điểm dừng lặp chưa? cs.rtu.lv/jekabsons/regression.html
Atul Ingle

@Atul Ingle, lựa chọn điểm dừng / nút afaik là cùng một vấn đề, từ bất cứ điều gì spline fitter. Nếu bạn biết các thuật toán khác nhau cho điều đó từ người R / hồi quy, bạn có thể gửi một liên kết không?
chối

Đang tìm kiếm các gói trong R / Matlab thực hiện các phép hồi quy thích ứng? Tại đây: cran.r-project.org/web/packages/earth/index.html cran.r-project.org/web/packages/mda/index.html và cả ARESLab trong Matlab mà tôi đã đăng liên kết.
Atul Ingle

0

Lấy đạo hàm và tìm các khu vực có giá trị gần như không đổi. Bạn sẽ cần tạo thuật toán để tìm kiếm các khu vực đó với độ dốc +/- lý tưởng và điều đó sẽ cung cấp cho bạn độ dốc của đường cho phần đó. Bạn có thể muốn thực hiện một số làm mịn, như một phương tiện trượt, trước khi thực hiện phân loại mặt cắt. Bước tiếp theo sẽ là giao điểm y, điều này không quan trọng ở điểm đó.


phái sinh có thể gây ồn ào. Tôi không nghĩ rằng tôi sẽ khuyên bạn nên điều đó.
robert bristow-johnson

0

Sử dụng bộ lọc xu hướng l1 là một ý tưởng khác:

Giấy

Ví dụ trực tuyến


1
Câu trả lời của bạn là một chút quá ngắn để được xây dựng! Hãy xem xét nỗ lực để mở rộng nó theo cách sư phạm.
sansuiso
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.