用梯度下降做点小实验

赶在国庆回家前做点小实验==

利用梯度下降法去拟合任意你想拟合的东西,哈哈

自己想出来的曲线:

目标函数:

其中:

然后计算迭代式:

其中:

k表示第k次迭代,

至此,有了梯度方向就可以计算啦,附上c++代码:

#include<iostream>
#include<vector>
#include<ctime>
using namespace std;

int main() {
	//产生数据
	srand(time(NULL));
	vector<vector<double>> x(5,vector<double>(3,0.0));
	for (int i = 0; i < 5; i++) {
		for (int j = 0; j < 3; j++) {
			x[i][j] = rand() % 10+1;
			//cout << x[i][j] << " ";
		}
		//cout << ",";
	}
	//double *y = new double[5];
	double y[5];
	for (int i = 0; i < 5; i++) {
		 y[i] = 3 * x[i][0] + 5 * x[i][1] - 7 * x[i][2] + double((rand() % 7)) / 10;
		// cout << y[i] << endl;
	}
	double a=0.0,b=0.0,c=0.0,
		aa=0.0,bb=0.0,cc=0.0;
	double diff;
	double error=0,error1=0;
	int itertornum = 0;//记录迭代次数
	while (1) {
		itertornum++;
		for (int i = 0; i < 5; i++) {
			cout << "第"<<itertornum<<"次迭代:"<<aa << "," << bb << "," << cc << "," << endl;
			diff = y[i] - (a*x[i][0] + b*x[i][1] + c*x[i][2]);
			aa = aa + 0.001*diff*x[i][0];
			bb = bb + 0.001*diff*x[i][1];
			cc = cc + 0.001*diff*x[i][2];
		}
		a = aa; b = bb; c = cc;//更新状态量
		error = 0;
		for (int i = 0; i < 5; i++) {
			error += 0.5*(pow(y[i] - (a*x[i][0] + b*x[i][1] + c*x[i][2]), 2));
		}
		if (abs(error - error1) < 1e-5) {
			break;
		}
		else {
			error1 = error;
		}
	}
	cout << "最终结果是:" << a <<","<< b<<"," << c<<endl;
	system("pause");
	return 0;
}

  

时间: 2024-11-08 23:04:28

用梯度下降做点小实验的相关文章

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

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

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

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

json小实验

看了汤姆大叔的博客http://www.cnblogs.com/TomXu/archive/2012/01/11/2311956.html 博客原文: 我认为很多JavaScript开发人员都错误地把JavaScript对象字面量(Object Literals)称为JSON对象(JSON Objects),因为他的语法和JSON规范里描述的一样,但是该规范里也明确地说了JSON只是一个数据交换语言,只有我们将之用在string上下文的时候它才叫JSON. // 这是JSON字符串 var fo

关于rownum的一个小实验

以前一直有个疑惑,例如sql:select * from test where object_name='YANG' and rownum=1;那么该sql是把所有的object_name='YANG'全部都找出来显示一行给我呢,还是只找到一行了就停止再找?话不多说,做个小实验: 1.构造一张表create table test as select * from dba_objects; 2.将表的第一行作个更改update test set object_name='YANG' where o

梯度下降入门

本文参考深入浅出--梯度下降法及其实现,对后面将公式转化为矩阵的形式加了些解释,便于大家理解. 梯度下降是用来求函数最小值点的一种方法,所谓梯度在一元函数中是指某一点的斜率,在多元函数中可表示为一个向量,可由偏导求得,此向量的指向是函数值上升最快的方向.公式表示为: \[ \nabla J(\Theta) = \langle \frac{\overrightarrow{\partial J}}{\partial \theta_1}, \frac{\overrightarrow{\partial

深度学习之(十一)Deep learning中的优化方法:随机梯度下降、受限的BFGS、共轭梯度法

Deep learning中的优化方法 三种常见优化算法:SGD(随机梯度下降),LBFGS(受限的BFGS),CG(共轭梯度法). 1.SGD(随机梯度下降) 随机梯度下降(Stochastic Gradient Descent, SGD)是随机和优化相结合的产物,是一种很神奇的优化方法,属于梯度下降的一种,适用于大规模问题. 要想扯清楚它,还得先谈谈梯度下降.众所周知,每个优化问题都会有一个目标函数F(w)F(w),梯度下降采用迭代的策略,从初始点w0w0开始,每次沿着目标函数在当前点的负梯

机器学习推导笔记1--机器学习的任务、步骤、线性回归、误差、梯度下降

前段时间放假在家的时候,总算是看完了斯坦福的机器学习公开课(Andrew NG)的监督学习,这项计划持续了将近一个学期.无监督学习和强化学习部分暂时还不太想看,目前来说监督学习与我现在的情况更契合一些.看完监督学习部分,对机器学习的了解又深了一些,加上之前帮师兄做实验,从工程角度和理论角度共同推进,感觉还是挺好的. 为了巩固学习成果,在刷题之余,准备写一系列笔记,自己推导一遍机器学习里比较重要的几个算法,并附上自己的理解.我一直认为能讲出来的东西,才是自己的.写笔记有助于我自己理清思路,当然也希

深度解读最流行的优化算法:梯度下降

深度解读最流行的优化算法:梯度下降 By 机器之心2016年11月21日 15:08 梯度下降法,是当今最流行的优化(optimization)算法,亦是至今最常用的优化神经网络的方法.本文旨在让你对不同的优化梯度下降法的算法有一个直观认识,以帮助你使用这些算法.我们首先会考察梯度下降法的各种变体,然后会简要地总结在训练(神经网络或是机器学习算法)的过程中可能遇到的挑战.(本文的中文版 PDF 下载地址) 目录: 梯度下降的各种变体 批量梯度下降(Batch gradient descent)

感知器与梯度下降

声明:本文由Ronny发表在http://www.cnblogs.com/ronny/p/ann_01.html ,如需转载请注明出处 一.前言 1,什么是神经网络? 人工神经网络(ANN)又称神经网络(NN),它是一种受生物学启发而产生的一种模拟人脑的学习系统.它通过相互连结的结点构成一个复杂的网络结构,每一个结点都具有多个输入和一个输出,并且该结点与其他结点以一个权重因子相连在一起.通俗来说,神经网络是一种学习器,给它一组输入,它会得到一组输出,神经网络里的结点相互连结决定了输入的数据在里面