當前位置:首頁 » 操作系統 » 梯度演算法

梯度演算法

發布時間: 2022-01-15 13:22:34

① 基於R語言的梯度推進演算法介紹

基於R語言的梯度推進演算法介紹

通常來說,我們可以從兩個方面來提高一個預測模型的准確性:完善特徵工程(feature engineering)或是直接使用Boosting演算法。通過大量數據科學競賽的試煉,我們可以發現人們更鍾愛於Boosting演算法,這是因為和其他方法相比,它在產生類似的結果時往往更加節約時間。

Boosting演算法有很多種,比如梯度推進(Gradient Boosting)、XGBoost、AdaBoost、Gentle Boost等等。每一種演算法都有自己不同的理論基礎,通過對它們進行運用,演算法之間細微的差別也能夠被我們所察覺。如果你是一個新手,那麼太好了,從現在開始,你可以用大約一周的時間來了解和學習這些知識。

在本文中,筆者將會向你介紹梯度推進演算法的基本概念及其復雜性,此外,文中還分享了一個關於如何在R語言中對該演算法進行實現的例子。

快問快答

每當談及Boosting演算法,下列兩個概念便會頻繁的出現:Bagging和Boosting。那麼,這兩個概念是什麼,它們之間究竟有什麼區別呢?讓我們快速簡要地在這里解釋一下:

Bagging:對數據進行隨機抽樣、建立學習演算法並且通過簡單平均來得到最終概率結論的一種方法。

Boosting:與Bagging類似,但在樣本選擇方面顯得更為聰明一些——在演算法進行過程中,對難以進行分類的觀測值賦予了越來越大的權重。

我們知道你可能會在這方面產生疑問:什麼叫做越來越大?我怎麼知道我應該給一個被錯分的觀測值額外增加多少的權重呢?請保持冷靜,我們將在接下來的章節里為你解答。

從一個簡單的例子出發

假設你有一個初始的預測模型M需要進行准確度的提高,你知道這個模型目前的准確度為80%(通過任何形式度量),那麼接下來你應該怎麼做呢?

有一個方法是,我們可以通過一組新的輸入變數來構建一個全新的模型,然後對它們進行集成學習。但是,筆者在此要提出一個更簡單的建議,如下所示:

Y= M(x) + error

如果我們能夠觀測到誤差項並非白雜訊,而是與我們的模型輸出(Y)有著相同的相關性,那麼我們為什麼不通過這個誤差項來對模型的准確度進行提升呢?比方說:

error = G(x) + error2

或許,你會發現模型的准確率提高到了一個更高的數字,比如84%。那麼下一步讓我們對error2進行回歸。

error2 = H(x) + error3

然後我們將上述式子組合起來:

Y = M(x) + G(x) + H(x) + error3

這樣的結果可能會讓模型的准確度更進一步,超過84%。如果我們能像這樣為三個學習演算法找到一個最佳權重分配,

Y = alpha * M(x) + beta * G(x) + gamma * H(x) + error4

那麼,我們可能就構建了一個更好的模型。

上面所述的便是Boosting演算法的一個基本原則,當我初次接觸到這一理論時,我的腦海中很快地冒出了這兩個小問題:

1.我們如何判斷回歸/分類方程中的誤差項是不是白雜訊?如果無法判斷,我們怎麼能用這種演算法呢?

2.如果這種演算法真的這么強大,我們是不是可以做到接近100%的模型准確度?

接下來,我們將會對這些問題進行解答,但是需要明確的是,Boosting演算法的目標對象通常都是一些弱演算法,而這些弱演算法都不具備只保留白雜訊的能力;其次,Boosting有可能導致過度擬合,所以我們必須在合適的點上停止這個演算法。

試著想像一個分類問題

請看下圖:

從最左側的圖開始看,那條垂直的線表示我們運用演算法所構建的分類器,可以發現在這幅圖中有3/10的觀測值的分類情況是錯誤的。接著,我們給予那三個被誤分的「+」型的觀測值更高的權重,使得它們在構建分類器時的地位非常重要。這樣一來,垂直線就直接移動到了接近圖形右邊界的位置。反復這樣的過程之後,我們在通過合適的權重組合將所有的模型進行合並。

