看代码理解批量梯度下降求解线下回归问题



layout: post
title: 梯度下降算法
subtitle: 批量梯度下降求解线下回归问题
date: 2017-12-01
author: Felix
catalog: true
tags:
- 机器学习
- 优化算法
---

//##############################################################
//#
//# 批量梯度下降算法实例:求解线性回归问题
//#
//##############################################################
#include <iostream>
using namespace std;
#define n_samples 4
#define n_features 2
int main(){
    //自变量 x1, x2
    float mat[n_samples][n_features]={{1,4}, {2,5}, {5,1}, {4,2}};
    //因变量,y
    float results[n_samples] = {19, 26, 19, 20};
    //权重,weights, 初始值设为
    float weights[n_features] = {0, 0};
    //损失函数值
    float loss = 1000;
    //学习率
    float leanring_rate = 0.01;
    //迭代500次或损失收敛
    for(int i=0; i<500 && loss > 0.001; ++i){
        //梯度
        float err_sum[n_features]={0.0, 0.0};
        //遍历样本
        for(int j=0; j < n_samples; ++j){
            //wx
            float h = 0.0;
            //遍历特征
            for(int k=0; k < n_features; ++k){
                h+=mat[j][k]*weights[k];
            }
            //计算梯度
            for(int k=0; k < n_features; ++k){
                err_sum[k] += (results[j] -h ) * mat[j][k];
            }
        }
        //更新权重
        for(int k=0; k < n_features; ++k){
            weights[k] += err_sum[k] * leanring_rate;
        }
        cout<<"weights-->"<<weights[0]<<","<<weights[1]<<endl;
        //更新损失
        for(int j=0; j < n_samples; ++j){
            float h = 0;
            for(int k = 0; k < n_features; ++k){
                h += mat[j][k] * weights[k];
            }
            loss += (results[j]-h)*(results[j]-h);
        }
    }
    return 0;
}
时间: 2024-08-27 18:14:16

看代码理解批量梯度下降求解线下回归问题的相关文章

批量梯度下降(BGD)、随机梯度下降(SGD)以及小批量梯度下降(MBGD)的理解

https://www.cnblogs.com/lliuye/p/9451903.html 梯度下降法作为机器学习中较常使用的优化算法,其有着三种不同的形式:批量梯度下降(Batch Gradient Descent).随机梯度下降(Stochastic Gradient Descent)以及小批量梯度下降(Mini-Batch Gradient Descent).其中小批量梯度下降法也常用在深度学习中进行模型的训练.接下来,我们将对这三种不同的梯度下降法进行理解.  为了便于理解,这里我们将使

【转】 随机梯度下降(Stochastic gradient descent)和 批量梯度下降(Batch gradient descent )的公式对比、实现对比

梯度下降(GD)是最小化风险函数.损失函数的一种常用方法,随机梯度下降和批量梯度下降是两种迭代求解思路,下面从公式和实现的角度对两者进行分析,如有哪个方面写的不对,希望网友纠正. 下面的h(x)是要拟合的函数,J(theta)损失函数,theta是参数,要迭代求解的值,theta求解出来了那最终要拟合的函数h(theta)就出来了.其中m是训练集的记录条数,j是参数的个数. 1.批量梯度下降的求解思路如下: (1)将J(theta)对theta求偏导,得到每个theta对应的的梯度 (2)由于是

随机梯度下降(Stochastic gradient descent)和 批量梯度下降(Batch gradient descent )的公式对比

转自:here 注意下面说的全局最优是特殊的情况,一般还是梯度下降的方法还是很容易变成局部最优. 梯度下降(GD)是最小化风险函数.损失函数的一种常用方法,随机梯度下降和批量梯度下降是两种迭代求解思路,下面从公式的角度对两者进行分析. 下面的h(x)是要拟合的函数,J(theta)损失函数,theta是参数,要迭代求解的值,theta求解出来了那最终要拟合的函数h(theta)就出来了.其中m是训练集的记录条数,j是参数的个数. 1.批量梯度下降的求解思路如下: (1)将J(theta)对the

