梯度下降

时间:2014-03-10 16:55:47

标签: python math matrix mathematical-optimization

所以我正在编写一个处理梯度下降的程序。我使用这种方法来解决形式

的方程式
Ax = b
where A is a random 10x10 matrix and b is a random 10x1 matrix

这是我的代码:

import numpy as np
import math
import random
def steepestDistance(A,b,xO, e):
    xPrev = xO
    dPrev = -((A * xPrev) - b)
    magdPrev = np.linalg.norm(dPrev)
    danger =  np.asscalar(((magdPrev * magdPrev)/(np.dot(dPrev.T,A * dPrev))))
    xNext = xPrev + (danger * dPrev)
    step = 1
    while (np.linalg.norm((A * xNext) - b) >= e and np.linalg.norm((A * xNext) - b) < math.pow(10,4)):
        xPrev = xNext
        dPrev = -((A * xPrev) - b)
        magdPrev = np.linalg.norm(dPrev)
        danger = np.asscalar((math.pow(magdPrev,2))/(np.dot(dPrev.T,A * dPrev)))
        xNext = xPrev + (danger * dPrev)
        step = step + 1
    return xNext

##print(steepestDistance(np.matrix([[5,2],[2,1]]),np.matrix([[1],[1]]),np.matrix([[0.5],[0]]), math.pow(10,-5)))

def chooseRandMatrix():
    matrix = np.zeros(shape = (10,10))
    for i in range(10):
        for a in range(10):
            matrix[i][a] = random.randint(0,100)
    return matrix.T * matrix

def chooseRandColArray():
    arra = np.zeros(shape = (10,1))
    for i in range(10):
        arra[i][0] = random.randint(0,100)
    return arra
for i in range(4): 
  matrix = np.asmatrix(chooseRandMatrix())
  array = np.asmatrix(chooseRandColArray())  
print(steepestDistance(matrix, array, np.asmatrix(chooseRandColArray()),math.pow(10,-5)))

当我在随机矩阵和列上运行方法steepestDistance时,我不断得到一个无限循环。当简单的2x2矩阵用于A时,它工作正常,但它无限循环10x10矩阵。问题出在np.linalg.norm((A * xNext) - b);它不断增长。这就是为什么我把它放在上面;我不应该为算法做这件事。有人能告诉我问题是什么吗?

1 个答案:

答案 0 :(得分:2)

求解线性系统Ax = b具有梯度下降意味着最小化二次函数

f(x) = 0.5*x^t*A*x - b^t*x. 

这只适用于矩阵A是对称的,A = A ^ t,因为f的导数或梯度是

f'(x)^t = 0.5*(A+A^t)*x - b, 

另外A必须是肯定的。如果存在负特征值,则下降将进入负无穷大,没有找到最小值。


一种解决方法是用A ^ tb代替b,用a * t * A代替A,即最小化函数

f(x) = 0.5*||A*x-b||^2
     = 0.5*x^t*A^t*A*x - b^t*A*x + 0.5*b^t*b

带渐变

f'(x)^t = A^t*A*x - A^t*b

但是对于大矩阵A,不建议这样做,因为A ^ t * A的条件数大约是条件数A的平方。