1. 程式人生 > >影象與機器學習-1-梯度下降法與ubuntu

影象與機器學習-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的選項!

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