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

时间:2019-06-24 16:38:04

标签: r algorithm least-squares

我正在阅读Goodfellow等人的 Deep Learning 。并尝试实现第4.5节示例:线性最小二乘法中所示的梯度下降。这是该书的印刷本中的第92页。

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

我尝试在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?

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

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

知道可能是什么问题吗?

1 个答案:

答案 0 :(得分:0)

Original Problem

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

该算法在实施时实际上非常接近于估计x。但是,由于递归减法和四舍五入很快导致下溢问题,从而导致大量振荡,如下所示:

Value of L2 Norm as a function of step size

Above algorithm vs. solve function in R

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

熟悉数值分析的人士所熟知的下溢问题,最好是由最有能力解决该问题的较低级库的程序员解决。

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