批量梯度下降(Batch gradient descent) C++
At each step the weight vector is moved in the direction of the greatest rate of decrease of the error function,
and so this approach is known as gradient descent(梯度下降法) or steepest descent(最速下降法).
Techniques that use the whole data set at once are called batch methods.
With the method of gradient descent used to perform the training, the advantages of batch learning
include the following:
1)accurate estimation of the gradient vector(i.e., the derivative of the cost function with respect to the weight vector w),
thereby guaranteeing, under simple conditions, convergence of the method of steepest descent to a local minimum;
2)parallalization of the learning process.
However, from a practical perspective, batch learning is rather demanding in terms of storage requirements.
#include <iostream>
#include <vector>
#include <cmath>
#include <cfloat>
/*批量梯度下降法*/
int main() {
double datax[]={1,2,3,4,5};
double datay[]={1,1,2,2,4};
std::vector<double> v_datax,v_datay;
for(size_t i=0;i<sizeof(datax)/sizeof(datax[0]);++i) {
v_datax.push_back(datax[i]);
v_datay.push_back(datay[i]);
}
double a=0,b=0;
double J=0.0;
for(std::vector<double>::iterator iterx=v_datax.begin(),itery=v_datay.begin();iterx!=v_datax.end(),itery!=v_datay.end();++iterx,++itery) {
J+=(a+b*(*iterx)-*itery)*(a+b*(*iterx)-*itery);
}
J=J*0.5/v_datax.size();
while(true) {
double grad0=0,grad1=0;
for(std::vector<double>::iterator iterx=v_datax.begin(),itery=v_datay.begin();iterx!=v_datax.end(),itery!=v_datay.end();++iterx,++itery) {
grad0+=(a+b*(*iterx)-*itery);
grad1+=(a+b*(*iterx)-*itery)*(*iterx);
}
grad0=grad0/v_datax.size();
grad1=grad1/v_datax.size();
//0.03为学习率阿尔法
a=a-0.03*grad0;
b=b-0.03*grad1;
double MSE=0;
for(std::vector<double>::iterator iterx=v_datax.begin(),itery=v_datay.begin();iterx!=v_datax.end(),itery!=v_datay.end();++iterx,++itery) {
MSE+=(a+b*(*iterx)-*itery)*(a+b*(*iterx)-*itery);
}
MSE=MSE*0.5/v_datax.size();
if(std::abs(J-MSE)<0.0000001)
break;
J=MSE;
}
std::cout<<"批量梯度下降法得到的结果:"<<std::endl;
std::cout<<"a = "<<a<<std::endl;
std::cout<<"b = "<<b<<std::endl;
return 0;
}
In a statistical context, batch learning may be viewed as a form of statistical inference. It is therefore well suited
for solving nonlinear regression problems.
批量梯度下降(Batch gradient descent) C++的更多相关文章
- 梯度下降(Gradient Descent)小结
在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一,另一种常用的方法是最小二乘法.这里就对梯度下降法做一个完整的总结. 1. 梯度 在微 ...
- 梯度下降(Gradient Descent)
在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一,另一种常用的方法是最小二乘法.这里就对梯度下降法做一个完整的总结. 1. 梯度 在微 ...
- 梯度下降(Gradient Descent)相关概念
梯度,直观理解: 梯度: 运算的对像是纯量,运算出来的结果会是向量在一个标量场中, 梯度的计算结果会是"在每个位置都算出一个向量,而这个向量的方向会是在任何一点上从其周围(极接近的周围,学过 ...
- ML:梯度下降(Gradient Descent)
现在我们有了假设函数和评价假设准确性的方法,现在我们需要确定假设函数中的参数了,这就是梯度下降(gradient descent)的用武之地. 梯度下降算法 不断重复以下步骤,直到收敛(repeat ...
- 随机梯度下降 Stochastic gradient descent
梯度下降法先随机给出参数的一组值,然后更新参数,使每次更新后的结构都能够让损失函数变小,最终达到最小即可. 在梯度下降法中,目标函数其实可以看做是参数的函数,因为给出了样本输入和输出值后,目标函数就只 ...
- 多变量线性回归时使用梯度下降(Gradient Descent)求最小值的注意事项
梯度下降是回归问题中求cost function最小值的有效方法,对大数据量的训练集而言,其效果要 好于非迭代的normal equation方法. 在将其用于多变量回归时,有两个问题要注意,否则会导 ...
- 随机梯度下降(Stochastic gradient descent)和 批量梯度下降(Batch gradient descent )的公式对比、实现对比[转]
梯度下降(GD)是最小化风险函数.损失函数的一种常用方法,随机梯度下降和批量梯度下降是两种迭代求解思路,下面从公式和实现的角度对两者进行分析,如有哪个方面写的不对,希望网友纠正. 下面的h(x)是要拟 ...
- 【转】 随机梯度下降(Stochastic gradient descent)和 批量梯度下降(Batch gradient descent )的公式对比、实现对比
梯度下降(GD)是最小化风险函数.损失函数的一种常用方法,随机梯度下降和批量梯度下降是两种迭代求解思路,下面从公式和实现的角度对两者进行分析,如有哪个方面写的不对,希望网友纠正. 下面的h(x)是要拟 ...
- batch gradient descent(批量梯度下降) 和 stochastic gradient descent(随机梯度下降)
批量梯度下降是一种对参数的update进行累积,然后批量更新的一种方式.用于在已知整个训练集时的一种训练方式,但对于大规模数据并不合适. 随机梯度下降是一种对参数随着样本训练,一个一个的及时updat ...
- 机器学习-随机梯度下降(Stochastic gradient descent)和 批量梯度下降(Batch gradient descent )
梯度下降(GD)是最小化风险函数.损失函数的一种常用方法,随机梯度下降和批量梯度下降是两种迭代求解思路,下面从公式和实现的角度对两者进行分析,如有哪个方面写的不对,希望网友纠正. 下面的h(x)是要拟 ...
随机推荐
- html5——web字体
基本介绍 1.自定义网页特殊字体,无需考虑用户电脑上是否安装了此特殊字体,从此把特殊字体处理成图片的时代便成为了过去. 2.支持程度比较好,甚至IE低版本浏览器也能支持. 3.web字体的大小鉴定是字 ...
- 实验2 C++数组与指针
一.实验目的: 掌握一维数组和二维数组的定义.赋值和输入输出的方法. 掌握字符数组和字符串函数的使用. 通过实验进一步掌握指针的概念,会定义和使用指针变量. 能正确使用数组的指针和指向数组的指针变量. ...
- opencv 图像各方向旋转
1. 简介 计算机图形学中的应用非常广泛的变换是一种称为仿射变换的特殊变换,在仿射变换中的基本变换包括平移.旋转.缩放.剪切这几种.本文以及接下来的几篇文章重点介绍一下关于旋转的变换,包括二维旋转变换 ...
- 后台取前台input标签值方法
直接在实体类中增加一个get set方法就可以实现取到value值
- Spring MVC 笔记2 HelloWorld
实现这个例子的问题 WEB-INFO目录下必须有spring的包,放在lib下:如下图(这里我直接把idea创建时宣称springmvc,然后把idea给的lib拷贝了下来,也可以的) request ...
- jquery源码分析(七)——事件模块 event(二)
上一章节探讨了事件的一些概念,接下来看下jQuery的事件模块. jQuery对事件的绑定分别有几个API:.bind()/.live()/.delegate()/.on()/click(), 不管是 ...
- 01派【北京大学ACM/ICPC竞赛训练暑期课】
01:派 总时间限制: 1000ms 内存限制: 65536kB 描述 我的生日要到了!根据习俗,我需要将一些派分给大家.我有N个不同口味.不同大小的派.有F个朋友会来参加我的派对,每个人会拿到一 ...
- linux学习7-数据流重定向
数据流重定向 实验介绍 你可能对重定向这个概念感到些许陌生,但你应该在前面的课程中多次见过>或>>操作了,并知道他们分别是将标准输出导向一个文件或追加到一个文件中.这其实就是重定向, ...
- BUPT2017 springtraining(15) #3
这里这里 A.签到题 #include <cstdio> double a[] = {0.4, 0.16, 0.063, 0.025, 0.010, 0.004}; int main() ...
- Flume基本概念
1 Apache Flume 1.1 概述 Flume是Cloudera提供的一个高可用,高可靠的,分布式的海量日志采集.聚合和传输的软件. Flume的核心是把数据从 ...