2013-07-11 70 views
6

Tôi có vấn đề về thuật toán. Tôi không biết nếu stackoverflow là đúng nơi để đăng nó, nhưng kể từ khi tôi sử dụng MATLAB và muốn làm điều này với nó, tôi đăng nó ở đó. Vấn đề của tôi là như sau: Tôi có một bộ dữ liệu và tôi không biết nhiều về nó ngoại trừ thực tế là ở cuối tập này, các điểm phải khá tuyến tính. Tôi muốn làm cho một sự phù hợp tuyến tính của những điểm này được phân phối tuyến tính mà không sử dụng một phần mà không phải là.Thuật toán để thực hiện sự phù hợp đa thức của một bộ dữ liệu

(một hình ảnh luôn luôn là tốt hơn để hiểu): enter image description here

Như bạn thấy đó, tôi có dữ liệu màu xanh, đó không phải là tuyến tính nhưng mà có một phần tuyến tính vào cuối (phần màu đỏ). Những gì tôi muốn, là tìm một thuật toán cho phép tôi biết khi nào hành vi của đường cong dữ liệu kết thúc tuyến tính của nó.

Tôi không biết mình có rõ ràng không?

Tôi đã thử bằng cách lấy một vài điểm ở bên phải và tạo nét phù hợp tuyến tính cho một vài điểm đó. Sau đó, thêm một số điểm vào số ít và kiểm tra xem những điểm đó có "đủ gần" của sự phù hợp tuyến tính hay không. Sau đó, làm cho một lần nữa phù hợp tuyến tính với các điểm thêm và như vậy nhưng tôi nghĩ rằng nó không phải là giải pháp tốt nhất bởi vì các điểm "đầu tiên" có rất nhiều tiếng ồn (không được đại diện ở đây trên hình ảnh) ...

bạn có bất kỳ ý tưởng hoặc đề xuất hoặc liên kết nào không?

Cảm ơn bạn!

+0

nó sẽ luôn luôn trở thành gần như tuyến tính cuối cùng? hoặc bạn quan tâm đến đường thẳng dài nhất trong bất kỳ phân khúc nào? – Fallen

+0

@ Fallen Tôi không chắc chắn rằng nó sẽ luôn luôn làm như vậy, nhưng tôi nghĩ rằng trong nhiều trường hợp, nó sẽ được khá tuyến tính. Ý của bạn là gì bởi 'đường thẳng dài nhất trong bất kỳ phân khúc' nào? – mwoua

+0

Tôi có nghĩa là bạn quan tâm đến phân đoạn đường thẳng duy nhất kết thúc tại đầu vào cuối cùng của dữ liệu? – Fallen

Trả lời

4

Điều tôi muốn, là tìm một thuật toán cho phép tôi biết khi nào hành vi của đường cong dữ liệu kết thúc tuyến tính của nó.

Dữ liệu tuyến tính có đặc tính đẹp đặc biệt, có độ dốc không đổi.Đạo hàm thứ hai của một phần tuyến tính sẽ xấp xỉ bằng không.

Sử dụng phù hợp với đường spline (với một số loại làm mịn nếu dữ liệu bị nhiễu) để lấy phiên bản dữ liệu liên tục, hãy gọi số g(x). Khi g''(x) ~ 0, tức là khi đạo hàm thứ hai nhỏ, đây là phần tuyến tính.

+0

Đây là một ý tưởng hay! – mwoua

+2

