本筆記是根據吳恩達教授開設的 Maching Learning 的公開課學習記錄。
矩陣和向量(Matrices and Vectors)是如何計算的?html
python
git
github
矩陣矩陣相乘(Matrix-matrix multiplication)
矩陣與矩陣的乘法運算算法
矩陣計算公式:編程
矩陣相乘,兩個矩陣只有當左邊的矩陣的行數等於右邊矩陣的列數時,兩個矩陣才能夠進行矩陣的乘法運算。
windows
示例,能夠將另外一個矩陣拆爲向量運算:xcode
將實際問題轉爲矩陣計算處理:ruby
矩陣運算示例(Matrix multiplication properties)框架
A X B ≠ B X A
逆運算和轉置(inverse and transpose)
線性迴歸與多變量(Linear Regression with multiple variables)
多變量特徵(Multiple features)
梯度降低 Gradient Descent
Octave是一種編程語言,旨在解決線性和非線性的數值計算問題。Octave爲GNU項目下的開源軟件,早期版本爲命令行交互方式,4.0.0版本發佈基於QT編寫的GUI交互界面。Octave語法與Matlab語法很是接近,能夠很容易的將matlab程序移植到Octave。同時與C++,QT等接口較Matlab更加方便。
Octave是一種很好的原始語言(prototyping language),使用Octave你能快速地實現你的算法,剩下的事情,你只須要進行大規模的資源配置,你只用再花時間用C++或Java這些語言把算法從新實現就好了。開發項目的時間是很寶貴的,機器學習的時間也是很寶貴的。因此,若是你能讓你的學習算法在Octave上快速的實現,基本的想法實現之後,再用C++或者Java去改寫,這樣你就能節省出大量的時間。
據我所見,人們使用最多的用於機器學習的原始語言是Octave、MATLAB、Python、NumPy 和R。
windows 安裝很簡單,只須要去官網下載安裝包解壓安裝便可,下面講下怎麼在Mac 上安裝。
Homebrew是一個包管理器,用於在Mac上安裝一些OS X沒有的UNIX工具(好比著名的wget)。它會將軟件包安裝到獨立目錄,並將其文件軟連接至 /usr/local 。徹底基於git 和 ruby,因此自由修改的同時你仍能夠輕鬆撤銷你的變動或與上游更新合併。
首先確認Mac已安裝Xcode、Command Line Tool。安裝Command Line Tool:
xcode-select --install
而後把下面的代碼粘貼到Terminal中執行安裝Homebrew。
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
Homebrew經常使用命令:
brew search/install/upgrade/info/deps/remove python3 brew list/outdated/update/
輸入如下命令安裝Octave:
brew tap homebrew/science brew update && brew upgrade brew install octave
安裝完成可看到提示該GUI展現所基於框架的設置,默認爲QT框架。
setenv('GNUTERM','qt') # Requires QT; install gnuplot --with-qt setenv('GNUTERM','x11') # Requires XQuartz; install gnuplot --with-x11 setenv('GNUTERM','wxt') # Requires wxmac; install gnuplot --with-wxmac setenv('GNUTERM','aqua') # Requires AquaTerm; install gnuplot --with-aquaterm
Octave無界面啓動及配置
輸入如下命令進行Octave無界面啓動:
octave --no-gui
octave:1> a = 3 a = 3 octave:2> 5 + 8 ans = 13 octave:3> A = [1 2; 3 4; 5 6] A = 1 2 3 4 5 6 octave:4>
默認使用plot命令就會出現warning,使用以下配置可解決當前octave的問題。
octave:1> graphics_toolkit ans = qt octave:2> x=linspace(-10,10); octave:3> plot(x,sin(x)); warning: opengl_renderer: Error 1286 occurred in init_gl_context warning: called from plot at line 223 column 10 octave:4> graphics_toolkit('gnuplot') octave:5> plot(x,sin(x));
若要徹底解決以上的plot命令warning問題,可在配置文件
/usr/local/share/octave/site/m/startup/octaverc 中添加如下代碼:
graphics_toolkit('gnuplot')
輸入如下命令進行Octave界面式啓動:
octave
啓動後可進入如下可視化界面:
示例以下:
>> a = magic(2) a = 4 3 1 2 >> a(1,:) = 0 a = 0 0 1 2
繪圖數據(Plotting Data)
當開發學習算法時,每每幾個簡單的圖,可讓你更好地理解算法的內容,而且能夠完整地檢查下算法是否正常運行,是否達到了算法的目的。
例如在以前的視頻中,我談到了繪製成本函數,能夠幫助確認梯度降低算法是否收斂。一般狀況下,繪製數據或學習算法全部輸出,也會啓發你如何改進你的學習算法。幸運的是,Octave有很是簡單的工具用來生成大量不一樣的圖。當我用學習算法時,我發現繪製數據、繪製學習算法等,每每是我得到想法來改進算法的重要部分。在這段視頻中,我想告訴你一些Octave的工具來繪製和可視化你的數據。
>> x=linspace(-10,10); >> plot(x,sin(x));
控制語句 for,while,if語句
向量 的值就是這樣一個集合 2的一次方、2的二次方,依此類推。這就是個人 等於 1 到 10的語句結構,讓 遍歷 1 到 10的值。
另外,你還能夠經過設置你的 indices (索引) 等於 1一直到10,來作到這一點。這時indices 就是一個從1到10的序列。
你也能夠寫 i = indices,這實際上和我直接把 i 寫到 1 到 10 是同樣。你能夠寫 disp(i),也能獲得同樣的結果。因此 這就是一個 「for」 循環。
若是你對 「break」 和 「continue」 語句比較熟悉,Octave裏也有 「break」 和 「continue」語句,你也能夠在 Octave環境裏使用那些循環語句。
向量化(Vectorization)
我將介紹有關向量化的內容,不管你是用Octave,仍是別的語言,好比MATLAB或者你正在用Python、NumPy 或 Java C C++,全部這些語言都具備各類線性代數庫,這些庫文件都是內置的,容易閱讀和獲取,他們一般寫得很好,已經通過高度優化,一般是數值計算方面的博士或者專業人士開發的。
而當你實現機器學習算法時,若是你能好好利用這些線性代數庫,或者數值線性代數庫,並聯合調用它們,而不是本身去作那些函數庫能夠作的事情。若是是這樣的話,那麼一般你會發現:首先,這樣更有效,也就是說運行速度更快,而且更好地利用你的計算機裏可能有的一些並行硬件系統等等;其次,這也意味着你能夠用更少的代碼來實現你須要的功能。所以,實現的方式更簡單,代碼出現問題的有可能性也就越小。
舉個具體的例子:與其本身寫代碼作矩陣乘法。若是你只在Octave中輸入乘以就是一個很是有效的兩個矩陣相乘的程序。有不少例子能夠說明,若是你用合適的向量化方法來實現,你就會有一個簡單得多,也有效得多的代碼。
讓咱們來看一些例子:這是一個常見的線性迴歸假設函數:
若是你想要計算 ,注意到右邊是求和,那麼你能夠本身計算 到 的和。但換另外一種方式來想一想,把 看做,那麼你就能夠寫成兩個向量的內積,其中就是、、,若是你有兩個特徵量,若是 ,而且若是你把 看做、、,這兩種思考角度,會給你兩種不一樣的實現方式。
若是咱們要用線性迴歸算法來解決一個分類問題,對於分類, 取值爲 0 或者1,但若是你使用的是線性迴歸,那麼假設函數的輸出值可能遠大於 1,或者遠小於0,即便全部訓練樣本的標籤 都等於 0 或 1。儘管咱們知道標籤應該取值0 或者1,可是若是算法獲得的值遠大於1或者遠小於0的話,就會感受很奇怪。因此咱們在接下來的要研究的算法就叫作邏輯迴歸算法
,這個算法的性質是:它的輸出值永遠在0到 1 之間
。
順便說一下,邏輯迴歸算法是分類算法,咱們將它做爲分類算法使用。有時候可能由於這個算法的名字中出現了「迴歸」使你感到困惑,但邏輯迴歸算法其實是一種分類算法,它適用於標籤 取值離散的狀況,如:1 0 0 1。
根據線性迴歸模型咱們只能預測連續的值,然而對於分類問題,咱們須要輸出0或1,咱們能夠預測: