三、梯度下降法求解最優θ值

一、梯度下降法(GD,Gradient Descent)

Ⅰ、得到目標函數J(θ),求解使得J(θ)最小時的θ值

在這里插入圖片描述
當然,這里只是取了倆特征而已,實際上會有m個特征維度

通過最小二乘法求目標函數最小值
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
令偏導為0即可求解出最小的θ值,即在這里插入圖片描述

Ⅱ、判定為凸函數

凸函數有需要判斷方法,比如:定義、一階條件、二階條件等。利用正定性判定使用的是二階條件。
半正定一定是凸函數,開口朝上,半正定一定有極小值
在用二階條件進行判定的時候,需要得到Hessian矩陣,根據Hessian的正定性判定函數的凹凸性。比如Hessian矩陣半正定,函數為凸函數;Hessian矩陣正定,函數為嚴格凸函數

Hessian矩陣:黑塞矩陣(Hessian Matrix),又稱為海森矩陣、海瑟矩陣、海塞矩陣等,是一個多元函數的二階偏導數構成的方陣,描述了函數的局部曲率。

Ⅲ、Hessian矩陣

黑塞矩陣是由目標函數在點x處的二階偏導數組成的對稱矩陣
正定:對A的特征值全為正數,那么A一定是正定的
不正當:非正定或半正定
若A的特征值≥0,則半正定,否則,A為非正定。

對J(θ)損失函數求二階導,之后得到的一定是半正定的,因為自己和自己做點乘。在這里插入圖片描述

Ⅳ、解析解

在這里插入圖片描述
數值解是在一定條件下通過某種近似計算得出來的一個數值,能在給定的精度條件下滿足方程,解析解為方程的解析式(比如求根公式之類的),是方程的精確解,能在任意精度下滿足方程。

Ⅴ、梯度下降法

這個課程跟其他課程講的差不多,這里我就不再贅述了。梯度下降法

梯度下降法:是一種以最快的速度找到最優解的方法。

流程:
1,初始化θ,這里的θ是一組參數,初始化也就是random一下即可
2,求解梯度gradient
3,θ(t+1) = θ(t) - grand*learning_rate
這里的learning_rate常用α表示學習率,是個超參數,太大的話,步子太大容易來回震蕩;太小的話,迭代次數很多,耗時。
4,grad < threshold時,迭代停止,收斂,其中threshold也是個超參數
超參數:需要用戶傳入的參數,若不傳使用默認的參數。

Ⅵ、代碼實現

導包

import numpy as np
import matplotlib.pyplot as plt

初始化樣本數據