演算法的理論基礎

我們該如何分配觀測值的權重呢?

通常來說,我們從一個均勻分布假設出發,我們把它稱為D1,在這里,n個觀測值分別被分配了1/n的權重。

步驟1:假設一個α(t);

步驟2:得到弱分類器h(t);

步驟3:更新總體分布,

其中,

步驟4:再次運用新的總體分布去得到下一個分類器;

覺得步驟3中的數學很可怕嗎?讓我們來一起擊破這種恐懼。首先,我們簡單看一下指數里的參數,α表示一種學習率,y是實際的回應值(+1或-1),而h(x)則是分類器所預測的類別。簡單來說,如果分類器預測錯了,這個指數的冪就變成了1 *α, 反之則是-1*α。也就是說,如果某觀測值在上一次預測中被預測錯誤,那麼它對應的權重可能會增加。那麼,接下來該做什麼呢?

步驟5:不斷重復步驟1-步驟4,直到無法發現任何可以改進的地方;

步驟6:對所有在上面步驟中出現過的分類器或是學習演算法進行加權平均,權重如下所示:

案例練習

最近我參加了由Analytics Vidhya組織的在線hackathon活動。為了使變數變換變得容易,在complete_data中我們合並了測試集與訓練集中的所有數據。我們將數據導入,並且進行抽樣和分類。

library(caret)rm(list=ls())setwd("C:Usersts93856DesktopAV")library(Metrics)complete <- read.csv("complete_data.csv", stringsAsFactors = TRUE)train <- complete[complete$Train == 1,]score <- complete[complete$Train != 1,]set.seed(999)ind <- sample(2, nrow(train), replace=T, prob=c(0.60,0.40))trainData<-train[ind==1,]testData <- train[ind==2,]set.seed(999)ind1 <- sample(2, nrow(testData), replace=T, prob=c(0.50,0.50))trainData_ens1<-testData[ind1==1,]testData_ens1 <- testData[ind1==2,]table(testData_ens1$Disbursed)[2]/nrow(testData_ens1)#Response Rate of 9.052%

接下來,就是構建一個梯度推進模型(Gradient Boosting Model)所要做的:

fitControl <- trainControl(method = "repeatedcv", number = 4, repeats = 4)trainData$outcome1 <- ifelse(trainData$Disbursed == 1, "Yes","No")set.seed(33)gbmFit1 <- train(as.factor(outcome1) ~ ., data = trainData[,-26], method = "gbm", trControl = fitControl,verbose = FALSE)gbm_dev <- predict(gbmFit1, trainData,type= "prob")[,2]gbm_ITV1 <- predict(gbmFit1, trainData_ens1,type= "prob")[,2]gbm_ITV2 <- predict(gbmFit1, testData_ens1,type= "prob")[,2]auc(trainData$Disbursed,gbm_dev)auc(trainData_ens1$Disbursed,gbm_ITV1)auc(testData_ens1$Disbursed,gbm_ITV2)

在上述案例中,運行代碼後所看到的所有AUC值將會非常接近0.84。我們隨時歡迎你對這段代碼進行進一步的完善。在這個領域,梯度推進模型(GBM)是最為廣泛運用的方法,在未來的文章里,我們可能會對GXBoost等一些更加快捷的Boosting演算法進行介紹。

結束語

筆者曾不止一次見識過Boosting演算法的迅捷與高效,在Kaggle或是其他平台的競賽中,它的得分能力從未令人失望,當然了,也許這要取決於你能夠把特徵工程(feature engineering)做得多好了。

以上是小編為大家分享的關於基於R語言的梯度推進演算法介紹的相關內容,更多信息可以關注環球青藤分享更多干貨

② 計算梯度有幾種數值方法

