Tăng dữ liệu tuyến tính với thiết lập lại thủ công


8

Tôi có bộ dữ liệu chuỗi cảm biến theo thời gian tăng tuyến tính, với giá trị nằm trong khoảng từ 50 đến 150. Tôi đã triển khai thuật toán hồi quy tuyến tính đơn giản để phù hợp với đường hồi quy trên dữ liệu đó và tôi dự đoán ngày sẽ đạt được chuỗi 120.

Tất cả hoạt động tốt khi loạt di chuyển lên trên. Nhưng, có những trường hợp cảm biến đạt khoảng 110 hoặc 115, và nó được đặt lại; trong những trường hợp như vậy, các giá trị sẽ bắt đầu lại tại, giả sử, 50 hoặc 60.

Đây là nơi tôi bắt đầu đối mặt với các vấn đề với đường hồi quy, khi nó bắt đầu di chuyển xuống dưới và nó bắt đầu dự đoán ngày cũ. Tôi nghĩ rằng tôi chỉ nên xem xét tập hợp con của dữ liệu từ nơi nó được đặt lại trước đó. Tuy nhiên, tôi đang cố gắng để hiểu nếu có bất kỳ thuật toán có sẵn nào xem xét trường hợp này.

Tôi chưa quen với khoa học dữ liệu, sẽ đánh giá cao bất kỳ con trỏ nào để tiến xa hơn.

Chỉnh sửa: áp dụng đề xuất của nfmcclure

Trước khi áp dụng các đề xuất

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

Dưới đây là ảnh chụp nhanh những gì tôi đã nhận được sau khi chia tập dữ liệu nơi xảy ra cài đặt lại và độ dốc của hai bộ.

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

tìm giá trị trung bình của hai sườn và vẽ đường thẳng từ giá trị trung bình.

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

Được không


1
Bạn có ý tưởng đúng, ngoại trừ khi vẽ nó, bạn nên bắt đầu nơi chuỗi bắt đầu mỗi lần thiết lập lại. Để ước tính nơi nó sẽ đạt, hãy nói 120, xem bản chỉnh sửa đầu tiên của tôi trong câu trả lời của tôi.
nfmcclure

Câu trả lời:


5

Tôi nghĩ rằng đây là một vấn đề thú vị, vì vậy tôi đã viết một tập dữ liệu mẫu và một công cụ ước tính độ dốc tuyến tính trong R. Tôi hy vọng nó sẽ giúp bạn với vấn đề của bạn. Tôi sẽ đưa ra một số giả định, lớn nhất là bạn muốn ước tính độ dốc không đổi, được đưa ra bởi một số phân đoạn trong dữ liệu của bạn. Một giả định khác để phân tách các khối dữ liệu tuyến tính là 'thiết lập lại' tự nhiên sẽ được tìm thấy bằng cách so sánh các khác biệt liên tiếp và tìm ra các độ lệch chuẩn X dưới giá trị trung bình. (Tôi đã chọn 4 sd, nhưng điều này có thể thay đổi)

Đây là một biểu đồ của dữ liệu và mã để tạo ra nó ở phía dưới. Dữ liệu mẫu

Để bắt đầu, chúng tôi tìm thấy các ngắt và khớp với từng bộ giá trị y và ghi lại các sườn.

# Find the differences between adjacent points
diffs = y_data[-1] - y_data[-length(y_data)]
# Find the break points (here I use 4 s.d.'s)
break_points = c(0,which(diffs < (mean(diffs) - 4*sd(diffs))),length(y_data))
# Create the lists of y-values
y_lists = sapply(1:(length(break_points)-1),function(x){
  y_data[(break_points[x]+1):(break_points[x+1])]
})
# Create the lists of x-values
x_lists = lapply(y_lists,function(x) 1:length(x))
#Find all the slopes for the lists of points
slopes = unlist(lapply(1:length(y_lists), function(x) lm(y_lists[[x]] ~ x_lists[[x]])$coefficients[2]))

