2010-03-25 34 views
8

Nội suy các tập dữ liệu lớnInterpolating Large Datasets On the Fly

Tôi có một tập dữ liệu lớn khoảng 0,5 triệu bản ghi tỷ giá hối đoái giữa USD/GBP trong một ngày nhất định.

Tôi có một ứng dụng muốn có thể vẽ đồ thị dữ liệu này hoặc có thể là tập hợp con. Vì lý do hiển nhiên, tôi không muốn vẽ 0,5 triệu điểm trên biểu đồ của mình.

Điều tôi cần là tập hợp dữ liệu nhỏ hơn (100 điểm hoặc hơn), chính xác (càng tốt) đại diện cho dữ liệu đã cho. Có ai biết về bất kỳ cách thú vị và thực hiện nào mà dữ liệu này có thể đạt được không?

Chúc mừng, Karl

+1

bạn có thể làm rõ "đại diện" - ý của bạn chỉ là trực quan, hoặc với mục đích thực hiện tính toán? – Carl

+0

Kết quả cuối cùng sẽ là tập dữ liệu của một loại mà sau đó có thể được xử lý và vẽ đồ thị – Karl

+1

Âm thanh như một công việc cho R! – Joel

Trả lời

3

Một ý nghĩ là sử dụng DBMS để nén dữ liệu cho bạn bằng truy vấn thích hợp. Một cái gì đó dọc theo dòng của nó có mất một trung bình cho một phạm vi cụ thể, một giả truy vấn:

SELECT truncate_to_hour(rate_ts), median(rate) FROM exchange_rates 
WHERE rate_ts >= start_ts AND rate_ts <= end_ts 
GROUP BY truncate_to_hour(rate_ts) 
ORDER BY truncate_to_hour(rate_ts) 

đâu truncate_to_hour là một cái gì đó phù hợp với DBMS của bạn. Hoặc một cách tiếp cận tương tự với một số loại hàm để phân đoạn thời gian thành các khối duy nhất (chẳng hạn như khoảng thời gian 5 phút gần nhất), hoặc một hàm toán học khác để tổng hợp nhóm thích hợp thay cho vị trí trung bình. Do sự phức tạp của quy trình phân đoạn thời gian và cách DBMS của bạn tối ưu hóa, có thể hiệu quả hơn khi chạy truy vấn trên bảng tạm thời với giá trị thời gian được phân đoạn.

1

Một cái gì đó như RRDTool sẽ làm những gì bạn cần tự động - tutorial sẽ giúp bạn bắt đầu và drraw sẽ vẽ đồ thị dữ liệu.

Tôi sử dụng công việc này cho những thứ như đồ thị lỗi, tôi không cần độ phân giải 1 phút trong khoảng thời gian 6 tháng, chỉ trong vài giờ gần đây nhất. Sau đó tôi có độ phân giải 1 giờ trong vài ngày, sau đó là độ phân giải 1 ngày trong vài tháng.

1

Nếu bạn muốn viết riêng, một giải pháp rõ ràng là phá vỡ kỷ lục của bạn thành các khối số cố định, giá trị trung bình (trung bình, trung bình, ... chọn một) . Điều này có lợi thế có thể xảy ra là nhanh nhất và hiển thị xu hướng tổng thể.

Nhưng thiếu bộ phim giá. Một giải pháp tốt hơn có lẽ sẽ liên quan đến việc tìm kiếm các điểm uốn, sau đó chọn trong số đó bằng cách sử dụng các cửa sổ trượt. Điều này có lợi thế là hiển thị tốt hơn các sự kiện thực tế trong ngày, nhưng sẽ chậm hơn.

4

Có một số phương pháp thống kê để giảm tập dữ liệu lớn thành tập dữ liệu hình ảnh nhỏ hơn, dễ dàng hơn. Nó không rõ ràng từ câu hỏi của bạn thống kê tóm tắt mà bạn muốn. Tôi đã giả định rằng bạn muốn xem tỷ giá hối đoái thay đổi như thế nào theo thời gian, nhưng có lẽ bạn quan tâm đến tần suất tỷ giá hối đoái vượt trên một giá trị nhất định hoặc một số thống kê khác mà tôi không xem xét.

Tóm tắt một xu hướng theo thời gian

Dưới đây là một ví dụ sử dụng phương pháp lowess trong R (từ tài liệu trên scatter plot smoothing): điều khiển f