# 這里相當于是隨機X維度X1,rand是隨機均勻分布
X = 2 * np.random.rand(100, 1)
# 人為的設置真實的Y一列,np.random.randn(100, 1)是設置error,randn是標準正太分布
y = 4 + 3 * X + np.random.randn(100, 1)
# 整合X0和X1
X_b = np.c_[np.ones((100, 1)), X]
print(X_b)
"""
[[1.         1.01134124][1.         0.98400529][1.         1.69201204][1.         0.70020158][1.         0.1160646 ][1.         0.42502983][1.         1.90699898][1.         0.54715372][1.         0.73002827][1.         1.29651341][1.         1.62559406][1.         1.61745598][1.         1.86701453][1.         1.20449051][1.         1.97722538][1.         0.5063885 ][1.         1.61769812][1.         0.63034575][1.         1.98271789][1.         1.17275471][1.         0.14718811][1.         0.94934555][1.         0.69871645][1.         1.22897542][1.         0.59516153][1.         1.19071408][1.         1.18316576][1.         0.03684612][1.         0.3147711 ][1.         1.07570897][1.         1.27796797][1.         1.43159157][1.         0.71388871][1.         0.81642577][1.         1.68275133][1.         0.53735427][1.         1.44912342][1.         0.10624546][1.         1.14697422][1.         1.35930391][1.         0.73655224][1.         1.08512154][1.         0.91499434][1.         0.62176609][1.         1.60077283][1.         0.25995875][1.         0.3119241 ][1.         0.25099575][1.         0.93227026][1.         0.85510054][1.         1.5681651 ][1.         0.49828274][1.         0.14520117][1.         1.61801978][1.         1.08275593][1.         0.53545855][1.         1.48276384][1.         1.19092276][1.         0.19209144][1.         1.91535667][1.         1.94012402][1.         1.27952383][1.         1.23557691][1.         0.9941706 ][1.         1.04642378][1.         1.02114013][1.         1.13222297][1.         0.5126448 ][1.         1.22900735][1.         1.49631537][1.         0.82234995][1.         1.24810189][1.         0.67549922][1.         1.72536141][1.         0.15290908][1.         0.17069838][1.         0.27173192][1.         0.09084242][1.         0.13085313][1.         1.72356775][1.         1.65718819][1.         1.7877667 ][1.         1.70736708][1.         0.8037657 ][1.         0.5386607 ][1.         0.59842584][1.         0.4433115 ][1.         0.11305317][1.         0.15295053][1.         1.81369029][1.         1.72434082][1.         1.08908323][1.         1.65763828][1.         0.75378952][1.         1.61262625][1.         0.37017158][1.         1.12323188][1.         0.22165802][1.         1.69647343][1.         1.66041812]]
"""

在這里插入圖片描述

# 常規等式求解theta
theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
print(theta_best)
"""
[[3.9942692 ][3.01839793]]
"""
# 創建測試集里面的X1
X_new = np.array([[0], [2]]) 
X_new_b = np.c_[(np.ones((2, 1))), X_new]
print(X_new_b)
y_predict = X_new_b.dot(theta_best)
print(y_predict)
"""
[[1. 0.][1. 2.]]
[[ 3.9942692 ][10.03106506]]
"""

繪圖

plt.plot(X_new, y_predict, 'r-')
plt.plot(X, y, 'b.')
plt.axis([0, 2, 0, 15])
plt.show()

在這里插入圖片描述

Ⅶ、完整代碼

import numpy as np
import matplotlib.pyplot as plt# 這里相當于是隨機X維度X1,rand是隨機均勻分布
X = 2 * np.random.rand(100, 1)
# 人為的設置真實的Y一列,np.random.randn(100, 1)是設置error,randn是標準正太分布
y = 4 + 3 * X + np.random.randn(100, 1)# 整合X0和X1
X_b = np.c_[np.ones((100, 1)), X]
print(X_b)# 常規等式求解theta
theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
print(theta_best)# 創建測試集里面的X1
X_new = np.array([[0], [2]]) 
X_new_b = np.c_[(np.ones((2, 1))), X_new]
print(X_new_b)
y_predict = X_new_b.dot(theta_best)
print(y_predict)#繪圖
plt.plot(X_new, y_predict, 'r-')
plt.plot(X, y, 'b.')
plt.axis([0, 2, 0, 15])
plt.show()

二、批量梯度下降法(BGD,Batch Gradient Descent)

Ⅰ、梯度下降法流程

梯度下降法流程:
1,初始化theta,w0…wn
2,接著求梯度gradient
3,theta_t+1 = theta_t - grad * learning_rate
learning_rate是個超參數,太大容易來回振蕩,太小步子太短,需要走很長時間,不管太大還是太小,
都會迭代次數很多,耗時很長
4,等待grad < threshold,迭代停止,收斂,threshold是個超參數

推導線性回歸的loss function的導函數,目的是可以更快的求解梯度!
grad_j = (1/m) * (Xj)^Transpose * (Xtheta - y)
grads = (1/m) * X^Transpose * (X
theta - y)

上面就是批量梯度下降的時候,去求解gradients梯度的公式!
不管是批量梯度下降,還是隨機梯度下降,流程里面的1,3,4都是一樣的,只有第二步求梯度稍有不同!
在這里插入圖片描述

Ⅱ、批量梯度下降法(BGF)

在這里插入圖片描述
初始化W,隨機W,進行賦初始值
沿著負梯度方向迭代,更新后的W使得J(W)更小

Ⅲ、完整代碼

import numpy as npX = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
X_b = np.c_[np.ones((100, 1)), X]
# print(X_b)learning_rate = 0.1
n_iterations = 10000
m = 100# 1,初始化theta,w0...wn
theta = np.random.randn(2, 1)
count = 0# 4,不會設置閾值,之間設置超參數,迭代次數,迭代次數到了,我們就認為收斂了
for iteration in range(n_iterations):count += 1# 2,接著求梯度gradientgradients = 1/m * X_b.T.dot(X_b.dot(theta)-y)# 3,應用公式調整theta值,theta_t + 1 = theta_t - grad * learning_ratetheta = theta - learning_rate * gradientsprint(count)
print(theta)

三、隨機梯度下降法(SGD,Stochastic Gradient Descent)

批量梯度下降法中考慮了所有的樣本的梯度,找到最優梯度然后再往下走,很慢。
隨機梯度下降則從所有的樣本中隨機找一個樣本的梯度,然后按這個梯度向下走
在這里插入圖片描述

完整代碼
import numpy as npdef learning_schedule(t):#隨著迭代次數的增加,會相應的減小學習率return t0 / (t+t1)X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
X_b = np.c_[np.ones((100, 1)), X]
# print(X_b)n_epoches = 500
t0,t1 = 5,50#超參數m = 100
theta = np.random.randn(2,1)#隨機初始化θ值for epoch in range(n_epoches):#執行500次迭代for i in range(m):random_index = np.random.randint(m)#從m個樣本中隨機抽取一個,作為索引xi = X_b[random_index:random_index+1]#根據索引取出值yi = y[random_index:random_index+1]gradients = 2*xi.T.dot(xi.dot(theta)-yi)#得到梯度learning_rate = learning_schedule(epoch*m+i)#隨著迭代次數的增加,會相應的減小學習率theta = theta - learning_rate * gradients#根據梯度下降公式調整θprint(theta)

上面代碼里面除了隨機抽取一條數據來求解梯度,還隨著迭代次數的增多,不斷減小learning_rate,最終減小步長!

總結

Ⅰ隨機梯度下降,怎么隨機的呢?
答:其實就是在求梯度的時候,不再用所有的m個樣本數據來計算,而是隨機的選擇一條數據來計算梯度!

Ⅱ隨機梯度下降的好處是什么?缺點是什么?
答:在求梯度的時候快,迭代次數有可能更多,最終可能落不到全局最優解上

ⅢMini-Batch GD是什么?
答:就是在求梯度的時候做了一個折中,不用所有的數據,而是隨機選擇一部分數據來求梯度!

Ⅳ為什么要不斷的調整步長?
答:就是為了讓越接近最優解的時候,調整的幅度越小,避免來回震蕩!

Ⅴ如果我們不人為的調小步長,會不會隨著迭代的次數增多,調整的幅度自動減小?
答:調整的幅度取決于誰?取決于學習率和梯度,梯度事實上越接近最優解,梯度的絕對值越小

四、小批量梯度下降法(MBGD,Mini-Batch Gradient Descent)

隨機梯度下降法是隨機抽取一個樣本的梯度作為整體梯度進行下降,速度上去了,但是樣本的隨機選取很容易抽到不好的樣本導致最終的結果偏差很大。批量梯度下降法考慮了所有樣本的梯度,選擇最優,但是速度太慢。
小批量梯度下降法隨機選取一小部分樣本的梯度,選擇其中最優的解作為最終的梯度。隨著迭代次數的增加學習率會降低,步長減小。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/377840.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377840.shtml
英文地址,請注明出處:http://en.pswp.cn/news/377840.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Delphi中Messagedlg用法

