機務?演算法工程師!轉職筆記(五)

小機務要做演算法工程師!第五個月了!距離目標越來越近,興奮中夾雜著不安,加油!

2017年的10月,因為很多的事情的發生變得特別與眾不同,依舊很忙,這個月前後開始的學習節奏並不太好,但是發文前終於糾正回來了。本次學習分享依然分為機器學習,數據結構和演算法,編程語言三方面,大家準備好了么?開始啦!

機器學習方面

《機器學習基石》第9章的一二小節的內容,總共的視頻時長大概為30分鐘。我共用了大概3倍的視頻時長,約1.5小時來進行學習加複習,其實後面的三四節我也已經看了,但是掌握的不是很清楚,所以就等弄清楚了下個月再寫,這一章總體難度不如之前的5.6.7章,但是因為一些數學基礎知識的遺忘,導致可能要稍微補一下向量運算,求導數等基礎知識才好。

一.我學了那些資料

1.林軒田老師的《機器學習基石》課程9章一二小節的視頻。

  • 第一節Liner Regression Problem,主要由發信用卡的二分類問題引伸下去,提出信用卡額度發多少的回歸問題。首先輸入依然是客戶的個人特徵向量,輸出是實數空間,給出了線性假設函數: h(x)=w^{T}x 。然後利用了傳統的統計學給出的error measures: err(	ilde{y},y)=(	ilde{y}-y)^{2} ,以及具體的 E_{in}(w)=frac{1}{N}sum_{1}^{N}{(h(x_{n})-y_{n})^{2}} ,其中 h(x_{n})=w^{T}x_{n} ,和 E_{out}(w)=varepsilon_{(x,y)-p}(w^{T}x-y)^{2} ,我們接下來要做的就是如何最小化 E_{in}(w) ,由於VC維的限制,我們即可以得到最小的 E_{out}(w) ,也就求出了假設函數的參數 w
  • 第二節Liner Regression Algorithm,通過解析的方式給出如何由數據X,Y求得假設函數參數 w ,其實就是求最小的 E_{in}(w) 的問題。
    • 先看 E_{in}(w)=frac{1}{N}sum_{1}^{N}{(w^{T}x_{n}-y_{n})^{2}}=frac{1}{N}sum_{1}^{N}{(x_{n}^{T}w-y_{n})^{2}} 的表達式,為了方便運算,對其進行了變換,寫成了向量的模長的平方的形式 E_{in}(w)=frac{1}{N}left| Xw-y
ight|^{2} ,其中 Xx_{1}^{T}、x_{1}^{T}、。。。x_{n}^{T} 組成的矩陣,是已知的。如何求解 min_{w}E_{in}(w)=frac{1}{N}left| Xw-y
ight|^{2} 呢?由於 E_{in}(w) 是一個連續,可微分的凸函數,當其梯度為零時,此時得到的 w_{LIN} 使 E_{in}(w) 最小,以向量為自變數的函數的梯度怎麼求?林老師在此給出類比當 w 為一維時的結果,得到當 w 為多維時的求梯度結果: grad E_{in}(w)=frac{2}{N}(X^{T}Xw-X^{T}y) ,由於 N,X,y 都可以由訓練數據給出,所以就可以通過解這個一元方程: frac{2}{N}(X^{T}Xw-X^{T}y)=0 ,得到 w_{LIN} ,它的解分為兩種情況,當 X^{T}X 存在反矩陣時, w_{LIN}=(X^{T}X)^{-1}X^{T}y 在這裡 (X^{T}X)^{-1}X^{T} 通常被稱為偽逆矩陣 X^{+} (psuedo-inverse),當 X^{T}X 不是可逆矩陣時會有其他方式給出X^{+} (psuedo-inverse),例如某些數值分析軟體或者平台可能會直接給出。
    • 那我們現在就可以總結下線性回歸演算法是如何求解的:首先通過已知的數據集,構建輸入矩陣 X 與輸出向量 y ,求解為逆矩陣 X^{+} ,帶入 w_{LIN}=X^{+}y ,求得假設函數參數 w_{LIN}

二.學霸指點:難點/重點分析和面試高頻問題

  • 對於初學者來說,一些數學基礎知識,符號可能初次接觸會比較頭疼,靜下心來慢慢補一下還是非常重要的。
  • 線性回歸是機器學習入門的基礎模型之一,也是非常容易被問到的,能夠在紙上熟練推導這個模型是成為演算法工程師的必備技能,敲黑板了!

三.我遇到的問題及解決辦法

  • 先補一波數學基礎知識,這一章的內容就用到了向量和矩陣的運算等等,詳情參考高等數學和線性代數。
    • 向量的運算:本章涉及加減和求模長,內積的運算。
    • 矩陣的運算:涉及轉置,求解反矩陣。
    • 導數,梯度:高數下冊涉及到了多元函數的各種導數和梯度,先把這些弄清楚,有助於理解這裡的對含有向量參數的函數的梯度。
  • 我想提醒一點的是自己獨自學習的時候可能有些問題不能馬上解決,建議嘗試過各種方法後可以先放一放,隔天再看一遍,也許會有新的發現。其實第九章的內容上個月我自己涉獵過一些,但是當時到第二節對模型參數進行解析推導時,到矩陣那一系列的變換,我突然感覺好繁瑣啊,線性代數都忘了,乾脆就沒繼續進行下去。這個月學習內容不得不繼續推進了,自己硬著頭皮又繼續看了一二節,發現並沒有之前感覺的那麼難,只要把基本的向量運算,轉置啥的複習下也沒啥難的,上個月還是太著急了,而且根本沒有抓住自己到底哪裡聽不明白,也沒有針對性的去掃除障礙,希望以後注意,共勉。

編程語言

這個月在編程語言方面我主要做了兩方面的工作,第一就是繼續看了「畢向東Java基礎視頻(35天版本)」的JavaSE01.02.06.07部分(對應課件章節是第1,2,3章的部分內容),一定要找到文字課件,課件的章節邏輯很清晰,方便複習。並沒有統計時間,但是因為這個老師說話比較慢哈,很多地方用1.3倍速看也不覺得吃力,部分內容做了簡單的筆記。第二就是我重新找了一個IntelliJ IDEA的官方使用教程,內容非常仔細,原諒我少的可憐的編程和IDE使用經驗,為了不讓工具稱為項目阻力,所以我這個月比較全面的瀏覽了一遍IntelliJ IDEA的HELP。

一.我學了哪些資料

1.「畢向東Java基礎視頻(35天版本)」第1,2,3章節的部分內容。

  • 第1章,Java概述。
    • DOS命令行的基礎語句,一起回憶一下:直接打出路徑,進入某一盤符;cd cd.. cd等等改變當前目錄命令;md rd del 刪除目錄與文件相關的命令;大招help!
    • JavaEE,JavaSE,JavaME各自應用方向。Java跨平台特性的理解(由於JVM的存在,但是JVM可不是跨平台的哈)。
    • Java語言的環境搭建,path的設置:全局環境變數,無論在哪個文件目錄下執行某一程序,都要先去path路徑下去尋找;JAVA_HOME技巧:就是個變數取代哈;環境變數的臨時配置set path:臨時生效,關閉當前設置的命令窗口即失效;classpath的使用:在當前文件夾下運行其他文件下的.class文件,注意設置路徑時時,有分號「;」與無分號「;」的區別。
    • 最後老師還以Hello World的例子講了很多Debug經驗,此處不一一贅述,但是希望大家注意下。
  • 第2章,Java語言基礎,有些地方和C語言一樣,我就簡寫了。
    • 關鍵字:用於描述訪問許可權;定義類,函數,變數修飾等等,全部是小寫,不建議背,用到那個學哪個就好。
    • 標識符:就是自己起的各種名字嘛,不過命名規則要記好:可使用26個大小寫字母,_和$.不能數字開頭。相應命名規則如下:
      • 類名介面名首字母要大寫:XxxYyyZzz
      • 包名:xxxyyyzzz
      • 變數名函數名xxxYyyZzz
      • 常量名XXX_YYY_ZZZ
    • 注釋:三種注釋方式,除了有兩種和C語言一樣,還有一種文檔注釋;學會用注釋去Debug。
    • 常量與變數。
      • 基本常量與C語言類似,數制轉換一樣,負數也是補碼錶示(對應的正數二進位取反加1或者 2^{n} 減對應的正數二進位)。常量注意多了三種類型:class,interface,[](數組);
      • 變數未完待續。
  • 第3章,面向對象。
    • 面向對象概念:將功能進行封裝,強調具備功能的對象,不再是強調步驟。
    • 類與對象的關係:這兩個概念及其關係在上一篇文章里做了基本的解釋,更多得還是需要大家去在程序中去理解。在這一章的視頻中講了很多乾貨,大家要好好理解。
      • 成員變數與局部變數的區別:成員變數隨著對象建立而建立,存在於對象的堆內存中;局部變數只定義在局部範圍內,例如語句塊內,存在於棧內存中。作用範圍結束會自動釋放。與之相關的基本數據類型參數傳遞圖解和引用數據類型參數傳遞圖解都要熟悉。
    • 封裝:是指隱藏對象的屬性和實現細節,僅對外提供公共訪問方式。
      • privite關鍵字,修飾成員,修飾後的成員只在本類中有效。
      • 將成員私有化之後,要寫提供對外數據訪問的的set和get方法。
    • 構造函數,這個概念在最早看菜鳥教程的時候看得我相當懵逼,直到看了畢老師的視頻才漸漸清晰。主要作用就是創建對象時使用的,是有默認構造函數的,可以以重載的方式出現多個構造函數。
      • 提一句重載和重寫,重載(overloading) 是在一個類裡面,方法名字相同,而參數不同,返回類型可以相同也可以不同;重寫(override)的返回值和形參都不能改變的,核心內容改變。