Thật vậy, nó là; và nó có thể được thực hiện khá hiệu quả. Bạn thậm chí không cần chuyển đổi dữ liệu thành liên tục. [Bạn có thể tính toán đạo hàm thứ hai của dữ liệu rời rạc,] (http://en.wikipedia.org/wiki/Finite_difference) và sau đó tìm kiếm các khu vực mà phái sinh thứ hai nằm trong một ngưỡng nhỏ. Đây là một câu hỏi SO khác với thuật toán chính xác này được triển khai trong Python http://stackoverflow.com/questions/13691775/python-pinpointing-the-linear-part-of-a-slope – darksky

+0

@darksky Cảm ơn bạn rất nhiều. Đây là kết quả của tôi http://stackoverflow.com/q/17652128/2320757 . Như bạn có thể thấy, tôi phải đối mặt với một vấn đề khác. Nếu bạn có thời gian, bạn có thể kiểm tra nó không? :) Cảm ơn! – mwoua

1

Đoạn mã dữ liệu của bạn được đặt theo vị trí x và sau đó đặt một số điểm ngắt cho tuyến tính.

  • Bắt đầu ở một đầu
  • Kiểm tra hệ số pearson tương quan của phần được xác định trước tiếp theo của đồ thị
  • Nếu trên một ngưỡng nhất định thêm phần bao gồm của x để phạm vi của bạn, nếu không dừng lại ở đó

Cách khác bạn có thể kiểm tra tuyến tính là phù hợp nhất với một số phụ kiện đa thức. Cho rằng tôi sẽ:

  • Xác định một vài chức năng chung của trật tự 1-n trong đó n là khá nhỏ (có thể 3)
  • Thêm điểm dữ liệu để kiểm tra tuyến tính thiết lập
  • Hãy so sánh hình vuông giá trị nhỏ nhất của n chức năng
  • Nếu tuyến tính có giá trị hình vuông nhỏ nhất thấp nhất hoặc nằm trong khoảng cách tối thiểu của hàm n của bạn, hãy tiếp tục thêm điểm. Nếu không dừng lại và nói rằng hàm này là tuyến tính trước lần bổ sung cuối cùng.

Đó là những cách khá đơn giản, và trong tâm dao cạo của Occam, chúng cũng có độ phức tạp thấp nhất (n * đường cong vừa vặn trong cả hai trường hợp, mặc dù thứ hai có hằng số lớn hơn.) , mặc dù rất có thể có các thuật toán phức tạp thấp hơn ngoài kia.

+0

Tôi sẽ cố gắng này nhưng nó khá giống như trước đây tôi đã làm. Cảm ơn anyway – mwoua

+0

@mwoua bạn cũng có thể recurse tại các phần phi tuyến tính và nhận được tất cả các phần tuyến tính, nhưng tôi không chắc chắn nếu đó là có giá trị cho bạn. –

0

Nếu bạn có hành vi tuyến tính piecewise với các chuyển động đột ngột, bạn có thể thử một sự phù hợp của mẫu

E[Y] = b0 + b1 * x + b2 * I + b3 * x * I 

nơi tôi là một indicator function đó là 1 khi một số điều kiện được đáp ứng và 0 nếu ngược lại. Ví dụ của bạn, điều kiện có thể là x > 0. Hệ số b2 sẽ nắm bắt chuyển vị thẳng đứng nếu hai đoạn là song song, trong khi cụm từ b3 là một "tương tác" có thể nắm bắt các biến thể độ dốc ở hai bên của điểm dừng chỉ báo.

Nếu quá trình chuyển đổi dần dần, như bạn đã vẽ, thì tôi đồng ý với nhận xét của @ A.Webb về hậu cần với xu hướng.

1

Một cách sẽ là xấp xỉ nó với 2 đa thức với nhiều điểm hơn từ phải sang trái và theo dõi cho hệ số thứ ba. Vì nó vẫn đủ nhỏ, phân phối cũng đủ tuyến tính.

Vấn đề là khó có thể thiết lập "đủ nhỏ" theo các con số khác theo kinh nghiệm.

Cách khác có thể là so sánh xấp xỉ tuyến tính so với dữ liệu thực. Cùng một cách thêm điểm từ phải sang trái đo lường độ lệch standart xấp xỉ. Ngay sau khi nó đạt yêu cầu, phép tính xấp xỉ là tốt và dữ liệu có thể được tính theo tuyến tính.

Và đó là một chút tốt hơn, bởi vì độ lệch là một khái niệm khá minh bạch.

Các vấn đề liên quan