if MessageDlg(Welcome to my Delphi application. Exit now?, mtConfirmation, [mbYes, mbNo], 0) mrYes then begin Close; end;MessageDlg用法 對話框類型&#xff1a;mtwarning——含有感嘆號的警告對話框mterror——含有紅色叉符號的錯誤對話框mtinformation——含有藍…

leetcode 131. 分割回文串 思考分析

題目 給定一個字符串 s&#xff0c;將 s 分割成一些子串&#xff0c;使每個子串都是回文串。 返回 s 所有可能的分割方案。 思考 問題可以分為兩個子問題&#xff1a;1、判斷回文串2、分割數組 判斷回文串 bool isPalindrome_string(string s,int startindex,int endinde…

android淡入淡出動畫_在Android中淡入動畫示例

android淡入淡出動畫1) XML File: activity_main 1)XML文件&#xff1a;activity_main <?xml version"1.0" encoding"utf-8"?><android.support.constraint.ConstraintLayout xmlns:android"http://schemas.android.com/apk/res/android&…

[慢查優化]聯表查詢注意誰是驅動表 你搞不清楚誰join誰更好時請放手讓mysql自行判定...

寫在前面的話&#xff1a; 不要求每個人一定理解 聯表查詢(join/left join/inner join等)時的mysql運算過程&#xff1b; 不要求每個人一定知道線上&#xff08;現在或未來&#xff09;哪張表數據量大&#xff0c;哪張表數據量小&#xff1b; 但把mysql客戶端&#xff08;如SQL…

四、梯度下降歸一化操作

一、歸一化 Ⅰ什么是歸一化&#xff1f; 答&#xff1a;其實就是把數據歸一到0-1之間&#xff0c;也就是縮放。 常用的歸一化操作是最大最小值歸一化&#xff0c;公式如下&#xff1a; 例如&#xff1a;1&#xff0c;3&#xff0c;5&#xff0c;7&#xff0c;9&#xff0c;10…

[轉帖][強烈推薦]網頁表格(Table/GridView)標題欄和列凍結(跨瀏覽器兼容)

GridView的標題欄、列凍結效果(跨瀏覽器版) 本文來源&#xff1a;http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/02/18/supertable-plugin-for-jquery.aspx 稍早發表了GridView 的標題列凍結效果&#xff0c;足以滿足工作上的需求&#xff0c;不過存在兩個缺點:…

psu是什么電腦配件_PSU的完整形式是什么?

psu是什么電腦配件PSU&#xff1a;電源部門/公共部門事業 (PSU: Power Supply Unit / Public Sector Undertaking) 1)PSU&#xff1a;電源設備 (1) PSU: Power Supply Unit) PSU is an abbreviation of the "Power Supply Unit". PSU是“電源設備”的縮寫 。 It is a…

【C++grammar】斷言與表達式常量

目錄1、常量表達式和constexpr關鍵字2、斷言與C11的靜態斷言1.1. assert : C語言的宏(Macro)&#xff0c;運行時檢測。1.2. assert()依賴于NDEBUG 宏1.3. assert 幫助調試解決邏輯bug &#xff08;部分替代“斷點/單步調試”&#xff09;2.1static_assert (C11的靜態斷言 )2.2.…

一些又用的國內著名期刊

記&#xff1a; 電子學報、電子與信息學報、圖像圖形學報、自動化學報、計算機學報、軟件學報、計算機研究與發展。轉載于:https://www.cnblogs.com/nanyangzp/p/3322244.html

一、Arduino UNO R3將數據上傳至云平臺

一、準備工作 ①ESP12E Shield ②Arduino UNO R3開發板 ③把ESP12E Shield安裝到Arduino UNO R3開發板上 ④登錄物聯網平臺注冊個賬號&#xff0c;到時候需要使用。 ⑤記錄下來你的Uid和key到時候會用到 ⑥創建個設備&#xff0c;用于測試 ⑦beyondyanyu為設備名&…

