Tìm điểm cực trị cục bộ của hàm mật độ bằng splines


14

Tôi đang cố gắng tìm cực đại cục bộ cho hàm mật độ xác suất (được tìm thấy bằng densityphương pháp R ). Tôi không thể thực hiện một phương pháp "nhìn xung quanh hàng xóm" đơn giản (trong đó người ta nhìn quanh một điểm để xem đó có phải là mức tối đa cục bộ so với các nước láng giềng không) vì có một khối lượng dữ liệu lớn. Hơn nữa, có vẻ hiệu quả và chung chung hơn khi sử dụng một cái gì đó như phép nội suy Spline và sau đó tìm ra gốc của đạo hàm 1, trái ngược với việc xây dựng một "cái nhìn xung quanh hàng xóm" với khả năng chịu lỗi và các tham số khác.

Vì vậy, câu hỏi của tôi:

  1. Cho một hàm từ splinefun, phương thức nào sẽ tìm cực đại cục bộ?
  2. Có một cách dễ dàng / tiêu chuẩn để tìm các đạo hàm của hàm được trả về bằng cách sử dụng splinefunkhông?
  3. Có cách nào tốt hơn / tiêu chuẩn để tìm cực đại cục bộ của hàm mật độ xác suất không?

Để tham khảo, dưới đây là một biểu đồ của hàm mật độ của tôi. Các hàm mật độ khác mà tôi đang làm việc có dạng tương tự. Tôi nên nói rằng tôi chưa quen với R, nhưng không mới về lập trình, vì vậy có thể có một thư viện hoặc gói tiêu chuẩn để đạt được những gì tôi cần. hàm mật độ

Cảm ơn bạn đã giúp đỡ!!


Tôi không rõ tại sao khối lượng dữ liệu lớn lại là một vấn đề đối với phương pháp 'nhìn xung quanh hàng xóm'. density()không ước tính mật độ cho mỗi mốc thời gian, nó ước tính mật độ tại n giá trị, trong đó n là tham số do người dùng chỉ định với giá trị mặc định n = 512.
onestop

Số n của tôi cho điều này là 2 ^ 15 và dường như dữ liệu có nhiều phương sai ở cấp độ điểm. Tôi đã thử viết một công cụ tìm tối đa / phút bằng cách sử dụng một cái gì đó tương tự như phương pháp lân cận (thông qua msExtrema {msProcess}) và chỉ có thể xác định một vài mức tối đa, không bao giờ là tất cả, bằng cách chơi với các cài đặt dung sai.
aaronlevin

2
Nhìn vào mã cho msExtrema, đó là một wrapper đơn giản cho peakstừ splus2Rgói mà bạn muốn được tốt hơn bằng cách sử dụng trực tiếp nếu bạn chỉ muốn cực đại địa phương và không phải là cực tiểu địa phương. Tôi không thể hiểu tại sao sử dụng mặc định span=3sẽ không tìm thấy tất cả các cực đại cục bộ. Và 2 ^ 15 = 32768 không nên đủ lớn để hiệu quả trở thành một mối lo ngại lớn.
vào

Hàm được trả về bởi splinefun có đối số "deriv" ​​là 0 theo mặc định. Đặt đạo hàm = 1 cho đạo hàm đầu tiên.
Cyan

1
Hmm, có peaksvẻ là lỗi: Nó gọi max.colvới cài đặt mặc định ties.method = "random", nó không chỉ phá vỡ các mối quan hệ một cách ngẫu nhiên mà còn đặt ra dung sai tương đối là 1e-5 để khai báo một cà vạt. Cái trước khó hiểu, cái sau chắc chắn không phải là thứ bạn muốn ở đây. peaks()cũng có một stricttham số được ghi lại kém và, nhìn vào mã của hàm, không có gì. Ah, niềm vui của các thư viện phần mềm do người dùng đóng góp! Mặc dù vậy, bạn cũng có thể sửa nó, vì bạn nói rằng bạn không phải là người mới trong lập trình,
vào

Câu trả lời:


13

Những gì bạn muốn làm được gọi là phát hiện cực đại trong hóa học. Có nhiều phương pháp bạn có thể sử dụng cho việc đó. Tôi chỉ chứng minh một cách tiếp cận rất đơn giản ở đây.

require(graphics)
#some data
d <- density(faithful$eruptions, bw = "sj")

#make it a time series
ts_y<-ts(d$y)

#calculate turning points (extrema)
require(pastecs)
tp<-turnpoints(ts_y)
#plot
plot(d)
points(d$x[tp$tppos],d$y[tp$tppos],col="red")

Trong tất cả các giải pháp, điều này làm việc tốt nhất. 1. Câu hỏi tiếp theo: có cách nào để thay đổi dung sai với các điểm quay đầu không? Tìm thấy rất nhiều Đỉnh và Thung lũng trong phần đuôi dài của hàm Mật độ. 2. Câu hỏi tiếp theo # 2: cách tốt để xác định sự khoan dung là gì?
aaronlevin

quảng cáo 1. Tôi không nghĩ vậy. Nó được dùng để kiểm tra tính ngẫu nhiên của chuỗi thời gian, vì vậy hàm không cần điều đó. Bạn có thể thử kiểm tra mức độ liên quan / tầm quan trọng của một đỉnh. Ví dụ, bạn có thể thực hiện kiểm tra t đối với khu phố (nơi bạn có thể quyết định khu phố nên lớn như thế nào). Hoặc bạn có thể tìm kiếm một hàm tinh vi hơn trong các gói R để đánh giá dữ liệu từ phép đo phổ (khối lượng) hoặc các phương pháp hóa học phân tích khác.
Roland
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.