數值計算導數的方法很多,
常用的有插值型求導公式用於求某點上導數,樣條求導公式用於求利用插值的結果擬合出的結果。一般有3點公式或者5點公式。
一般可以根據需要自己構造求導的演算法,這些求導演算法都可以用來算梯度。
Matlab中可以直接用del命令計算高度矩陣的表面梯度。
對應不同的情況,可以有各種各樣的方法。

③ 圖像銳化技術中的梯度法、拉普拉斯演算法、Robert演算法,哪種比較簡單請大神指教

梯度比較簡單 只說原理的話 其實robert演算法等都挺容易理解。就是將像素用其周圍的像素的某種結合來代替,來找到邊緣

④ 大學數學中grad怎麼算

grad梯度演算法如下圖所示:


梯度的本意是一個向量(矢量),表示某一函數在該點處的方向導數沿著該方向取得最大值,即函數在該點處沿著該方向(此梯度的方向)變化最快,變化率最大(為該梯度的模)。

(4)梯度演算法擴展閱讀

在向量微積分中,標量場的梯度是一個向量場。標量場中某一點上的梯度指向標量場增長最快的方向,梯度的長度是這個最大的變化率。

在單變數的實值函數的情況,梯度只是導數,或者,對於一個線性函數,也就是線的斜率。

梯度一詞有時用於斜度,也就是一個曲面沿著給定方向的傾斜程度。可以通過取向量梯度和所研究的方向的點積來得到斜度。

梯度的數值有時也被稱為梯度。

⑤ 用matlab實現梯度下降演算法(gradient descent)。

function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters)
%GRADIENTDESCENT Performs gradient descent to learn theta
% theta = GRADIENTDESENT(X, y, theta, alpha, num_iters) updates theta by
% taking num_iters gradient steps with learning rate alpha
% Initialize some useful values
m = length(y); % number of training examples
J_history = zeros(num_iters, 1);
for iter = 1:num_iters,
% ====================== YOUR CODE HERE ======================
% Instructions: Perform a single gradient step on the parameter vector
% theta.
%
% Hint: While debugging, it can be useful to print out the values
% of the cost function (computeCost) and gradient here.

p=theta(1)-alpha*(1/m)*(sum((X*theta-y).*X(:,1)));
q=theta(2)-alpha*(1/m)*(sum((X*theta-y).*X(:,2)));
theta(1)=p;
theta(2)=q;

% ============================================================
% Save the cost J in every iteration
J_history(iter) = computeCost(X, y, theta);
end
end

⑥ 梯度上升演算法與梯度下降演算法求解回歸系數怎麼理解

如果grad為梯度陣mean(mean(grad))就是所有點灰度梯度的平均值。
其實是一回事了。最小化損失函數,就用梯度下降,最大化似然函數,就用梯度上升。
本質上都是一樣的。

⑦ 什麼是梯度下降演算法

梯度下降是迭代法的一種,梯度下降法是一個最優化演算法,通常也稱為最速下降法。最速下降法是求解無約束優化問題最簡單和最古老的方法之一,常用於機器學習和人工智慧當中用來遞歸性地逼近最小偏差模型。
梯度下降法的計算過程就是沿梯度下降的方向求解極小值(也可以沿梯度上升方向求解極大值)。

⑧ 如何理解近端梯度演算法

L1正則化是一種常用的獲取稀疏解的手段,同時L1范數也是L0范數的鬆弛范數。求解L1正則化問題最常用的手段就是通過加速近端梯度演算法來實現的。

考慮一個這樣的問題:

minx f(x)+λg(x)

x∈Rn,f(x)∈R,這里f(x)是一個二階可微的凸函數,g(x)是一個凸函數(或許不可導),如上面L1的正則化||x||。

此時,只需要f(x)滿足利普希茨(Lipschitz)連續條件,即對於定義域內所有向量x,y,存在常數M使得||f'(y)-f'(x)||<=M·||y-x||,那麼這個模型就可以通過近端梯度演算法來進行求解了。

ps:下面涉及很多數學知識,不想了解數學的朋友請跳到結論處,個人理解,所以也不能保證推理很嚴謹,如有問題,請一定幫忙我告訴我。