2.項目應用軟體部分。

關於IntelliJ IDEA的使用教程網上有很多人寫了很多,不同版本的,不同系統的,參差不齊,但是對於我這種基本沒什麼編程經驗的人來說,覺得寫的還是不夠簡單全面,所以我乾脆找了它的官方HELP來看IntelliJ IDEA 2017.2 HELP,官方HELP內容很多而且仔細,雖然很多都沒看明白,但是心裡有個大概印象,以後出現什麼問題,大概有個方向,我梳理了一個路線,希望小白根據這個路線能夠比較快速地入門,補一句,官方是全英文,英語實在不行就Chrome翻譯網頁吧,這樣看得速度快一點,對,我就是那種英語不太行的,畢竟現在大家都說,實際應用中,英語六級算逑英語水平。

  • Meet IntelliJ IDEA部分就從安裝設置開始看,其中Discover IntelliJ IDEA部分包括運行和調試之前的內容建議都看了。第一部分的其他可以不看。這樣基本的安裝,用戶界面,編輯窗口啥的有個概念,這些更具體的內容會直接鏈接到General Guidelines部分。
  • General Guidelines部分,瀏覽用戶界面,IntelliJ IDEA編輯器,工具窗口,創建和管理項目,編譯應用程序,使用運行/調試配置,運行,調試,測試部分找那些有關Java,新建項目運行,調試等等基本操作相關的看,像那些鏈接了很多其他框架或者工具之類的可以跳過。

二.學霸指點:難點/重點分析和面試高頻問題

  • 這部分課程中的最核心最重點的內容是面向對象部分。在面試中,面試官經常會就面向對象問題與被面試者進行討論,來了解被面試者的開發能力強弱。

三.我遇到的問題及解決辦法

  • 這次的視頻有一些我是利用工作間隙或者上下班時零散時間用手機看的,所以這些視頻也沒有實際敲代碼,其他是在電腦上看的,隨著視頻敲了代碼,但是當寫這篇日誌的時候,我就發現,當初沒敲代碼的那些果真記得不是很牢固,所以說建議第一遍看得時候在電腦上敲敲代碼,複習的時候再用零散的時間看。
  • 推薦個視頻變速播放軟體:VLC。在windows,安卓,ios端都有,之前用KM player,但是有一些視頻格式 KMPLAYER不支持變速播放,這個VLC就非常好用,各種變速無壓力。

數據結構和演算法