> library(graphics) 
# print out the first 10 rows of the cars dataset 
> cars[1:10,] 
    speed dist 
1  4 2 
2  4 10 
3  7 4 
4  7 22 
5  8 16 
6  9 10 
7  10 18 
8  10 26 
9  10 34 
10 11 17 

# plot the original data 
> plot(cars, main = "lowess(cars)") 
# fit a loess-smoothed line to the points 
> lines(lowess(cars), col = 2) 
# plot a finger-grained loess-smoothed line to the points 
> lines(lowess(cars, f=.2), col = 3) 

Tham số cách chặt chẽ các hồi quy phù hợp để dữ liệu của bạn. Sử dụng một số chu đáo với điều này, như bạn muốn một cái gì đó mà chính xác phù hợp với dữ liệu của bạn mà không overfitting.Thay vì tốc độ và khoảng cách, bạn có thể vẽ tỷ giá hối đoái so với thời gian.

Cũng dễ dàng truy cập vào kết quả làm mịn. Dưới đây là cách thực hiện:

> data = lowess(cars$speed, cars$dist) 
> data 
$x 
[1] 4 4 7 7 8 9 10 10 10 11 11 12 12 12 12 13 13 13 13 14 14 14 14 15 15 15 16 16 17 17 17 18 18 18 18 19 19 
[38] 19 20 20 20 20 20 22 23 24 24 24 24 25 

$y 
[1] 4.965459 4.965459 13.124495 13.124495 15.858633 18.579691 21.280313 21.280313 21.280313 24.129277 24.129277 
[12] 27.119549 27.119549 27.119549 27.119549 30.027276 30.027276 30.027276 30.027276 32.962506 32.962506 32.962506 
[23] 32.962506 36.757728 36.757728 36.757728 40.435075 40.435075 43.463492 43.463492 43.463492 46.885479 46.885479 
[34] 46.885479 46.885479 50.793152 50.793152 50.793152 56.491224 56.491224 56.491224 56.491224 56.491224 67.585824 
[45] 73.079695 78.643164 78.643164 78.643164 78.643164 84.328698 

Đối tượng dữ liệu mà bạn lấy lại chứa các mục có tên x và y, tương ứng với giá trị x và y được chuyển vào hàm lowess. Trong trường hợp này, x và y đại diện cho tốc độ và khoảng cách.

0

Cách tạo trình bao bọc/liệt kê. Tôi không quen với Java, nhưng nó có thể trông giống như:

class MedianEnumeration implements Enumeration<Double> 
{ 
    private Enumeration<Double> frameEnum; 
    private int frameSize; 

    MedianEnumeration(Enumeration<Double> e, int len) { 
     frameEnum = e; 
     frameSize = len; 
    } 

    public boolean hasMoreElements() { 
     return frameEnum.hasMoreElements(); 
    } 

    public Double nextElement() { 
     Double sum = frameEnum.nextElement(); 

     int i; 
     for(i=1; (i < frameSize) && (frameEnum.hasMoreElements()); ++i) { 
      sum += (Double)frameEnum.nextElement(); 
     } 

     return (sum/i); 
    } 
} 
1

Cách tiếp cận ngây thơ đơn giản là tính trung bình cho mỗi khoảng thời gian tương ứng với pixel.

http://commons.wikimedia.org/wiki/File:Euro_exchange_rate_to_AUD.svg

Điều này không hiển thị dấu chấm câu. Tôi cũng khuyên bạn nên tính toán độ lệch chuẩn trong mỗi khoảng thời gian và âm mưu quá (về cơ bản làm cho mỗi pixel cao hơn một pixel). Tôi không thể tìm thấy một ví dụ, nhưng tôi biết rằng Gnuplot có thể làm điều này (nhưng không được viết bằng Java).

+0

Giải pháp _really_ ngây thơ sẽ đơn giản là lấy mọi giá trị N-th. Tôi hy vọng lấy ví dụ mọi giá trị thứ 100 trong bộ dữ liệu 100k sẽ vẫn cung cấp hình ảnh rất tốt về lịch sử của giá trị đo được và không phương pháp nào khác có thể chạm vào nó về hiệu suất. –

+0

Đúng. Có vẻ như tốc độ quan trọng hơn độ chính xác của pixel. –

+0

Câu trả lời này có vẻ lạ lùng ... quen thuộc. ;] – CPerkins

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