Làm thế nào để mô phỏng dữ liệu chức năng?


12

Tôi đang cố gắng thử nghiệm các phương pháp phân tích dữ liệu chức năng khác nhau. Lý tưởng nhất, tôi muốn kiểm tra bảng phương pháp tiếp cận tôi có trên dữ liệu chức năng mô phỏng. Tôi đã cố gắng tạo FD mô phỏng bằng cách sử dụng một cách tiếp cận dựa trên tiếng ồn Gaussian tổng hợp (mã bên dưới), nhưng các đường cong kết quả trông quá gồ ghề so với thực tế .

Tôi đã tự hỏi liệu ai đó có một con trỏ đến các chức năng / ý tưởng để tạo ra dữ liệu chức năng mô phỏng trông thực tế hơn. Đặc biệt, những điều này nên được trơn tru. Tôi hoàn toàn mới đối với lĩnh vực này vì vậy mọi lời khuyên đều được hoan nghênh.

library("MASS")
library("caTools")
VCM<-function(cont,theta=0.99){
    Sigma<-matrix(rep(0,length(cont)^2),nrow=length(cont))
    for(i in 1:nrow(Sigma)){
        for (j in 1:ncol(Sigma)) Sigma[i,j]<-theta^(abs(cont[i]-cont[j]))
    }
    return(Sigma)
}


t1<-1:120
CVC<-runmean(cumsum(rnorm(length(t1))),k=10)
VMC<-VCM(cont=t1,theta=0.99)
sig<-runif(ncol(VMC))
VMC<-diag(sig)%*%VMC%*%diag(sig)
DTA<-mvrnorm(100,rep(0,ncol(VMC)),VMC)  

DTA<-sweep(DTA,2,CVC)
DTA<-apply(DTA,2,runmean,k=5)
matplot(t(DTA),type="l",col=1,lty=1)

1
Bạn có thể chỉ mô phỏng dữ liệu có nghĩa là một hàm trơn đã biết và thêm nhiễu ngẫu nhiên không? Ví dụ:x=seq(0,2*pi,length=1000); plot(sin(x)+rnorm(1000)/10,type="l");
Macro

@Macro: nop, nếu bạn phóng to âm mưu của mình, bạn sẽ thấy các chức năng được tạo bởi nó không trơn tru. So sánh chúng với một số đường cong trên các slide này: bscb.cornell.edu/~hooker/FDA2007/Lecture1.pdf . Một spline được làm mịn của x của bạn có thể thực hiện thủ thuật, nhưng tôi đang tìm cách trực tiếp để tạo dữ liệu.
user603

bất cứ khi nào bạn bao gồm tiếng ồn (vốn là một phần cần thiết của bất kỳ mô hình ngẫu nhiên nào), dữ liệu thô sẽ, không phải là trơn tru. Sự phù hợp spline mà bạn đang đề cập là giả sử tín hiệu mượt mà - không phải dữ liệu quan sát thực tế (là sự kết hợp giữa tín hiệu và nhiễu).
Macro

@Macro: so sánh các quy trình mô phỏng của bạn với các quy trình trên trang 16 của tài liệu này: inference.phy.cam.ac.uk/mackay/gpB.pdf
user603

1
sử dụng đa thức bậc cao hơn. Một đa thức bậc 20 với các hệ số ngẫu nhiên (với phân phối đúng) có thể thay đổi hướng (trơn tru) khá nhiều. Nếu bạn đã tìm thấy câu trả lời cho câu hỏi của mình, có lẽ bạn có thể đăng nó dưới dạng câu trả lời?
Macro

Câu trả lời:


8

Hãy xem làm thế nào để mô phỏng việc thực hiện Quy trình Gaussian (GP). Độ mượt của việc thực hiện phụ thuộc vào các thuộc tính phân tích của hàm hiệp phương sai của GP. Cuốn sách trực tuyến này có rất nhiều thông tin: http://uncerturdy.stat.cmu.edu/

Video này giới thiệu rất hay về GP: http://videolectures.net/gpip06_mackay_gpb/

PS Về nhận xét của bạn, mã này có thể cung cấp cho bạn một sự khởi đầu.

library(MASS)
C <- function(x, y) 0.01 * exp(-10000 * (x - y)^2) # covariance function
M <- function(x) sin(x) # mean function
t <- seq(0, 1, by = 0.01) # will sample the GP at these points
k <- length(t)
m <- M(t)
S <- matrix(nrow = k, ncol = k)
for (i in 1:k) for (j in 1:k) S[i, j] = C(t[i], t[j])
z <- mvrnorm(1, m, S)
plot(t, z)

Bạn có một liên kết đặt ra câu hỏi làm thế nào để mô phỏng việc thực hiện quy trình Gaussian, cụ thể không? Điều này không được quảng cáo trong cuốn sách (nhìn vào chỉ mục).
dùng603

Mô phỏng GP được thực hiện thông qua các phân phối chiều hữu hạn. Về cơ bản, bạn chọn bao nhiêu điểm của miền mà bạn muốn, và từ hàm trung bình và hàm hiệp phương sai của GP, bạn có được một đa biến thông thường. Lấy mẫu từ thông thường đa biến này cung cấp cho bạn giá trị của việc thực hiện GP tại các điểm đã chọn. Như tôi đã nói, các giá trị này xấp xỉ một hàm trơn tru, miễn là hàm hiệp phương sai của GP thỏa mãn các điều kiện phân tích cần thiết. Hàm hiệp phương sai bậc hai (với thuật ngữ "jitter") là một khởi đầu tốt.
Zen

4

Ok, đây là câu trả lời tôi đã đưa ra (về cơ bản nó được lấy từ đâyđây ). Ý tưởng là để chiếu một số cặp ngẫu nhiên{xTôi,yTôi}cho đến một cơ sở spline. Sau đó, chúng tôi yên tâm để có được một trận hòa từ GP (trơn tru).

require("MASS")
calcSigma<-function(X1,X2,l=1){
    Sigma<-matrix(rep(0,length(X1)*length(X2)),nrow=length(X1))
    for(i in 1:nrow(Sigma)){
        for (j in 1:ncol(Sigma)) Sigma[i,j]<-exp(-1/2*(abs(X1[i]-X2[j])/l)^2)
    }
    return(Sigma)
}
# The standard deviation of the noise
n.samples<-50
n.draws<-50
x.star<-seq(-5,5,len=n.draws)
nval<-3
f<-data.frame(x=seq(-5,5,l=nval),y=rnorm(nval,0,10))
sigma.n<-0.2
# Recalculate the mean and covariance functions
k.xx<-calcSigma(f$x,f$x)
k.xxs<-calcSigma(f$x,x.star)
k.xsx<-calcSigma(x.star,f$x)
k.xsxs<-calcSigma(x.star,x.star)
f.bar.star<-k.xsx%*%solve(k.xx+sigma.n^2*diag(1,ncol(k.xx)))%*%f$y
cov.f.star<-k.xsxs-k.xsx%*%solve(k.xx+sigma.n^2*diag(1,ncol(k.xx)))%*%k.xxs
values<-matrix(rep(0,length(x.star)*n.samples),ncol=n.samples)
for (i in 1:n.samples)  values[,i]<-mvrnorm(1,f.bar.star,cov.f.star)
values<-cbind(x=x.star,as.data.frame(values))
matplot(x=values[,1],y=values[,-1],lty=1,type="l",col="black")
lines(x.star,f.bar.star,col="red",lwd=2)

Một thử nghiệm.  Chức năng mượt mà


Nhìn có vẻ tốt!
Zen
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.