機器學習學習筆記一

本筆記是根據吳恩達教授開設的 Maching Learning 的公開課學習記錄。

1、矩陣和向量

矩陣和向量(Matrices and Vectors)是如何計算的?html


clipboard.pngpython


clipboard.pnggit


clipboard.pnggithub

2、矩陣矩陣相乘

矩陣矩陣相乘(Matrix-matrix multiplication)
矩陣與矩陣的乘法運算算法

clipboard.png

矩陣計算公式:編程

clipboard.png

矩陣相乘,兩個矩陣只有當左邊的矩陣的行數等於右邊矩陣的列數時,兩個矩陣才能夠進行矩陣的乘法運算。windows

示例,能夠將另外一個矩陣拆爲向量運算:xcode

clipboard.png

將實際問題轉爲矩陣計算處理:ruby

clipboard.png

3、矩陣運算特性

矩陣運算示例(Matrix multiplication properties)框架

A X B ≠ B X A

clipboard.png

4、矩陣的逆運算和轉置

逆運算和轉置(inverse and transpose)

5、線性迴歸

線性迴歸與多變量(Linear Regression with multiple variables)

Multiple features

多變量特徵(Multiple features)

clipboard.png

clipboard.png

Gradient Descent

梯度降低 Gradient Descent

6、Octave 學習

簡介

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安裝Octave

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安裝

輸入如下命令安裝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界面式啓動:

octave

啓動後可進入如下可視化界面:

clipboard.png

示例以下:

>> 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));

clipboard.png

控制語句

控制語句 for,while,if語句

向量 的值就是這樣一個集合 2的一次方、2的二次方,依此類推。這就是個人 等於 1 到 10的語句結構,讓 遍歷 1 到 10的值。

clipboard.png

另外,你還能夠經過設置你的 indices (索引) 等於 1一直到10,來作到這一點。這時indices 就是一個從1到10的序列。

你也能夠寫 i = indices,這實際上和我直接把 i 寫到 1 到 10 是同樣。你能夠寫 disp(i),也能獲得同樣的結果。因此 這就是一個 「for」 循環。

clipboard.png

若是你對 「break」 和 「continue」 語句比較熟悉,Octave裏也有 「break」 和 「continue」語句,你也能夠在 Octave環境裏使用那些循環語句。

向量化

向量化(Vectorization)
我將介紹有關向量化的內容,不管你是用Octave,仍是別的語言,好比MATLAB或者你正在用Python、NumPy 或 Java C C++,全部這些語言都具備各類線性代數庫,這些庫文件都是內置的,容易閱讀和獲取,他們一般寫得很好,已經通過高度優化,一般是數值計算方面的博士或者專業人士開發的。

而當你實現機器學習算法時,若是你能好好利用這些線性代數庫,或者數值線性代數庫,並聯合調用它們,而不是本身去作那些函數庫能夠作的事情。若是是這樣的話,那麼一般你會發現:首先,這樣更有效,也就是說運行速度更快,而且更好地利用你的計算機裏可能有的一些並行硬件系統等等;其次,這也意味着你能夠用更少的代碼來實現你須要的功能。所以,實現的方式更簡單,代碼出現問題的有可能性也就越小。

舉個具體的例子:與其本身寫代碼作矩陣乘法。若是你只在Octave中輸入乘以就是一個很是有效的兩個矩陣相乘的程序。有不少例子能夠說明,若是你用合適的向量化方法來實現,你就會有一個簡單得多,也有效得多的代碼。

讓咱們來看一些例子:這是一個常見的線性迴歸假設函數:clipboard.png

若是你想要計算 ,注意到右邊是求和,那麼你能夠本身計算 到 的和。但換另外一種方式來想一想,把 看做,那麼你就能夠寫成兩個向量的內積,其中就是、、,若是你有兩個特徵量,若是 ,而且若是你把 看做、、,這兩種思考角度,會給你兩種不一樣的實現方式。

邏輯迴歸(Logistic Regression)

若是咱們要用線性迴歸算法來解決一個分類問題,對於分類, 取值爲 0 或者1,但若是你使用的是線性迴歸,那麼假設函數的輸出值可能遠大於 1,或者遠小於0,即便全部訓練樣本的標籤 都等於 0 或 1。儘管咱們知道標籤應該取值0 或者1,可是若是算法獲得的值遠大於1或者遠小於0的話,就會感受很奇怪。因此咱們在接下來的要研究的算法就叫作邏輯迴歸算法,這個算法的性質是:它的輸出值永遠在0到 1 之間

順便說一下,邏輯迴歸算法是分類算法,咱們將它做爲分類算法使用。有時候可能由於這個算法的名字中出現了「迴歸」使你感到困惑,但邏輯迴歸算法其實是一種分類算法,它適用於標籤 取值離散的狀況,如:1 0 0 1。

根據線性迴歸模型咱們只能預測連續的值,然而對於分類問題,咱們須要輸出0或1,咱們能夠預測:

clipboard.png


參考文章 Octave教程(Octave Tutorial)

相關文章
相關標籤/搜索