Category: Computer


Jupyter notebook 上,當你輸入左括號時,會自動幫你鍵入右括號,但判斷相當不聰明,常常你要打右括號卻會被吃掉。因此我通常都會把自動完成括號的功能關閉。

關閉自動括號完成的方法如下:
1. 打開隨意一個 Jupyter notebook 輸入並執行

from notebook.services.config import ConfigManager
c = ConfigManager()
c.update('notebook', {"CodeCell": {"cm_config": {"autoCloseBrackets": False}}})

2. 重新開啟 Jupyter notebook 即可。

這在 Windows 和 macOS 上都適用

Reference: https://stackoverflow.com/a/42566861/7159229

廣告

macOS 上安裝 lightGBM

首先需要安裝 Homebrew,在 terminal 裡輸入:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

並輸入使用者密碼來安裝。

接著使用 Homebrew 來下載並安裝 cmake 和 gcc:

brew install cmake
brew install gcc

注意,Homebrew 所安裝的 gcc 會是最新版的 (2018 年時裝的是 gcc-8)。但是如果直接在 terminal 輸入 gcc 所執行的仍會是 macOS 原本預裝舊版 gcc 4.2.1。若之後要呼叫新版 (例如第8版) 的 gcc 請使用 “gcc-8”。

然後,用 git 下載並編譯 lightGBM。移至根目錄 ~ 後輸入:

git clone --recursive https://github.com/Microsoft/LightGBM ; cd LightGBM
export CXX=g++-8 CC=gcc-8
mkdir build ; cd build
cmake ..
make -j4

如果未來需要更新版本的 gcc,則把指令中的 8 改為新的版本號。

最後安裝 python 端的 lightgbm package:

pip3 install lightgbm

然後可以在 python 內執行

import lightgbm

來檢查是否安裝正確,接著就會發現錯誤XD [未完…]

References:
http://lightgbm.readthedocs.io/en/latest/Installation-Guide.html#macos
https://github.com/Microsoft/LightGBM/issues/1369
http://lightgbm.readthedocs.io/en/latest/Python-Intro.html#install

Please do NOT use “Microsoft YaHei" for Traditional Chinese. Please use “Microsoft JhengHei" instead!

微軟為中文開發的新字體有兩個,簡體字市場用的是「微軟雅黑體」,而繁體字市場的是「微軟正黑體」。由於微軟雅黑體內也包含繁體字,因此常常會看到有些系統誤把繁體字用微軟雅黑體顯示 (如:Google Account 頁面)。這常常讓繁體字的畫面看起來很凌亂、很不整齊。

下圖比較同樣的文字,用 微軟正黑體 (上) 和 微軟雅黑體 (下) 來顯示的結果:

可以看出數個問題:

  1. 繁體字在微軟雅黑體中,高度不一致,像是圖中的「資」、「頁」、「管」、「護」、「帳」、「虞」 等字,就比其他字要高。而「您」字則比旁邊要矮。這些字的下緣都沒有跟旁邊切齊。
  2. 微軟雅黑體的繁體字,不是正確的寫法 (以台灣來說),最明顯的是「透」、「過」左邊的辵部在雅黑體中少了一個凹。「過」右上的橫槓應該在右不再左。「及」中間那劃沒有接回、「虞」下面應該是「吳」而不是「口天」。
  3. 微軟雅黑體字體較正黑體為粗,但雅黑體不是每個字的粗細都一致,比例也明顯沒有調整過(縱劃都比橫劃要粗)。

這些問題導致,用微軟雅黑體來顯示繁體字,常會有雜亂的感覺。而會有這些差異,主要的原因應該是「微軟雅黑體」根本就不是特別為繁體字設計的,所以比例和位置都沒有對繁體字調整過。而且有很多字元在簡體字和繁體字的寫法本來就不同,雖然編碼上被當作同一個字元。

因此希望各位網頁設計者不要把微軟雅黑體用來顯示台灣地區的繁體字,感謝!

之前都是用 Chrome 和 Opera 開 Jupyter Notebook,

每次只要 notebook 太長、cell 數太多,瀏覽時就會開始 lag

後來發現 Firefox 沒有這問題,就算開很大的 notebook,瀏覽起來也是非常順暢,

所以之後就都換成用 Firefox 開 Jupyter notebook。

 

不過 Firefox 不是我的預設瀏覽器,所以這裡介紹如何在 Windows 下指定 Jupyter notebook 預設的瀏覽器。

  1. 在命令提示字元輸入
    jupyter notebook --generate-config

    以建立新的 jupyter_notebook_config.py 設定檔

  2. 在執行… (Win + R) 中,執行 .jupyter,以前往 jupyter_notebook_config.py 所在的資料夾,用文字編輯器開啟 jupyter_notebook_config.py
  3. 找到 #c.NotebookApp.browser,把它改成
    firefox_path = 'C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe'
    import webbrowser
    webbrowser.register('firefox', None, 
                        webbrowser.BackgroundBrowser(firefox_path), 1)
    c.NotebookApp.browser = 'firefox'
    

會需要 import webbrowser 是因為 Jupyter 基本上是用 webbrowser.get(‘firefox’).open(URL) 來啟動瀏覽器的,