由於最近做的東西涉及數據結構的的東西比較少,所以進度比較緩慢,正好又在學習Java,學霸給我從「畢向東Java基礎視頻(35天版本)」裡面提出了兩個經典的演算法題目:選擇排序和冒泡排序。

一.我學了哪些資料

1.「畢向東Java基礎視頻(35天版本)」第2章有關數組部分。

  • 選擇排序(假設由小到大)
    • 核心思路就是兩個循環嵌套,外層循環是從頭開始遍曆數組的每一個元素(除最後一個外),內層循環是讓外層循環遍歷到的當前元素與之後面的每個元素依次做比較,如果比後面的元素大就交換兩個元素的位置,這樣每一次內層循環完就能保證當前元素是它及它後面的元素中的最小值。這樣經過兩層循環遍歷比較之後,就能保證數組由小到大排序。
  • 冒泡排序(假設從小到大)
    • 同樣是兩個嵌套循環,外層循環是從頭開始遍曆數組每一個元素,內層循環總是從數組開頭開始到arr.length-1-x(x是外層循環位置)結束,每次內層循環都從數組開頭元素開始,相鄰相比較,把大的數字換到後面直到條件結束,這樣每一次循環都能保證本次循環最大的數字排到了末尾,直到外層循環條件結束整個數組就從小到大排序完成。

二.學霸指點:難點分析和面試高頻問題

  • 能熟練說出每種排序的排序過程,複雜度,穩定性,並能在紙上快速寫出排序代碼,是一個合格程序員的必修課,這部分至關重要,至關重要,至關重要。

三.我遇到的問題及解決辦法

  • 我覺得這兩個演算法是我們學習這麼多天以來最簡單的兩個演算法了,因為排序演算法還有其他幾種,後面學習也會涉及到一些,學霸給推薦了一個關於排序演算法學習的小網站,裡面都有很形象的講解:排序。

Share學習經驗---他山之石,可以攻玉

怎麼樣才能有比較穩定的學習節奏呢?明確問題,按重要性程度梳理任務,然後每部分任務大概要完成到什麼程度,分配多少精力要拿捏好。

日誌開頭也說了哈,有一段時間學習節奏不太好,我自己推進很困難,感覺學習的內容多,難度也大,有的費了很大精力效果也不太好,特別是看IntelliJ IDEA HELP時,很多根本看不懂是在做什麼,將近5個月了,感覺很多學習內容的進度不如預期,一天就那麼點時間,不夠用,有幾天索性就放飛自我了,煩躁的把《白夜追兇》刷完了。後來和學霸談了談,問他為啥很多時候寫代碼,搞問題,弄得又快又好,學霸說他本科、研究生期間都是在搞這些,都七八年了,然給我說別著急,慢慢來。他自己上班也是很多事情,早上去了就把事情排一排,然後開工,還建議不應該在IntelliJ IDEA上浪費那麼多時間,基本操作會了就好,他自己也沒有全部看完,很多東西不是能一下掌握的。我自己也分析了一下,把最近的任務按照輕重緩急和想要大概完成的程度排序了一下,感覺清晰多了,很多問題不能一下搞定挫敗感也沒有那麼嚴重了,節奏也逐漸穩定了。希望大家在學習心態和經驗上能多交流下,共同學習進步哈。

這個月其實有關DOS命令的學習是我感覺最新鮮的部分哈,之前很少用DOS命令行方式,使用它總感覺有一種神秘感:面對黑黑的DOS操作界面,敲出一行行代碼,然後啪的一敲回車,獲得它的回應,頗像地球的文明人類,面對浩瀚幽深的宇宙發出各種無線電波,期待星空的深處有其他文明回應的感覺,md有點酷。馬上就是12月了,按照deadline是第一生產力的規律,最近效率應該高一點哈。帝都冬天真冷,各位保重,12月見!!!


推薦閱讀:

新手學機器學習一個月後,一些第一手乾貨分享
李宏毅機器學習2016 第十五講 無監督學習 生成模型之 VAE
從Nesterov的角度看:我們為什麼要研究凸優化?
想學習「機器學習」,需要學習哪些先導課程?
目標檢測(5)-Faster RCNN

TAG:算法工程师 | 转行 | 机器学习 |