利普希茨連續條件的幾何意義可以認為是函數在定義域內任何點的梯度都不超過M(梯度有上限),也就是說不會存在梯度為正負無窮大的情況。

因而,我們有下圖所示的推算:

我們可以用f(y) = f(x)+f'(x)(y-x)+M/2*||y-x||2來近似的表示f(y),也可以認為是高維下的泰勒分解,取到二次項。

我們換一種寫法,f(xk+1) = f(xk)+f'(xk)(xk+1-xk)+M/2*||xk+1-xk||2,也就是說可以直接迭代求minx f(x),就是牛頓法辣。

再換一種寫法,f(xk+1)=(M/2)(xk+1-(xk+(1/M)f'(xk)))2+CONST,其中CONST是一個與xk+1無關的常數,也就是說,此時我們可以直接寫出這個條件下xk+1的最優取值就是xk+1=xk+(1/M)f'(xk)。令z=xk+(1/M)f'(xk)。

回到原問題,minx f(x)+λg(x),此時問題變為了求解minx (M/2)||x-z||2+λg(x)。

實際上在求解這個問題的過程中,x的每一個維度上的值是互不影響的,可以看成n個獨立的一維優化問題進行求解,最後組合成一個向量就行。

如果g(x)=||x||1,就是L1正則化,那麼最後的結論可以通過收縮運算元來表示。

即xk+1=shrink(z,λ/M)。具體來說,就是Z向量的每一個維度向原點方向移動λ/M的距離(收縮,很形象),對於xk+1的第i個維度xi=sgn(zi)*max(|zi|-λ/M,0),其中sgn()為符號函數,正數為1,負數為-1。

一直迭代直到xk收斂吧。

⑨ 什麼叫流量梯度演算法

這里不能傳圖片呀,無法把公式給你!
我就描述下,就是對函數的每個分量分別就求偏導,加起來就是了。

⑩ 梯度下降法和粒子群優化演算法的區別

粒子群(PSO)演算法是近幾年來最為流行的進化演算法,最早是由Kenned和Eberhart於1995年提出.PSO 演算法和其他進化演算法類似,也採用「群體」和「進化」的概念,通過個體間的協作與競爭,實現復雜空間中最優解的搜索.PSO 先生成初始種群,即在可行解空間中隨機初始化一群粒子,每個粒子都為優化問題的一個可行解,並由目標函數為之確定一個適應值(fitness value).PSO 不像其他進化演算法那樣對於個體使用進化運算元,而是將每個個體看作是在n 維搜索空間中的一個沒有體積和重量的粒子,每個粒子將在解空間中運動,並由一個速度決定其方向和距離.通常粒子將追隨當前的最優粒子而運動,並經逐代搜索最後得到最優解.在每一代中,粒子將跟蹤兩個極值,一為粒子本身迄今找到的最優解 pbest ,另一為全種群迄今找到的最優解 gbest.由於認識到 PSO 在函數優化等領域所蘊含的廣闊的應用前景,在 Kenned 和 Eberhart 之後很多學者都進行了這方面的研究.目前已提出了多種 PSO改進演算法,並廣泛應用到許多領域。

熱點內容
資料庫設計模板 發布:2024-11-15 00:47:25 瀏覽:825
編程的悟性 發布:2024-11-15 00:47:24 瀏覽:733
主流可編譯語言 發布:2024-11-15 00:42:23 瀏覽:729
excel緩存清除 發布:2024-11-15 00:39:53 瀏覽:486
機械鍵盤可編程 發布:2024-11-15 00:39:09 瀏覽:912
php判斷字元開頭 發布:2024-11-15 00:35:33 瀏覽:507
網易蘋果游戲怎麼轉移到安卓 發布:2024-11-15 00:07:52 瀏覽:270
win7php環境搭建 發布:2024-11-15 00:06:55 瀏覽:17
erpjava 發布:2024-11-14 23:52:23 瀏覽:253
電腦版地平線四怎麼連上伺服器 發布:2024-11-14 23:46:42 瀏覽:472