繁体   English   中英

如何最小化R中的线性最小二乘函数?

[英]How do I minimize a linear least squares function in R?

我正在阅读Goodfellow等人的深度学习 并尝试实现梯度下降,如第4.5节示例:线性最小二乘法所示。 这是本书硬拷贝中的第92页。

该算法可以在https://www.deeplearningbook.org/contents/numerical.html上详细查看,其中R实现了线性最小二乘法(第94页)。

我已经尝试在R中实现,并且所实现的算法会收敛于向量,但是这个向量似乎并没有根据需要最小化最小二乘函数。 将epsilon添加到有问题的向量中经常会产生一个小于我的程序输出的最小值的“最小值”。

options(digits = 15)
dim_square = 2 ### set dimension of square matrix
# Generate random vector, random matrix, and 
set.seed(1234) 
A = matrix(nrow = dim_square, ncol = dim_square, byrow = T, rlnorm(dim_square ^ 2)/10)
b = rep(rnorm(1), dim_square)

# having fixed A & B, select X randomly 
x = rnorm(dim_square) # vector length of dim_square--supposed to be arbitrary

f = function(x, A, b){
  total_vector = A %*% x + b # this is the function that we want to minimize
  total = 0.5 * sum(abs(total_vector) ^ 2) # L2 norm squared
  return(total)
}
f(x,A,b)

# how close do we want to get?
epsilon = 0.1
delta = 0.01

value = (t(A) %*% A) %*% x - t(A) %*% b
L2_norm = (sum(abs(value) ^ 2)) ^ 0.5

steps = vector()
while(L2_norm > delta){
  x = x - epsilon * value
  value = (t(A) %*% A) %*% x - t(A) %*% b
  L2_norm = (sum(abs(value) ^ 2)) ^ 0.5
  print(L2_norm)
}

minimum = f(x, A, b)
minimum

minimum_minus = f(x - 0.5*epsilon, A, b)
minimum_minus # less than the minimum found by gradient descent! Why?

在pdf的第94页上,出现在https://www.deeplearningbook.org/contents/numerical.html

我试图找到向量x的值,使f(x)最小化。 但是,正如我的代码中的最小值和minimum_minus所示,最小值不是实际最小值,因为它超过了最小值。

知道问题可能是什么?

原始问题

找到x的值使得Ax-b的数量最小化等效于找到x的值,使得Ax-b = 0或x =(A ^ -1)* b。 这是因为L2范数是欧几里德范数,通常称为距离公式。 根据定义,距离不能为负,使其最小值为零。

实施该算法实际上非常接近估计x。 但是,由于递归减法和舍入,很快会遇到下溢问题,导致大量振荡,如下:

L2范数的值作为步长的函数

以上算法与R中的求解函数

上面我们得到A%% x后跟A%% min_x的结果,其中x由实现的算法估算,min_x由R中的求解函数估算。

熟悉数值分析的人所熟知的下溢问题可能是最适合解决它的低级库的程序员所能解决的问题。

总而言之,该算法似乎可以实现。 但值得注意的是,并非每个函数都具有最小值(想到一条直线),并且还要注意该算法应该只能找到局部函数,而不是全局最小值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM