ใบเสนอราคาในเต็มรูปแบบที่สามารถพบได้ที่นี่ ประมาณการθ Nเป็นวิธีการแก้ปัญหาของการลด (คนหน้า 344 ):θ^N
minθ∈ΘN−1∑i=1Nq(wi,θ)
θ^NΘH^
N−1∑Ni=1q(wi,θ)θ0
minθ∈ΘEq(w,θ).
N−1∑Ni=1q(wi,θ)Θซึ่ง Hessian ของฟังก์ชันวัตถุประสงค์ไม่จำเป็นต้องเป็นบวกแน่นอน
เพิ่มเติมในหนังสือของเขา Wooldridge ให้ตัวอย่างของการประเมินของ Hessian ซึ่งรับประกันได้ว่าจะเป็นตัวเลขที่แน่นอนแน่นอน ในทางปฏิบัติแล้วความไม่แน่นอนในเชิงบวกของ Hessian ควรระบุว่าการแก้ปัญหานั้นอยู่ที่ขอบเขตหรืออัลกอริทึมล้มเหลวในการหาวิธีแก้ไข ซึ่งโดยปกติจะเป็นตัวบ่งชี้เพิ่มเติมว่าโมเดลที่ติดตั้งอาจไม่เหมาะสมสำหรับข้อมูลที่กำหนด
นี่คือตัวอย่างที่เป็นตัวเลข ฉันสร้างปัญหากำลังสองน้อยที่สุดแบบไม่เป็นเชิงเส้น:
yi=c1xc2i+εi
X[1,2]εσ2set.seed(3)
xiyi
ฉันเลือกสแควร์ฟังก์ชั่นวัตถุประสงค์ของฟังก์ชั่นวัตถุประสงค์สแควร์สแควร์น้อยแบบไม่เชิงเส้นปกติ:
q(w,θ)=(y−c1xc2i)4
นี่คือรหัสใน R สำหรับฟังก์ชั่นการเพิ่มประสิทธิภาพการไล่ระดับสีและกระสอบของมัน
##First set-up the epxressions for optimising function, its gradient and hessian.
##I use symbolic derivation of R to guard against human error
mt <- expression((y-c1*x^c2)^4)
gradmt <- c(D(mt,"c1"),D(mt,"c2"))
hessmt <- lapply(gradmt,function(l)c(D(l,"c1"),D(l,"c2")))
##Evaluate the expressions on data to get the empirical values.
##Note there was a bug in previous version of the answer res should not be squared.
optf <- function(p) {
res <- eval(mt,list(y=y,x=x,c1=p[1],c2=p[2]))
mean(res)
}
gf <- function(p) {
evl <- list(y=y,x=x,c1=p[1],c2=p[2])
res <- sapply(gradmt,function(l)eval(l,evl))
apply(res,2,mean)
}
hesf <- function(p) {
evl <- list(y=y,x=x,c1=p[1],c2=p[2])
res1 <- lapply(hessmt,function(l)sapply(l,function(ll)eval(ll,evl)))
res <- sapply(res1,function(l)apply(l,2,mean))
res
}
การทดสอบครั้งแรกที่ใช้เกรเดียนต์และแบบ hessian ตามที่โฆษณาไว้
set.seed(3)
x <- runif(10,1,2)
y <- 0.3*x^0.2
> optf(c(0.3,0.2))
[1] 0
> gf(c(0.3,0.2))
[1] 0 0
> hesf(c(0.3,0.2))
[,1] [,2]
[1,] 0 0
[2,] 0 0
> eigen(hesf(c(0.3,0.2)))$values
[1] 0 0
xy
> df <- read.csv("badhessian.csv")
> df
x y
1 1.168042 0.3998378
2 1.807516 0.5939584
3 1.384942 3.6700205
4 1.327734 -3.3390724
5 1.602101 4.1317608
6 1.604394 -1.9045958
7 1.124633 -3.0865249
8 1.294601 -1.8331763
9 1.577610 1.0865977
10 1.630979 0.7869717
> x <- df$x
> y <- df$y
> opt <- optim(c(1,1),optf,gr=gf,method="BFGS")
> opt$par
[1] -114.91316 -32.54386
> gf(opt$par)
[1] -0.0005795979 -0.0002399711
> hesf(opt$par)
[,1] [,2]
[1,] 0.0002514806 -0.003670634
[2,] -0.0036706345 0.050998404
> eigen(hesf(opt$par))$values
[1] 5.126253e-02 -1.264959e-05
การไล่ระดับสีเป็นศูนย์ แต่กระนั้นก็ไม่ได้เป็นบวก
หมายเหตุ:นี่เป็นความพยายามครั้งที่สามของฉันในการให้คำตอบ ฉันหวังว่าในที่สุดฉันก็สามารถที่จะให้คำสั่งทางคณิตศาสตร์ที่แม่นยำซึ่ง eluded ฉันในรุ่นก่อนหน้า