Dưới đây là các sườn dốc: (3.309110, 4.419178, 3.292029, 4.531126, 3.675178, 4.294389)

Và chúng ta chỉ có thể lấy giá trị trung bình để tìm độ dốc dự kiến ​​(3,920168).


Chỉnh sửa: Dự đoán khi loạt đạt 120

Tôi nhận ra rằng tôi đã không hoàn thành dự đoán khi chuỗi đạt tới 120. Nếu chúng tôi ước tính độ dốc là m và chúng tôi thấy thiết lập lại tại thời điểm t thành giá trị x (x <120), chúng tôi có thể dự đoán sẽ mất bao lâu để đạt được 120 bằng một số đại số đơn giản.

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

Ở đây, t là thời gian cần thiết để đạt 120 sau khi thiết lập lại, x là giá trị đặt lại và m là độ dốc ước tính. Tôi thậm chí sẽ không chạm vào chủ đề của các đơn vị ở đây, nhưng đó là cách tốt để xử lý chúng và đảm bảo mọi thứ đều có ý nghĩa.


Chỉnh sửa: Tạo dữ liệu mẫu

Dữ liệu mẫu sẽ bao gồm 100 điểm, nhiễu ngẫu nhiên với độ dốc là 4 (Hy vọng chúng tôi sẽ ước tính điều này). Khi các giá trị y đạt đến ngưỡng cắt, chúng sẽ đặt lại thành 50. Điểm cắt được chọn ngẫu nhiên trong khoảng từ 115 đến 120 cho mỗi lần đặt lại. Đây là mã R để tạo tập dữ liệu.

# Create Sample Data
set.seed(1001)
x_data = 1:100 # x-data
y_data = rep(0,length(x_data)) # Initialize y-data
y_data[1] = 50 
reset_level = sample(115:120,1) # Select initial cutoff
for (i in x_data[-1]){ # Loop through rest of x-data
  if(y_data[i-1]>reset_level){ # check if y-value is above cutoff
    y_data[i] = 50             # Reset if it is and
    reset_level = sample(115:120,1) # rechoose cutoff
  }else {
    y_data[i] = y_data[i-1] + 4 + (10*runif(1)-5) # Or just increment y with random noise
  }
}
plot(x_data,y_data) # Plot data

Tôi nghĩ rằng câu trả lời của bạn là hữu ích cho vấn đề. Chỉ cần một số gợi ý: Tôi sẽ di chuyển mã tạo dữ liệu xuống dưới cùng hoặc thậm chí đến một Gist bên ngoài, vì nó không thực sự là một phần của giải pháp được đề xuất. Và tôi sẽ giải thích thêm một chút về thực tế là bạn đang sử dụng 4 độ lệch chuẩn để phát hiện các thiết lập lại: ngay bây giờ, nó chỉ là một nhận xét bị mất trong mã và đó là cốt lõi của giải pháp của bạn.
đăng nhập

Ý tưởng tốt. Sẽ làm.
nfmcclure

Xin chào nfmcclure, tôi đã áp dụng đề xuất của bạn và cập nhật bài viết. Vui lòng cung cấp ý kiến ​​của bạn.
ArunDhaJ

3

Vấn đề của bạn là việc đặt lại không phải là một phần của mô hình tuyến tính của bạn. Bạn có thể phải cắt dữ liệu của mình thành các đoạn khác nhau tại các bộ đặt lại, để không xảy ra thiết lập lại trong mỗi phân đoạn và bạn có thể điều chỉnh mô hình tuyến tính cho từng phân đoạn. Hoặc bạn có thể xây dựng một mô hình phức tạp hơn cho phép đặt lại. Trong trường hợp này, thời gian xuất hiện của các bộ đặt lại phải được đưa vào mô hình theo cách thủ công hoặc thời gian đặt lại phải là một tham số miễn phí trong mô hình được xác định bằng cách khớp mô hình với dữ liệu.

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.