Archive for 二月, 2017


第一次練習用 Python 寫 logistic regression。

Logistic regression 雖然已經有很多寫好的 package 可以用,不過我還是嘗試自己寫了一下,

讓自己熟悉 logistic regression 到底做了什麼,還有各個參數的特性。

 

Logistic regression 顧名思義就是用 logistic function:

h(z) = 1/(1 + exp(-z)).

為 fitting function 來 fit data 或說是做分類,logistic function 本人長這樣:

logistic-function

它的特性是,連續的從 0 到 1 遞增,當輸入 z < 0 時輸出 h < 0.5,當輸入 z > 0 時輸出 h > 0.5。

所以當你的 data 分布是大約以 z = 0 為分界,以上為 True (1),以下為 False (0),就可以用 logistic function fit 或分類出來。

如果分界點不剛好在 z = 0,或是 T 和 F 的區域相反,可以藉由不同的 fitting function 像是 z(x) = t_0 + t_1*x 輸入到 h(z) 來達到。

依此類推,你也可以 fit 更高維的 data,然後考慮 z(x1, x2, x3, …) = t_0 + t_1*x1 + t_2*x2 + t_3*x3 …。

或是更高次方的 fitting function,像是 z = t_0 + t_1*x + t_11*x^2 + t_111*x^3 …,等。

 

下圖的 2 維 data  點是由室友提供,藍點代表 1 (True),黃點代表 0 (False)。

可以看出來點的分布像是個歪斜的橢圓形,所以我使用一個 2 次的 function 來 fit 它:

z(x,y) = t_0 + t_1*x + t_2*y + t_11*x^2 + t_22*y^2 + t_12*x*y.

在給定 t_0 … t_12 後, 對於每一個 data 點代入 z (x, y) 再代入 logistic function, h(z), 並以 h(z) = 0.5 為分界

就可以預測每一點 (x,y) 大約是 T 或是 F

a-result

圖中紅色曲線代表 h(z) = 0.5 的曲線,就是這個 model 分類 T 和 F 的界線。

 

當然,真正 regression 的部分在於找到 model 的參數 t_0, t_1, …, t_12,讓 model 最符合 data。

對於一組參數 t_0, t_1, …, t_12,可以計算出 model 的 prediction ( h(z(x,y)) )與 實際 data 的誤差,

每一組 data 都可以算出誤差,這些誤差之合稱為 cost function (就像是高中學過的 X^2 一樣)。

Regression 的目的就是找到一組參數 t_0, t_1, …, t_12 使得 cost function 最低。

也就是說 regression 就是一個找最小值的問題。

 

要找到一個 function 的最小值,最簡單的般法就是 gradient descent。

先計算 cost function 在該點的梯度,然後讓參數 t_0, t_1, …, t_12, 往 cost function 減少最快的方向前進一段距離。

再重新計算梯度,再前進。

重複夠多次之後,就會逼近最小值,找到 model 的參數。

 

上圖為 gradient descent 前進 1000 次的結果,

可以看的出來,還不是 fit 得很好,因為我使用的方法相當簡單,每次前進的步伐是固定的

較為進階的演算法,會每一步調整最佳的前近距離,收斂的就會更快更有效率。

 

總之,logistic regression 是個相當有趣的 python 練習,另外也是做 data scientist 和 neural network 的第一步。

 

My code and data: http://github.com/louis925/Logistic-Regression-Oval

Coursera 上關於 Machine Learning 的線上開放課程 (由 Stanford University 教授上課): http://www.coursera.org/learn/machine-learning/home/welcome

SO(3) 是各種 3維旋轉 所構成的群,任何 3 維的旋轉都可以由兩樣東西表示:

1. 旋轉軸的方向 v (一個三維的單位向量)

2. 旋轉的角度 θ (介於 -π 和 π 之間)

 

要圖像化 SO(3) 的結構,我們可以想像一個半徑為 r = π 的三維實心球

球裡的每一點代表一種旋轉,該點的徑向向量就是旋轉軸 v

