演算法優化函數
1. 我想要一個完整的用粒子群演算法優化函數的程序,隨便哪個函數都行,一定要對的,大神幫忙啊
今天有用過的一個超簡單的,求一個方程的最大值。
程序一:
function F = fitness( x )
F = x^3-60*x^2+900*x+100; %0<x<=31
F = -F;%求-F的最小值,就是求F的最大值。
程序二:
function [xm,fv] = PSO(fitness,N,c1,c2,w,M,D)
%[xm,fv] = PSO(@fitness,40,2,2,0.8,1000,1)
%
% 求解優化問題
% fitness 待優化目標函數
% N 粒子數目,
% cX 學習因子
% W 慣性權重
% M 最大迭代次數
% D 自由變數的個數
% xm 目標函數取最小值時的自由變數
% fv 目標函數的最小值
% Detailed explanation goes here
tic;
format long;
%------step1.初始化種群的個體------------
x = zeros(N,D);
v = zeros(N,D);
for i=1:N
for j=1:D
x(i,j)=31*rand; %隨機初始化位置 x在[0 ,31]之間
v(i,j)=rand; %隨機初始化速度
end
end
%------step2.先計算各個粒子的適應度,並初始化Pi和PgPg為全局最優-------------
p = zeros(N,1);
%y = zeros(N,D);
for i=1:N
p(i)=fitness(x(i,:));
%y(i,:)=x(i,:);
end
y = x;
pg = x(N,:); %Pg為全局最優
for i=1:(N-1)
if fitness(x(i,:))<fitness(pg)
pg=x(i,:);
end
end
%------step3.進入主要循環,按照公式依次迭代------------
%Pbest = zeros(M,1);
for t=1:M
for i=1:N
v(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg-x(i,:));
for k=1:D
if v(i,k) > 2 %2=vmax
v(i,k) = 2;
end
end
x(i,:)=x(i,:)+v(i,:);
for k=1:D
if x(i,k) > 31 %31=xmax
x(i,k) = 31;
end
end
if fitness(x(i,:))<p(i)
p(i)=fitness(x(i,:));
y(i,:)=x(i,:);
end
if p(i)<fitness(pg)
pg=y(i,:);
end
end
%Pbest(t)=fitness(pg);
end
xm = pg';
fv = fitness(pg);
toc;
2. 演算法優化有哪些主要方法和作用
優化演算法有很多,關鍵是針對不同的優化問題,例如可行解變數的取值(連續還是離散)、目標函數和約束條件的復雜程度(線性還是非線性)等,應用不同的演算法。
對於連續和線性等較簡單的問題,可以選擇一些經典演算法,如梯度、Hessian
矩陣、拉格朗日乘數、單純形法、梯度下降法等。
而對於更復雜的問題,則可考慮用一些智能優化演算法,如遺傳演算法和蟻群演算法,此外還包括模擬退火、禁忌搜索、粒子群演算法等。
3. matlab上的遺傳演算法函數優化
用ga函數,ga函數就是遺傳演算法的函數,它的調用格式為:
x
=
ga(fitnessfcn,nvars,a,b,aeq,beq,lb,ub,nonlcon,options)
fitnessfcn就是待優化函數,nvars為變數個數,然後後面的lb是下界,ub是上界,你這個問題就需要這4個位置的參數,其他位置的參數用[]代替就行,由於ga函數默認是求待優化函數的最小值,所以要想求最大值需要把待優化函數取負,即編寫為
function
y=myfun(x)
y=-x.*sin(10*pi.*x)-2;
把這個函數存為myfun.m,然後在命令行里敲
x=ga(@myfun,1,[],[],[],[],[1],[2])
會返回
optimization
terminated:
average
change
in
the
fitness
value
less
than
options.tolfun.
x
=
1.8506
由於遺傳演算法的原理其實是在取值范圍內隨機選擇初值然後進行遺傳,所以可能每次運行給出的值都不一樣,比如再運行一次會返回
optimization
terminated:
average
change
in
the
fitness
value
less
than
options.tolfun.
x
=
1.6507
這個具體原因需要參考遺傳演算法的有關資料
4. L-M 優化演算法優化哪種函數最好
老哥你竟然知道lm下山怎麼會問這么弱智的問題呢
擬合和尋優,非線性的函數都可以用lm
LM演算法需要對每一個待估參數求偏導,所以,如果你的擬合函數 f 非常復雜,或者待估參數相當地多,那麼可能不適合使用LM演算法,而可以選擇Powell演算法。LM主要有信賴區間可以變鄰域搜索,收斂速度塊。
5. 優化演算法總結
本文介紹一下機器學習和深度學習中常用的優化演算法和優化器以及一些其他我知道的優化演算法,部分演算法我也沒有搞懂,就先記錄下來以後慢慢研究吧.*_*.
1.梯度下降演算法(Gradient Descent)
梯度下降法可以參考我另一篇文章 機器學習-線性回歸 里的講解,這里就不在重復敘述.這里需要強調一下,深度學習里常用的SGD,翻譯過來是隨機梯度下降,但是實質是mini-batch梯度下降(mini-batch-gd),或者說是兩者的結合更准確一些.
SGD的優點是,演算法簡單,計算量小,在函數為凸函數時可以找到全局最優解.所以是最常用的優化演算法.缺點是如果函數不是凸函數的話,很容易進入到局部最優解而無法跳出來.同時SGD在選擇學習率上也是比較困難的.
2.牛頓法
牛頓法和擬牛頓法都是求解無約束最優化問題的常用方法,其中牛頓法是迭代演算法,每一步需要求解目標函數的海森矩陣的逆矩陣,計算比較復雜.
牛頓法在求解方程根的思想:在二維情況下,迭代的尋找某一點x,尋找方法是隨機一個初始點x_0,目標函數在該點x_0的切線與x坐標軸的交點就是下一個x點,也就是x_1.不斷迭代尋找x.其中切線的斜率為目標函數在點x_0的導數(梯度),切必過點(x_0,f(x_0)).所以迭代的方程式如圖1,為了求該方程的極值點,還需要令其導數等於0,也就是又求了一次導數,所以需要用到f(x)的二階導數.
在最優化的問題中,牛頓法提供了一種求解的辦法. 假設任務是優化一個目標函數f, 求函數ff的極大極小問題, 可以轉化為求解函數f導數等於0的問題, 這樣求可以把優化問題看成方程求解問題(f的導數等於0). 剩下的問題就和牛頓法求解方程根的思想很相似了.
目標函數的泰勒展開式:
化簡後:
這樣就得到了與圖1相似的公式,這里是二維的,在多維空間上,求二階導數就是求海森矩陣,因為是分母,所以還需要求海森矩陣的逆矩陣.
牛頓法和SGD的區別:
牛頓法是二階求導,SGD是一階求導,所以牛頓法要收斂的更快一些.SGD只考慮當前情況下梯度下降最快的方向,而牛頓法不僅考慮當前梯度下降最快,還有考慮下一步下降最快的方向.
牛頓法的優點是二階求導下降速度快,但是因為是迭代演算法,每一步都需要求解海森矩陣的逆矩陣,所以計算復雜.
3.擬牛頓法(沒搞懂,待定)
考慮到牛頓法計算海森矩陣比較麻煩,所以它使用正定矩陣來代替海森矩陣的逆矩陣,從而簡化了計算過程.
常用的擬牛頓法有DFP演算法和BFGS演算法.
4.共軛梯度法(Conjugate Gradient)
共軛梯度法是介於最速下降法與牛頓法之間的一個方法,它僅需利用一階導數信息,但克服了最速下降法收斂慢的缺點,又避免了牛頓法計算海森矩陣並求逆的缺點.共軛梯度法不僅是解決大型線性方程組最有用的方法之一,也是解大型非線性最優化最有效的演算法之一.
5.拉格朗日法
參考SVM里的講解 機器學習-SVM
6.動量優化法(Momentum)
動量優化法主要是在SGD的基礎上,加入了歷史的梯度更新信息或者說是加入了速度更新.SGD雖然是很流行的優化演算法,但是其學習過程很慢,因為總是以同樣的步長沿著梯度下降的方向.所以動量是為了加速學習的方法.
其中第一行的減號部分是計算當前的梯度,第一行是根據梯度更新速度v,而α是新引進的參數,在實踐中,α的一般取值為 0.5,0.9 和 0.99.和學習率 一樣,α 也會隨著時間不斷調整.一般初始值是一個較小的值,隨後會慢慢變大.
7.Nesterov加速梯度(NAG, Nesterov accelerated gradient)
NAG是在動量優化演算法的基礎上又進行了改進.根據下圖可以看出,Nesterov 動量和標准動量之間的區別體現在梯度計算上, Nesterov 動量中,梯度計算在施加當前速度之後.因此,Nesterov 動量可以解釋為往標准動量方法中添加了一個校正因子
8.AdaGrad演算法
AdaGrad演算法,自適應優化演算法的一種,獨立地適應所有模型參數的學習率,縮放每個參數反比於其所有梯度歷史平均值總和的平方根.具有代價函數最大梯度的參數相應地有個快速下降的學習率,而具有小梯度的參數在學習率上有相對較小的下降.通俗一點的講,就是根據實際情況更改學習率,比如模型快要收斂的時候,學習率步長就會小一點,防止跳出最優解.
其中g是梯度,第一行的分母是計算累計梯度的平方根, 是為了防止分母為0加上的極小常數項,α是學習率.
Adagrad的主要優點是不需要人為的調節學習率,它可以自動調節.但是依然需要設置一個初始的全局學習率.缺點是隨著迭代次數增多,學習率會越來越小,最終會趨近於0.
9.RMSProp演算法
RMSProp修改 AdaGrad 以在非凸設定下效果更好,改變梯度積累為指數加權的移動平均.AdaGrad旨在應用於凸問題時快速收斂.
10.AdaDelta演算法
11.Adam演算法
Adam是Momentum和RMSprop的結合體,也就是帶動量的自適應優化演算法.
12.Nadam演算法
13.模擬退火演算法
14.蟻群演算法
15.遺傳演算法
動量是為了加快學習速度,而自適應是為了加快收斂速度,注意學習速度快不一定收斂速度就快,比如步長大學習速度快,但是很容易跳出極值點,在極值點附近波動,很難達到收斂.
未完待定....
參考:
《統計學習方法》 李航 著
《深度學習》 花書
6. 關於粒子群演算法的目標函數優化,優化函數如下圖
function main()
clc;clear all;close all;
tic; %程序運行計時
E0=0.001; %允許誤差
MaxNum=100; %粒子最大迭代次數
narvs=1; %目標函數的自變數個數
particlesize=30; %粒子群規模
c1=2; %每個粒子的個體學習因子,也稱為加速常數
c2=2; %每個粒子的社會學習因子,也稱為加速常數
w=0.6; %慣性因子
vmax=0.8; %粒子的最大飛翔速度
x=-5+10*rand(particlesize,narvs); %粒子所在的位置
v=2*rand(particlesize,narvs); %粒子的飛翔速度
%用inline定義適應度函數以便將子函數文件與主程序文件放在一起,
%目標函數是:y=1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2))
%inline命令定義適應度函數如下:
fitness=inline('1/(1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2)))','x');
%inline定義的適應度函數會使程序運行速度大大降低
for i=1:particlesize
for j=1:narvs
f(i)=fitness(x(i,j));
end
end
personalbest_x=x;
7. 想知道優化演算法是什麼
優化演算法是通過改善計算方式來最小化或最大化損失函數E(x)。模型內部有些參數是用來計算測試集中目標值Y的真實值和預測值的偏差程度的,基於這些參數就形成了損失函數E(x),比如說,權重(W)和偏差(b)就是這樣的內部參數,一般用於計算輸出值,在訓練神經網路模型時起到主要作用。