怎樣做一個快樂的ASP.NET程序員

首先我想解釋一下標題中兩個關鍵字: "快樂", "ASP.NET程序員". 有的人想成為一個"杰出"的程序員, 或者"資深"的程序員, 簡單來說就是"大牛"級的人物 -- 但是本文不是針對此種發展方向不是說我不鼓勵大家朝這方向走, 而是對我…

__eq___C ++'and_eq'關鍵字和示例

__eq__"and_eq" is an inbuilt keyword that has been around since at least C98. It is an alternative to & (Bitwise AND Assignment) operator and it mostly uses for bit manipulations. “ and_eq”是一個內置關鍵字&#xff0c;至少從C 98起就存在。 它…

leetcode 93. 復原IP地址 思考分析

題目 給定一個只包含數字的字符串&#xff0c;復原它并返回所有可能的 IP 地址格式。 有效的 IP 地址 正好由四個整數&#xff08;每個整數位于 0 到 255之間組成&#xff0c;且不能含有前導 0&#xff09;&#xff0c;整數之間用 ‘.’ 分隔。 例如&#xff1a;“0.1.2.201” …

二、通過云平臺反向控制Arduino UNO R3

該篇博文是在第一篇博文(一、Arduino UNO R3將數據上傳至云平臺)的基礎上進行的 一、云平臺發送指令反向控制Arduino UNO R3 ESP12E Shield開關都推到OFF&#xff08;要不然下載會報錯&#xff09;&#xff0c;往Arduino UNO R3開發板上下載下面的代碼 這段代碼進行測試要點&…

使用MSBuild編譯FsLex項目

FsLex FsYacc微軟本身也提供了一個項目模板。但是這個項目模板是lex和yacc文件均包含。我想只適用lex&#xff0c;但是如果每次使用命令行也覺得不夠方便&#xff0c;于是還是研究了一番MsBuild的使用。 使用msbuild hellp.fsproj /v:d 可以查看整個msbuild的流程&#xff0c;非…

Python字符串格式:%vs.format

Often the string formatters in python are referred to as old style and new style. The old-style is % and .format is known as the new style. python中的字符串格式化程序通常被稱為舊樣式和新樣式。 舊樣式為&#xff05; &#xff0c;. format被稱為新樣式。 Simple…

【C++grammar】代理構造、不可變對象、靜態成員

目錄1、Delegation Constructor&#xff08;代理構造&#xff09;1. What is delegating constructor? (什么是代理構造/委托構造)2. Avoiding recursive calls of target constructors (避免遞歸調用目標ctor)3. 委托構造的好處2、不可變對象和類1、如何讓類成為“不可變類”…

paip.最新的c++ qt5.1.1環境搭建跟hello world

paip.最新的c qt5.1.1環境搭建跟hello world 作者Attilax &#xff0c; EMAIL:1466519819qq.com 來源&#xff1a;attilax的專欄 地址&#xff1a;http://blog.csdn.net/attilax 有一段時間沒接觸c了...今天下載新的qt下來研究一番.. qt的環境搭建有eclipseqtdtmingwqtl…

RFID模塊+WIFI模塊+振動傳感器+有源蜂鳴器+舵機+Arduino UNO R3所構成的門禁系統模塊

該系統模塊主要由RFID模塊WIFI模塊振動傳感器有源蜂鳴器舵機Arduino UNO R3組成的門禁系統模塊。這里使用舵機充當門鎖&#xff0c;用戶可以刷卡開門&#xff0c;也可以通過APP控制舵機狀態達到開門的效果。若有不法分子想要強行進入室內&#xff0c;對門進行撞擊或者人為的破壞…

PushManager

http://suchandalex.googlecode.com/svn/trunk/beOui/beWe/client/Classes/PushNotificationManager.m轉載于:https://www.cnblogs.com/vincent-lu/archive/2012/01/18/2325740.html