Octave:矢量化

0:00

在這段視頻中 我將介紹有關(guān)向量化的內(nèi)容無論你是用Octave還是別的語言 比如MATLAB或者你正在用PythonNumPy 或 Java C C++所有這些語言都具有各種線性代數(shù)庫這些庫文件都是內(nèi)置的容易閱讀和獲取他們通常寫得很好已經(jīng)經(jīng)過高度優(yōu)化通常是數(shù)值計算方面的博士或者專業(yè)人士開發(fā)的而當你實現(xiàn)機器學習算法時如果你能好好利用這些線性代數(shù)庫或者說數(shù)值線性代數(shù)庫并聯(lián)合調(diào)用它們而不是自己去做那些函數(shù)庫可以做的事情如果是這樣的話 那么通常你會發(fā)現(xiàn) 首先 這樣更有效也就是說運行速度更快并且更好地利用你的計算機里可能有的一些并行硬件系統(tǒng)等等第二 這也意味著你可以用更少的代碼來實現(xiàn)你需要的功能因此 實現(xiàn)的方式更簡單代碼出現(xiàn)問題的有可能性也就越小舉個具體的例子與其自己寫代碼做矩陣乘法
如果你只在Octave中輸入 a乘以b罢洲,就是一個非常有效的兩個矩陣相乘的程序
有很多例子可以說明如果你用合適的向量化方法來實現(xiàn)你就會有一個簡單得多 也有效得多的代碼讓我們來看一些例子這是一個常見的線性回歸假設(shè)函數(shù)如果你想要計算 h(x)注意到右邊是求和那么你可以自己計算j =0 到 j = n 的和但換另一種方式來想想是把 h(x) 看作θ 轉(zhuǎn)置乘以 x那么你就可以寫成兩個向量的內(nèi)積其中 θ 就是θ0 θ1θ2 如果你有兩個特征量如果 n 等于2 并且如果你把 x 看作x0 x1 x2這兩種思考角度會給你兩種不同的實現(xiàn)方式比如說這是未向量化的代碼實現(xiàn)方式計算 h(x) 是未向量化的我的意思是 沒有被向量化我們可能首先要初始化變量 prediction 的值為0.0而這個變量 prediction 的最終結(jié)果就是h(x) 然后我要用一個 for 循環(huán)j 取值 0 到 n+1變量prediction 每次就通過自身加上 theta(j) 乘以 x(j) 更新值這個就是算法的代碼實現(xiàn)順便我要提醒一下這里的向量我用的下標是 0所以我有 θ0 θ1θ2 但因為 MATLAB的下標從1開始 在 MATLAB 中 θ0我們可能會用 theta(1) 來表示這第二個元素最后就會變成theta(2) 而第三個元素最終可能就用theta(3) 表示 因為MATLAB 中的下標從1開始即使我們實際的θ 和 x 的下標從0開始這就是為什么這里我的 for 循環(huán)j 取值從 1 直到 n+1而不是從 0 到 n 清楚了嗎?但這是一個未向量化的代碼實現(xiàn)方式我們用一個 for 循環(huán)對 n 個元素進行加和作為比較 接下來是向量化的代碼實現(xiàn)你把x 和 θ看做向量 而你只需要令變量 prediction 等于 theta轉(zhuǎn)置乘以 x 你就可以這樣計算與其寫所有這些for 循環(huán)的代碼你只需要一行代碼這行代碼右邊所做的就是利用 Octave 的高度優(yōu)化的數(shù)值線性代數(shù)算法來計算兩個向量的內(nèi)積θ 以及 x這樣向量化的實現(xiàn)不僅僅是更簡單它運行起來也將更加高效

4:15

