【数值计算】梯度下降法

为了睡觉,我写简单点

反正就是个记录

梯度下降

这里写图片描述

快速梯度下降

这里写图片描述

"""
Numerical Computation & Optimization
homework1: gradient
cww97
Name: Chen WeiWen
stuID: 10152510217
2017/12/14
from cww970329@qq.com
to num_com_opt@163.com
"""
import numpy as np
N = 1000


def gradient(A, b):
    x = np.mat(np.zeros([N, 1]))
    #while np.linalg.norm(A*x-b) > 1e-2:
    for cnt in range(3000):
        gx = A * x - b
        s = 5e-4 * sum(A[i].T * gx[i] for i in range(N))
        x -= s
    return x


def fast_gradient(A, b):
    x = np.mat(np.zeros([N, 1]))
    x_old, a_old, a = np.copy(x), 0, 1
    for cnt in range(1000):
        a_new = 0.5 + 0.5 * np.sqrt(1+4*a*a)
        t = (a-1) / a_new
        y_new = (1+t) * x - t * x_old
        gy = A * y_new - b
        s = 3e-4 * sum(A[i].T * gy[i] for i in range(N))
        x_new = y_new - s
        a_old, a, x_old, x = a, a_new, x, x_new
        # make you dont feel boring when waiting
        print(cnt, np.linalg.norm(A*x-b))
    return x


if __name__ == '__main__':
    A = np.mat(np.random.normal(size=(N, N)))
    x = np.mat(np.ones([N, 1]))
    b = A * x
    print('A =\n', A, '\nx = ', x.T, '.T\nb = ', b.T, '.T')
    print('梯度下降:')
    print(gradient(A, b).T)
    print('快速梯度下降:')
    print(fast_gradient(A, b).T)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是 MATLAB 中使用随机梯度下降法进行数值模拟的代码: ```matlab % 设置初始参数 theta = [0; 0]; alpha = 0.01; num_iters = 1000; m = length(y); % 随机梯度下降法 for iter = 1:num_iters % 随机打乱样本顺序 order = randperm(m); for i = 1:m % 获取当前样本 j = order(i); x_j = X(j,:)'; y_j = y(j); % 计算梯度 h = sigmoid(theta' * x_j); grad = (h - y_j) * x_j; % 更新参数 theta = theta - alpha * grad; end % 计算代价函数 J = costFunction(theta, X, y); end ``` 其中,`sigmoid` 函数和代价函数 `costFunction` 的实现代码如下: ```matlab function g = sigmoid(z) %SIGMOID Compute sigmoid function % J = SIGMOID(z) computes the sigmoid of z. g = 1.0 ./ (1.0 + exp(-z)); end function [J, grad] = costFunction(theta, X, y) %COSTFUNCTION Compute cost and gradient for logistic regression % J = COSTFUNCTION(theta, X, y) computes the cost of using theta as the % parameter for logistic regression and the gradient of the cost % w.r.t. to the parameters. m = length(y); % number of training examples J = 0; grad = zeros(size(theta)); h = sigmoid(X * theta); J = (1/m) * sum(-y .* log(h) - (1-y) .* log(1-h)); grad = (1/m) * X' * (h - y); end ``` 其中,`X` 是训练集的特征矩阵,每一行是一个样本的特征向量,`y` 是训练集的标签向量。`theta` 是要学习的模型参数,`alpha` 是学习率,`num_iters` 是迭代次数。在每一次迭代中,首先随机打乱样本顺序,然后遍历每一个样本,计算出梯度并更新模型参数。最后计算代价函数的值,以便观察优化过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值