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。(可以到 Python 官網 下載安裝,目前最新版本是 3.6.2 和 2.7.13。) 而 Scipy package 依賴於 Numpy ,以提供更多科學運算所需的功能。

一般 Python 安裝 packages 可以直接在 command line (cmd) 裡輸入

pip install <package 名稱>

來下載安裝。

然而 Scipy (於 2017 年) 在 pip 上仍然沒有相容於 Windows 的安裝版本,因此必須手動至 Christoph Gohlke 的網站下載安裝。由於此 Scipy 依賴於 Numpy+mkl,所以 Numpy package 也必須手動安裝。

下面提供在 Windows 上已安裝好 Python 後,手動下載安裝 Numpy package 的方法

  1. 開啟命令提示字元 (cmd)
  2. 輸入並執行 python -m pip install -U pip setuptools
    (如果命令提示字元不認得 ‘python’ 和 ‘pip’,請先把 python 資料夾 C:\Python27 和 C:\Python27\Scripts 加入到 Windows 的 path 環境變數內)
    (此例子以 python 2.7 版,3.6 版也是類似,只是位置不同)
    (如果 pip 無法更新,請試試看重新安裝新版的 Python 2.7 或 3.6)
  3. 輸入並執行 python -m pip install wheel ,來安裝 Wheel
  4. Unofficial Windows Binaries for Python Extension Packages 網站,下載  NumPy 及 Scipy 的 Wheel 安裝 package (.whl 檔),此網站由 UCI Laboratory for Fluorescence Dynamics 的 Christoph Gohlke 所維護
    Numpy: http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy
    Scipy: http://www.lfd.uci.edu/~gohlke/pythonlibs/#scipy
    依 Python 安裝的版本做選擇。(cp27 是給 2.7 版的 Python,cp36 是給 3.6 版。win32 是給 32 位元的 Python,win_amd64 是給 64 位元的。例如:2.7 版 32 位元的 Python,就下載 “numpy-1.12.0+mkl-cp27-cp27m-win32.whl" 及 “scipy-0.19.1-cp27-cp27m-win32.whl")
  5. 到剛剛下載的資料夾內,啟動命令提示字元 (檔案總管,在該資料夾空白處,按 shift + 右鍵 > 在此處開啟命令視窗(W))
  6. 先安裝 Numpy,執行 pip install numpy-1.12.0+mkl-cp27-cp27m-win32.whl
  7. 接著安裝 Scipy,執行 pip install scipy-0.19.1-cp27-cp27m-win32.whl
  8. 安裝完成後,到 Python IDLE,執行看看 import numpy 和 import scipy,如果沒有出現問題就是安裝成功了!

其他常見的 packages 如 sklearn, tensorflow, matplotlib 皆可以直接透過 pip install 安裝,並相容此 numpy

But, 以上是 the hard way to install。如果你只想要無腦安裝直接使用,可以試試 Anaconda Distribution 的 Python

http://www.continuum.io/downloads

這是由 Continuum Analytics 公司提供的,一般使用應該是免費,預設會安裝一些 data 分析和科學運算常用的 packages。