超级计算机囧囧囧's Archivers

From admin on 2013-01-27 03:39:26

梯度下降代码实现(matlab,c++)

matlab:
function y=fs2steep(f,e,a,b) %返回的是点坐标的2个分量
% fs2steep函数 最速下降法
% x=fs2steep(f,e,a,b)为输入函数 f为函数 e为允许误差 (a,b)为初始点;
% fsx TJPU 2008.6.15
x1=a;x2=b;
Q=fs2hesse(f,x1,x2);
x0=[x1 x2]';
fx1=diff(f,'x1'); %对x1求偏导数
fx2=diff(f,'x2'); %对x2求偏导数
g=[fx1 fx2]'; %梯度
g1=subs(g); %把符号变量转为数值
d=-g1;%d为搜索方向
while (abs(norm(g1))>=e) %norm(g1)为g1的2范数,即sqrt(x1^2+x2^2),因为梯度其各分量=0,所以其梯度幅值=0
t=(-d)'*d/((-d)'*Q*d);%求搜索步长,方法是?
x0=x0-t*g1; %搜索到的点
v=x0;
a=[1 0]*x0;
b=[0 1]*x0;
x1=a;
x2=b;
Q=fs2hesse(f,x1,x2);
x0=[x1 x2]';
fx1=diff(f,'x1'); %对x1求偏导数
fx2=diff(f,'x2'); %对x2求偏导数
g=[fx1 fx2]'; %梯度
g1=subs(g);
d=-g1;
end;
y=v;

function x=fs2hesse(f,a,b)
% fs2hesse函数 求函数的hesse矩阵;
% 本程序仅是简单的求二次函数的hesse矩阵!;
% x=fs2hesse(f)为输入函数 f为二次函数 x1,x2为自变量;
% fsx TJPU 2008.6.15
x1=a;x2=b;
fx=diff(f,'x1'); %求f对x1偏导数
fy=diff(f,'x2'); %求f对x2偏导数
fxx=diff(fx,'x1'); %求二阶偏导数 对x1再对x1
fxy=diff(fx,'x2'); %求二阶偏导数 对x1再对x2
fyx=diff(fy,'x1'); %求二阶偏导数 对x2再对x1
fyy=diff(fy,'x2'); %求二阶偏导数 对x2再对x2
fxx=subs(fxx); %将符号变量转化为数值
fxy=subs(fxy);
fyx=subs(fyx);
fyy=subs(fyy);
x=[fxx,fxy;fyx,fyy]; %求hesse矩阵
c++:
/*
* @author:郑海波
* blog.csdn.net/nuptboyzhb/
* 2012-12-11
*/
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
double e=0.00001;//定义迭代精度
double alpha=0.5;//定义迭代步长
double x=0;//初始化x
double y0=x*x-3*x+2;//与初始化x对应的y值
double y1=0;//定义变量,用于保存当前值
while (true)
{
x=x-alpha*(2.0*x-3.0);
y1=x*x-3*x+2;
if (abs(y1-y0)<e)//如果2次迭代的结果变化很小,结束迭代
{
break;
}
y0=y1;//更新迭代的结果
}
cout<<"Min(f(x))="<<y0<<endl;
cout<<"minx="<<x<<endl;
return 0;
}
//运行结果
//Min(f(x))=-0.25
//minx=1.5
//Press any key to continue

查看完整版本: 梯度下降代码实现(matlab,c++)

Tags: 梯度下降


©超级计算机囧囧囧