图像与机器学习-1-梯度下降法与ubuntu

现值研一,进入了飞行器控制实验室,在我迷茫不知学什么的时候,这时候刘洋师兄带着图像识别与跟踪这个课题来到了我们面前,师兄倾其所有交给我们学习的方法和步骤与资料,第一节课,师兄给我们讲解了图像识别与跟踪以及机器学习或深度学习的应用和前景以及基本框架和概念。可以说带领我进入了图像与机器学习的第一步。

课后留下两个作业:梯度下降法与ubuntu

梯度下降法:

首先,我使用matlab对梯度下降法的算法进行初步编写和验证,之所以这样做,是因为我觉得利用matlab强大的函数库,和简洁的语言,能够简化我构建算法的过程,让我能更加简单明了的了解梯度下降法的原理。其次因为matlab有强大的绘图功能,能够让我直观的看到函数的图像,以及梯度下降法整个迭代过程中的点的迁移轨迹,这一点非常重要,它能让我直观的了解算法实现的成功与否与效果,以及收敛速度。

------------------------------------------------------------------------------------------------------------

作业一:梯度下降法:首先目标函数:a=1-cos(x); b=1-sin(y); c=x-y;f=sin(y).*exp(a.*a)+cos(x).*exp(b.*b)+c.*c; (x,y)在(-5,-5)到(0,0)区间内,任意给一点(x,y),用梯度下降法求出该点附近的极小值点。梯度下降法:迭代公式:x=x-step*dfdx(x,y);   y=y-step*dfdy(x,y); 

接下来就是matlab中我的代码:

(1)main函数:Gradient_decent.m

------------------------------------------------------------------------------------------------------------

clear all;
clc;
step=0.001;
x=-3.5;
y=-3.5;
dF=Func(x,y);
f=Func(x,y);%%初始化


figure%%创建一个绘图面板
axis equal;
[a,b]=meshgrid(-5:0.05:0,-5:0.05:0);
c=Func(a,b);
mesh(a,b,c);%%画函数曲面图像


hold on%%语句作用是让后面所有的画图在前面创建的面板中继续画
while abs(dF)>0.00000001&&x<=0&&x>=-5&&y<=0&&y>=-5
   x=x-step*dfdx(x,y);
   y=y-step*dfdy(x,y);%%梯度下降法
   dF=Func(x,y)-f;%%计算函数变化差值
   f=Func(x,y);%%计算当前函数值
   plot3(x,y,f,'pr');%%画出当前点
end

------------------------------------------------------------------------------------------------------------

(2)目标函数:Func.m

------------------------------------------------------------------------------------------------------------

function f=Func(x,y)
a=1-cos(x);
b=1-sin(y);
c=x-y;
f=sin(y).*exp(a.*a)+cos(x).*exp(b.*b)+c.*c;%%a,b,c可能为矩阵,要点乘
end

------------------------------------------------------------------------------------------------------------

(3)偏导数函数:dfdy.m/dfdx.m

------------------------------------------------------------------------------------------------------------

function grady= dfdy( x,y,dF )

%使用了偏导数的定义法来求解目标函数对y的偏导数
dy=0.000001;
grady=(Func(x,y+dy)-Func(x,y))/dy;
end

------------------------------------------------------------------------------------------------------------

function gradx= dfdx( x,y,dF )

%%使用了偏导数的定义法来求解目标函数对x的偏导数
dx=0.000001;
gradx=(Func(x+dx,y)-Func(x,y))/dx;
end

------------------------------------------------------------------------------------------------------------

(4)结果图:令X=-3.5,Y=-3.5,最终结果为:(-3.13,-1.58,-1.067)


令X=-4.9,Y=-4.9,最终结果为:(-5.00,-4.93,1.919)


在matlab中的结果显示,梯度下降法成功地实现了,能够正确的找到给定点附近的极小值。有了matlab中的基础,将其移植到c语言中是很简单的:

c语言中我的代码:

------------------------------------------------------------------------------------------------------------

#include "stdio.h"
#include <cmath>
double Func(double x, double y)
{
double a, b, c, f;
a = 1 - cos(x);
b = 1 - sin(y);
c = x - y;
f = sin(y)*exp(a*a) + cos(x)*exp(b*b) + c*c;
return f;
}
double dfdy(double x, double y)
{
double dy = 0.000001, grady;
grady = (Func(x, y + dy) - Func(x, y)) / dy;
return grady;
}
double dfdx(double x, double y)
{
double dx = 0.000001, gradx;
gradx = (Func(x + dx, y) - Func(x, y)) / dx;
return gradx;
}


int main()
{
double step = 0.001, x = -3.5, y =-3.5, dF, f;
dF = Func(x, y);
f = Func(x, y); //初始化
while(abs(dF)>0.00000001&&x <= 0 && x >= -5 && y <= 0 && y >= -5)
{
x = x - step*dfdx(x, y);
y = y - step*dfdy(x, y);//梯度下降法
dF = Func(x, y) - f;//计算函数变化差值
f = Func(x, y);//计算当前函数值
}
printf("(x,y,z):(%7f,%7f,%7f)\n", x, y, f);
getchar();
}

------------------------------------------------------------------------------------------------------------

运行结果:(1)x = -3.5, y = -3.5,(-3.14,-1.66,-105.93)

   (2)x = -4.9, y = -4.9(-4.90,-4.90,2.086)


总结:虽然c语言中运行的结果和matlab有微小差异,但是在接受范围内,故视为梯度下降法算法实现成功。通过这个小作业,我学习了很多matlab和c语言的知识,更深入了解了梯度下降法的原理和实现方法。

------------------------------------------------------------------------------------------------------------

作业二:安装ubuntu操作系统环境:

在经历了一番努力之后,通过修改bios设置选项,然后重新划分电脑的硬盘分区,成功实现了双系统:win10+ubuntu,每次开机只需要按F11进入BOOT Option就能选择操作系统的选择,并且如果不做操作默认进入win10系统,使用很方便。

具体安装步骤:参考:(http://tieba.baidu.com/p/5058218335?fr=ala0&pstaala=1&tpl=5&fid=834104&isgod=0)

1,用PartAssist软件把D盘分出了60G的空间。2,使用ultralISO软件把下载好的ubuntu17.0(ISO)写入一个16G的U盘中,这样就做好了一个能够使用的ubuntu装机U盘。3.关机开机,按DELETE键(电脑不同按键不同)进入bios setting,首先关闭save boot ,然后再启动顺序一栏中把U盘的顺序调到最高,UEFI那个引导选项不用去管,默认就好。4.重启,进入ubuntu安装,安装过程中,选择自定义,然后选择之前划分的空白盘,然后下面有一个安装启动引导器的设备,打开选项,找到里面带有windows boot manager的选项!

------------------------------------------------------------------------------------------------------------



猜你喜欢

转载自blog.csdn.net/lidawei0124/article/details/78581373
今日推荐