優化演算法分的分類
一階優化演算法是使用各參數的梯度值來最小化或最大化損失函數E(x),最常用的一階優化演算法是梯度下降。函數梯度導數dy/dx的多變數表達式,用來表示y相對於x的瞬時變化率。
二階優化演算法是使用了二階導數也叫做Hessian方法來最小化或最大化損失函數,由於二階導數的計算成本很高,所以這種方法並沒有廣泛使用。
8. 關於粒子群演算法的目標函數優化,優化函數如下圖
粒子群演算法的目標函數極小點程序
( ) 2 用牛頓法求 f ( X ) ? x12 ? 2 x2 ? ln(x1 x2 ? 1) 的極小點,分別設 X 0 =[2,1.5]T
和 X(0)=[1.5,2]T,終止條件為 g ? 10?5 。
解:先求得 f(x)的梯度? 和海瑟矩陣?2 , 根據牛頓法的迭代公式 +1 = ? ?2 ?1 ? ( = 0,1,2 … … ) ?6 經過反復迭代直至||? ||≤ 10 ,得到極小值。 牛頓法的 M 文件如下:
syms x1 x2 f=x1^2+2*x2^2-log(x1*x2-1); v=[x1,x2]; x01=2; x02=1.5; g=jacobian(f,v); G=jacobian(g,v); g1=subs(subs(g,x01),x02); disp(g1); G1=subs(subs(G,x01),x02); dd=norm(g1); dd=vpa(dd,7); x1=x01;x2=x02; x=[x1,x2]; n=0; while(dd>0.000001) G1=inv(G1); x=x-g1*G1; g1=subs(subs(g,x(1)),x(2)); G1=subs(subs(G,x(1)),x(2)); x=x; dd=norm(g1); dd=vpa(dd,7); n=n+1; end x1=x(1);x2=x(2); f=x1^2+2*x2^2-log(x1*x2-1); f=vpa(f,7); disp('f='); disp(f); x=vpa(x,7); disp('x='); disp(x); disp('n=')