這就是 Octave 所做的而向量化的方法在其他編程語言中同樣可以實現(xiàn)讓我們來看一個 C++ 的例子這就是未向量化的代碼實現(xiàn)的樣子我們再次初始化變量 prediction 為 0.0然后我們現(xiàn)在有一個完整的從 j 等于 0 直到 n變量 prediction +=theta 乘以 x再一次 你有這樣的自己寫的 for 循環(huán)與此相反 使用一個比較好的C++ 數(shù)值線性代數(shù)庫你就可以用這個方程來寫這個函數(shù)與此相反 使用較好的C++ 數(shù)值線性代數(shù)庫你可以寫出像這樣的代碼因此取決于你的數(shù)值線性代數(shù)庫的內(nèi)容你可以有一個對象 (object)像這個C++ 對象theta 和一個 C++對象 向量 x你只需要用 theta.transpose ( )乘以 x而這次是讓 C++ 來實現(xiàn)運算因此你只需要在 C++ 中將兩個向量相乘根據(jù)你所使用的數(shù)值和線性代數(shù)庫的使用細節(jié)的不同你最終使用的代碼表達方式可能會有些許不同但是通過一個庫來做內(nèi)積你可以得到一段更簡單更有效的代碼現(xiàn)在 讓我們來看一個更為復(fù)雜的例子提醒一下這是線性回歸算法梯度下降的更新規(guī)則所以我們用這條規(guī)則對 j 等于 0 1 2 等等的所有值更新 對象 θj我只是用 θ0 θ1 θ2來寫方程那就是假設(shè)我們有兩個特征量所以 n等于2這些都是我們需要對θ0 θ1 θ2 進行更新你可能還記得在以前的視頻中說過這些都應(yīng)該是同步更新因此 讓我們來看看我們是否可以拿出一個向量化的代碼實現(xiàn)這里是和之前相同的三個方程只不過寫得小一點而已你可以想象實現(xiàn)這三個方程的方式之一就是用一個 for 循環(huán)就是讓 j 等于0等于 等于2來更新 θj但讓我們用向量化的方式來實現(xiàn) 看看我們是否能夠有一個更簡單的方法基本上用三行代碼或者一個 for 循環(huán)一次實現(xiàn)這三個方程讓我們來看看怎樣能用這三步并將它們壓縮成一行向量化的代碼來實現(xiàn)做法如下我打算把 θ 看做一個向量然后我用θ 減去α 乘以 某個別的向量δ 來更新 θ這里的 δ 等于m 分之 1對 i=1 到 m進行求和然后這個表達式對吧?讓我解釋一下是怎么回事在這里 我要把θ 看作一個向量有一個 n+1 維向量我是說 θ 被更新我們的 n+1 維向量α 是一個實數(shù)δ 在這里是一個向量所以這個減法運算是一個向量減法沒問題吧 ?因為 α 乘以 δ是一個向量 所以θ 就是θ 減去 α 乘以 δ 得到的向量那么什么是向量 δ 呢 ?嗯 向量 δ 是這樣子的這部分實際上代表的就是這部分內(nèi)容具體地說 δ 將成為n+1 維向量并且向量的第一個元素就等于這個所以我們的 δ如果要寫下標的話就是從零開始 δ0 δ1 δ2我想要的是δ0 等于這個第一行綠色框起來的部分事實上 你可能會寫出 δ0 是m 分之 1乘以 h(x(i))減去 y(i)乘以 x(i)0 的求和所以讓我們在同一頁上計算真正的 δδ 就是 m 分之 1乘以這個和那這個和是什么 ?嗯 這一項是一個實數(shù)這里的第二個項 是 x(i)這一項是一個向量對吧 ? 因為 x(i)可能是一個向量這將是x(i)0 x(i)1 x(i)2 對吧 ?那這個求和是什么 ?嗯 這個求和就是這里的式子這里的這一項等于 h(x(1)) - y(1) 乘以 x(1)加上h(x(2)) - y(2) 乘以 x(2)依此類推對吧 ?因為這是對 i 的加和所以當 i 從 1 到 m你就會得到這些不同的式子 然后作加和每個式子的意思很像如果你還記得實際上在以前的一個小測驗 如果你要解這個方程我們說過為了向量化這段代碼我們會令 u = 2v +5w 因此我們說 向量u等于2乘以向量v加上 5乘以向量 w用這個例子說明如何對不同的向量進行相加這里的求和是同樣的道理這一部分只是一個實數(shù)就有點像數(shù)字 2而這里是別的一些數(shù)字來乘以向量x1這就像是 2v只不過用別的數(shù)字乘以 x1然后加上 你知道不是5w 而是用別的實數(shù)乘以一個別的向量 然后你加上其他的向量這就是為什么總體而言在這里 這整個量δ 就是一個向量具體而言對應(yīng)這三個 δ 的元素如果n等于2δ 的三個元素一一對應(yīng)這個第二個 以及這第三個式子 這就是為什么當您更新 θ 值時 根據(jù)θ - αδ 這個式子我們最終能得到完全符合最上方更新規(guī)則的同步更新我知道幻燈片上的內(nèi)容很多但是再次重申請隨時暫停視頻我也鼓勵你一步步對比這兩者的差異如果你不清楚剛才的內(nèi)容我希望你能一步一步讀幻燈片的內(nèi)容以確保你理解為什么這個式子用 δ 的這個定理定義的 好嗎 ?以及它為什么和最上面的更新方式是等價的為什么是這樣子的就是這里的式子這就是向量 x而我們只是用了你知道這三個計算式并且壓縮成一個步驟用這個向量 δ這就是為什么我們能夠向量化地實現(xiàn)線性回歸所以 我希望步驟是有邏輯的請務(wù)必看視頻 并且保證你確實能理解它如果你實在不能理解它們數(shù)學上等價的原因你就直接實現(xiàn)這個算法也是能得到正確答案的所以即使你沒有完全理解為何是等價的 如果只是實現(xiàn)這種算法你仍然能實現(xiàn)線性回歸算法所以如果你能弄清楚為什么這兩個步驟是等價的那我希望你可以對向量化有一個更好的理解以及 最后如果你在實現(xiàn)線性回歸的時候使用一個或兩個以上的特征量有時我們使用幾十或幾百個特征量來計算線性歸回當你使用向量化地實現(xiàn)線性回歸通常運行速度就會比你以前用你的 for 循環(huán)快的多也就是自己寫代碼更新 θ0 θ1 θ2因此使用向量化實現(xiàn)方式你應(yīng)該是能夠得到一個高效得多的線性回歸算法而當你向量化我們將在之后的課程里面學到的算法這會是一個很好的技巧無論是對于 Octave 或者一些其他的語言 如C++Java 來讓你的代碼運行得更高效

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末送悔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖分井,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異霉猛,居然都是意外死亡尺锚,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門惜浅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瘫辩,“玉大人,你說我怎么就攤上這事坛悉》パ幔” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵裸影,是天一觀的道長挣轨。 經(jīng)常有香客問我,道長轩猩,這世上最難降的妖魔是什么卷扮? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮均践,結(jié)果婚禮上晤锹,老公的妹妹穿的比我還像新娘。我一直安慰自己彤委,他們只是感情好抖甘,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著葫慎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪薇宠。 梳的紋絲不亂的頭發(fā)上偷办,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音澄港,去河邊找鬼椒涯。 笑死,一個胖子當著我的面吹牛回梧,可吹牛的內(nèi)容都是我干的废岂。 我是一名探鬼主播祖搓,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼湖苞!你這毒婦竟也來了拯欧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤财骨,失蹤者是張志新(化名)和其女友劉穎镐作,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體隆箩,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡该贾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了捌臊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杨蛋。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖理澎,靈堂內(nèi)的尸體忽然破棺而出逞力,到底是詐尸還是另有隱情,我是刑警寧澤矾端,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布掏击,位于F島的核電站,受9級特大地震影響秩铆,放射性物質(zhì)發(fā)生泄漏砚亭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一殴玛、第九天 我趴在偏房一處隱蔽的房頂上張望捅膘。 院中可真熱鬧,春花似錦滚粟、人聲如沸寻仗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽署尤。三九已至,卻和暖如春亚侠,著一層夾襖步出監(jiān)牢的瞬間曹体,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工硝烂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留箕别,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像串稀,于是被迫代替她去往敵國和親除抛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容