NN优化方法对比:梯度下降、随机梯度下降和批量梯度下降

1.前言 这几种方法呢都是在求最优解中经常出现的方法,主要是应用迭代的思想来逼近.在梯度下降算法中,都是围绕以下这个式子展开: 其中在上面的式子中hθ(x)代表,输入为x的时候的其当时θ参数下的输出值,与y相减则是一个相对误差,之后再平方乘以1/2,并且其中 注意到x可以一维变量,也可以是多维变量,实际上最常用的还是多维变量.我们知道曲面上方向导数的最大值的方向就代表了梯度的方向,因此我们在做梯度下降的时候,应该是沿着梯度的反方向进行权重的更新,可以有效的找到全局的最优解.这个θ的更新过程可以描

批量梯度下降与随机梯度下降

下面的h(x)是要拟合的函数,J(theta)损失函数,theta是参数,要迭代求解的值,theta求解出来了那最终要拟合的函数h(theta)就出来了.其中m是训练集的记录条数,j是参数的个数. 1.批量梯度下降(BGD)的求解思路如下: (1)将J(theta)对theta求偏导,得到每个theta对应的的梯度 (2)由于是要最小化风险函数,所以按每个参数theta的梯度负方向,来更新每个theta (3)从上面公式可以注意到,它得到的是一个全局最优解,但是每迭代一步,都要用到训练集所有的数

批量梯度下降BGD、随机梯度下降SGD和小批量梯度下降MBGD对比

一般线性回归函数的假设函数为: 对应的损失函数为: (这里的1/2是为了后面求导计算方便)下图作为一个二维参数(,)组对应能量函数的可视化图: 下面我们来比较三种梯度下降法 批量梯度下降法BGD (Batch Gradient Descent) 我们的目的是要误差函数尽可能的小,即求解weights使误差函数尽可能小.首先,我们随机初始化weigths,然后不断反复的更新weights使得误差函数减小,直到满足要求时停止.这里更新算法我们选择梯度下降算法,利用初始化的weights并且反复更新w

Tensorflow细节-P84-梯度下降与批量梯度下降

1.批量梯度下降 批量梯度下降法是最原始的形式,它是指在每一次迭代时使用所有样本来进行梯度的更新.从数学上理解如下: 对应的目标函数(代价函数)即为: (1)对目标函数求偏导: (2)每次迭代对参数进行更新: 优点: ??(1)一次迭代是对所有样本进行计算,此时利用矩阵进行操作,实现了并行. ??(2)由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向.当目标函数为凸函数时,BGD一定能够得到全局最优. 缺点: ??(1)当样本数目 m 很大时,每迭代一步都需要对所有样本

二叔看ML第一:梯度下降

原理 梯度下降是一个很常见的通过迭代求解函数极值的方法,当函数非常复杂,通过求导寻找极值很困难时可以通过梯度下降法求解.梯度下降法流程如下: 上图中,用大写字母表示向量,用小写字母表示标量. 假设某人想入坑,他站在某点,他每移动一小步,都朝着他所在点的梯度的负方向移动,这样能保证他尽快入坑,因为某个点的梯度方向是最陡峭的方向,如下图所示,此图画的不太能表达这个观点,但是懒得盗图了,意会吧: 以下举两个例子,两个例子中的被求函数都很简单,其实直接求导算极值更好,此处仅用来说明梯度下降法的步骤. 实

梯度下降 随机梯度下降 批量梯度下降

梯度下降(GD) 梯度的本意是一个向量,表示某一函数在该点处的方向导数沿着该方向取得最大值,导数对应的是变化率 即函数在该点处沿着该方向变化最快,变化率最大(为该梯度的模) 随机梯度下降(SGD):每次迭代随机使用一组样本 针对BGD算法训练速度过慢的缺点,提出了SGD算法,普通的BGD算法是每次迭代把所有样本都过一遍,每训练一组样本就把梯度更新一次.而SGD算法是从样本中随机抽出一组,训练后按梯度更新一次,然后再抽取一组,再更新一次,在样本量及其大的情况下,可能不用训练完所有的样本就可以获得一