而點到球心的距離 r 就代表旋轉的角度 θ,其範圍可以從 r = -π 到 π

這是合理的,因為對某方向 v 旋轉 -θ 角,就跟對 –v 方向旋轉 θ 角是一樣的。

此外,因為旋轉 θ = π 和 -π 也是一樣的,所以這顆球的表面上的一點 (r = π) 和其相對的點 (antipodal, r = -π) 是一樣的。也就是說北半球的表面跟南半球的表面視為相同的,並且互相連通。

所以 SO(3) 可以看做是一顆實心球,但南北半球的表面互相連通。

 

就是因為這樣的連通,所以 SO(3) 不是 simply connected (單連通) 的。

簡單的說,一個 simply connected 的拓撲空間,其內部通過任意兩點的一條 closed loop (封閉路徑),必定可以連續的變形收縮到一個點。

像是 R^2 空間或是實心球體就是 simply connected 的。

而以甜甜圈為例,一條繞過中間洞口的封閉路徑,就無法連續變形到一個點,所以甜甜圈不是 simply connected 的。

 

SO(3) 雖然長得像實心球,但是它的南北半球表面互通。

如果考慮一條從南極出發,經過球心,再到達北極跟南極相連的封閉路徑,

這條路徑無法連續收縮到一點,所以 SO(3) 不是 simply connected。

 

此外,長得跟 SO(3) 很像的 SU(2),實際上是 simply connected 的。

 

References:
[1] https://zh.wikipedia.org/wiki/單連通
[2] Matthew D. Schwartz, “Quantum Field Theory and the Standard Model", Sec. 10.5.1.

雖然已經發了數篇 paper,但這還是人生中第一次自己 submit paper 到 journal 上

在 APS 的 Physical Review D (PRD) 系列發表是可以選擇免費或是付費的

如果選擇免費的話,paper 的版權會是出版社的。但讀者要看的時候,就必須要付錢才能看。

如果要讓你的 paper 免費給大家看 (open access) 的話,那你就要付錢,費用大概是 USD $1900 ,還蠻貴的。

我想一般人都是選擇免費發吧?

另外,投稿 PRD 的時候,會讓你選擇該 paper 的 keywords,

據我老闆說,期刊會根據這來挑 referee 的人選。所以建議選適合的領域的 keywords 比較好。

最後,PRD 還會要你直接建議幾個 referee,據說一般 editor 會從你建議的名單挑選一位,其他的幾位再由 editor 決定。

 

Numpy 是 Python 中處理數學相關的一個強大 package,要使用 Numpy 前請先安裝 Python

下面提供在 Windows 上已安裝好 Python 後,要加入 Numpy package 的方法

  1. 開啟命令提示字元
  2. 執行 python -m pip install -U pip setuptools
    (如果命令提示字元不認得 ‘python’,請先把 python 資料夾 C:\Python27 和 C:\Python27\Scripts 加入到 Windows 的 path 環境變數內)
    (舉的例子為 python 2.7 版)
    (如果 pip 無法更新,請試試看重新安裝新版的 Python 2.7 或 3.6)
  3. 執行 python -m pip install wheel
  4. 到 Laboratory for Fluorescence Dynamics ( http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy ),下載  NumPy 的 Wheel 安裝 package (.whl 檔),請依python 版本和電腦系統版本做選擇。(例如:我裝的 Python 是 2.7 版 32 位元,我就下載 “numpy-1.12.0+mkl-cp27-cp27m-win32.whl")
  5. 到剛剛下載的資料夾啟動命令提示字元 (檔案總管,在資料夾空白處,按 shift + 右鍵 > 在此處開啟命令視窗(W))
  6. 執行 pip install numpy-1.12.0+mkl-cp27-cp27m-win32.whl (這裡 numpy-1.12.0+mkl-cp27-cp27m-win32.whl 是剛剛下載的 Wheel 檔)
  7. 安裝完成後,到 Python IDLE,執行看看 import numpy as np ,如果沒有出現問題就是安裝成功了