但新版的 Firefox 不一定有被註冊在 python webbrowser 的資料庫中,所以必須先註冊 Firefox 才行。

Unit test in Physics?

在 CS 領域,寫程式常常會需要寫 unit test,來確保程式區塊的運作正常,這對後續維護程式碼相當方便。如果修改過後的程式碼無法通過 unit test,就代表該修改可能會不相容。由於 unit test 的範圍通常是一小段function,因此可以很快就找出有問題的 function。另外,寫 unit test 也有助於對該段程式碼的了解,如果根據你所預期的結果,對某段程式寫了 unit test 卻沒通過,代表你對該段程式碼的理解有誤,或是該段程式碼有 bug。

也許在理論物理也應該要建立這樣的 unit test,
在眾多的理論中,可以快速檢查各種新理論是否與實驗或已知現象或結論是否相符合。

有時候部分 Windows 7 的圖示,像是開始功能表列或桌面的程式圖示會消失

這是因為 Windows 有對這些程式圖示做快取,但快取資料庫可能被某些新安裝的程式弄亂了

下面方法方法可以重建圖示快取資料庫:

  1. 關閉所有的檔案總管 (Windows Explorer) 視窗
  2. 按 Ctrl + Shift + Esc 啟動 Windows 工作管理員 (Task Manager)
  3. 在「處理程序」頁面,找到 explorer.exe,在其上按右鍵
  4. 點選 「結束處理程序(E)」。 (這時工作列會消失,因為工作列就是 explorer.exe 的一部分。)
  5. 從工作管理員左上角的「檔案(F)」選單,點選「新工作 (執行…) (N)」
  6. 輸入 cmd 後按「確定」,以打開命令提示字元 (Command Prompt)
  7. 在 cmd 視窗內,依序輸入下列指令並按 Enter:
    cd /d %userprofile%\AppData\Local
    del IconCache.db /a
    exit
    (這步驟基本上刪除圖示快取檔,explorer.exe 重開後就會重建)
  8. 在工作管理員,點「檔案(F)」>「新工作 (執行…) (N)」
  9. 輸入 explorer 後按「確定」,工作列就會出現

資料來源 (英文):http://answers.microsoft.com/en-us/windows/forum/windows_7-desktop/icons-missing-their-specialized-image/3f1f7108-2984-4071-afd8-5bec9cceda38?auth=1

最近開始使用 Spyder 的 python IDE,其中包含 editor、IPython、變數檢視器、檔案檢視器和各種 documentation,對於需要不斷改 code 並實驗各種參數非常好用。

Spyder IDE 的 Github: https://github.com/spyder-ide/spyder
Spyder 官方網站: http://pythonhosted.org/spyder/index.html

由於我沒有安裝 Anaconda,這裡提供使用 pip 安裝的方法:

Spyder IDE 需要藉由 PyQt 來顯示圖形介面,因此需先安裝 PyQt。在 cmd 輸入:

pip install PyQt5

安裝完成後,接著輸入:

pip install spyder

來安裝 Spyder。如果沒問題就安裝好了。最新的 Spyder 版本是 3.2.0,但我在安裝 Spyder 3.2.0 遇到一些 unicode 的問題,所以目前我還是安裝舊版的 3.1.4

pip install spyder==3.1.4

如果以後 bug 修復了,可以再透過下列指令更新 Spyder

pip install -U spyder

 

Windows 上安裝完後,要啟動 Spyder IDE ,可以在 cmd 輸入:

spyder3

Spyder 的程式執行檔 “spyder3.exe" 是放在 Python 安裝位置下的 Scripts 資料夾 (Python 的其他 cmd 指令像是 pip 也都在此)。如果嫌麻煩,可以建立一個捷徑連結到 “spyder3.exe"。

註:一般 Python 3 的預設安裝位置是

C:\Program Files (x86)\Python 3.x (所有使用者安裝 32 位元)
C:\Program Files      \Python 3.x (所有使用者安裝 64 位元)
C:\Users\<user name>\AppData\Local\Programs\Python\Python3x-32 (個別使用者安裝 32 位元)
C:\Users\<user name>\AppData\Local\Programs\Python\Python3x    (個別使用者安裝 64 位元)

而 Python 2 的預設安裝位置是

C:\Python2x

 

See you later alligator

今天聽到英文一種奇妙的方法說再見:

A: See you later alligator.

Urban dictionary 上寫對方聽到這句,必須要回答:

B: In a while crocodile.

搞笑的是 alligator 和 crocodile 都是鱷魚

美國人的梗真是難懂 ~~

如果使用的是 MiKTeX 2.9

可以在
C:\Program Files (x86)\MiKTeX 2.9\tex\latex\base
找到 LaTeX 的原始檔

LaTeX 一般也會包含說明檔 source2e,但我的 source2e 無法編譯,所以在網路上找到了編譯好的版本:
https://www.tug.org/texlive/Contents/live/texmf-dist/doc/latex/base/source2e.pdf

另外,你可能不會直接看到 source2e.pdf 所提到的原始檔 (例如:lt….dtx 檔),因為他們已經被包裝到 latex.ltx 和 latexa.ltx 檔內了。

第一次練習用 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