2016/2/23

在 R 中繪製地圖視覺化 leaflet:臺灣地區液化潛能製圖

在 R 中繪製地圖視覺化 leaflet:臺灣地區液化潛能製圖

今年春節前夕,發生了台南的大地震也讓人正視到台灣位於斷層帶的現實;

以下介紹,如何繪製 臺灣地區液化潛能製圖

首先你要有資料! 資料可以由網路上取得論文 本資料採用的是謝昇航 (2011)的論文 臺灣地區液化潛能製圖 下載位址: http://ir.lib.ncu.edu.tw:88/thesis/view_etd.asp?URN=976204004)

在附錄部份,作者提供了完整的資料表格;

一開始我使用的方式是:複製資料到 excel 後,錄製一段簡單的 VBA 將資料整理成一般資料表型式的 csv。後續有人提供可以用另外一套解決方案:tabula,可以直接捉取 pdf 資料輸出成 csv 格式,亦可以達成相同目的。

因為預設座標系統格式是 TWD97 格式,所以請專人協助後轉換為一般經緯度格式(即 EPSG 4326)。

對於資料有興趣的人,請直接整理好後的原始資料 https://drive.google.com/file/d/0B4523k7TnHsoRXYtNUcxUGh0T2s/view?usp=sharing

接下來就是正題了,若要繪製地圖 首先你要安裝 leaflet 套件,另外建議可以搭搭 dplyr 可以讓語法更為簡潔精練 然後試試以下的語法

leaflet( ) %>% addTiles( )

此時若你是使用 Rstudio 做為 IDE 工具,應該發現已經出現世界地圖了; 接下來我們要做的事情就是將我們的資料置入於地圖中

此時我們可以把我們的資料讀進來 例如:(實際路徑請自己依情況調整) dfmap <- read.delim("SheetR_MAP.csv",stringsAsFactors=FALSE)

然後把剛剛的語法調整如下: leaflet(df_map ) %>% addTiles( )

此時什麼事情都沒有發生,因為我們還是沒有告訴 leaflet 要如何繪製圖形 好歹,我們要告訴 leaflet 各點位的經緯度吧?

m <- leaflet(df_map ) %>% addTiles( )

最基本的語法如下: m %>% addCircleMarkers( lat = ~ Lat , lng = ~ Lon ) 此時就可以將所有探測點給標示出來:

P1

當然,我們感興趣的重點不會是探測點的位置,而是實際液化狀況為何? 因為資料量高達3000多點,若直接標示數值會顯得非常沒有意義; 此時可以依據論文作者所提示的數值間距,進行群組分類:

PL範圍: PL > 15 高度液化潛能

5<PL ≦15 中度液化潛能

0<PL ≦5輕度液化潛能

PL=0液化潛能極低

定義資料(顏色)群組:

pal <- colorBin(palette=c(green,pink,red,purple),domain=df_map$Pl,bins=c(0,5,10,15,70),pretty=TRUE,na.color=#808080,alpha=F)

備註:於資料整理階段時已知最高值不會高於70

所以再將程式碼修改為:

m %>%
addCircleMarkers( lat = ~ Lat , lng = ~ Lon ,color=~pal(Pl) ) 地圖上就會變成花花綠綠

最後,因為想要透過網路與網友們分享,我再加入了一些互動的功能 例如:游標指向的點會出現資料數值、可以針對區域做選擇

最終版本的視覺化結果如下: P2

程式碼提供如下:

可以發現若扣掉說明文字,整個具備基礎互動功能的地圖視覺化用了不到30行的程式碼… leaflet 的確在地圖視覺化解決方案上有蠻高的競爭優勢!

2016/1/9

Vagrant 1.81版新增 box 異常,抽換 curl.exe 即可解決

Vagrant 1.81版新增 box 異常

例如:下載 ubuntu 14 with docker 的指令應該如下

vagrant box add ubuntu14_docker https://github.com/jose-lpa/packer-ubuntu_14.04/releases/download/v2.0/ubuntu-14.04.box

會吐出錯誤訊息,查詢後發現應該是 curl 異常的關係

我到這個網站 http://winampplugins.co.uk/curl/
因為我是 win10 所以下載這個 curl 7.46.0 - 64-bit (Windows Vista and newer)

下載後,將 curl.exe 置換原本在 c:\HashiCorp\Vagrant\embedded\bin\ 目錄底下的curl.exe

OK ! 打完收工 … 可以繼續開發工作囉

2016/1/4

PC 上搭建 Linux系統可簡化許多情境

思路:
  • 硬體不值錢,DRAM很便宜,新購置的PC直接裝到 32GB - 64GB 並不算高價
    • 反過來說,如果你的電腦是10年前的,然後記憶體只有2GB ...那就無法使用此法
  • Windows 上的 Docker 很難用,我已經太多次使用到暴走的經驗了
  • 有些在 mac / windows 跑得好好的程式,在windows上就是會吐出錯誤訊息
    • 例如:utf8純文字處理在windows上真的很麻煩,我寧願先在linux處理完後,轉存在xml/xlxs後再由接下處理
應用情境:
  • 在 windows 上使用 R 的朋友往往會遇到編碼處理的問題,我建議直接在Windows上搭建 VM Ubuntu 然後使用Docker上的 Rstudio Server,使用起來與桌面版的Rstudio完全沒有什麼差異… 要進行網路爬蟲大量資料捉取時也很方便
  • Windwos上的Python總是出現出一些奇怪的錯誤?
  • 公司的電腦只適合做公司事務,自我提升的進修學習是不適合使用公司資源進行,仍然有自建計算資源的需求;
前提要件:
  • 在 PC 的 Windows 上安裝vagrant 與 virtual box
  • Windwos 上的終端機可選這一套mobaxterm ,可儲存ssh登入的帳號與密碼很方便 http://mobaxterm.mobatek.net/
  • 設定 Windwos -- VM 共享資料夾
  • 在 VM 上使用Docker
細節:
  • vagrant 簡化 Linux 安裝過程,各式linux可快速建置;請參考 http://www.vagrantbox.es/
    • 只要以下3個指令就搞定囉
      • vagrant box add 自定義名稱 映象檔來源網址
      • vagrant init 自定義名稱
      • vagrant up
      • 建好後的 VM 預設的帳號與密碼 vagrant / vagrant
  • 在 VM 上再使用 Docker,若有使用 Port 記得將Virtual Box的Port也要打開
  • 資料夾共享設定:
    • 在Windows的 VirtualBox GUI設定資料夾,可將「自動掛載」、「設為永久」都勾選
      • 例如:分享了一個windows上的資料夾名稱叫做 wiki
    • VM Linux 設定:
      • 登入終端機後執行 sudo mount -t vboxsf wiki /home/vagrant/wiki
提醒:
  • 執行一些作業時間較久的作業時,請將 VM 記憶體調高
  • 能用錢解決的事情真的是小事… 請把節省下來的時間拿去學習更有價值的東西吧

2016/1/2

tensorflow 初學者筆記

身為一個 deep learning 的初學者所做的一些筆記。

建議可由 Google Brain 邱中鎮博士的投影片入門

http://www.slideshare.net/tw_dsconf/tensorflow-tutorial 這份投影片中最由價值的部份,是其對於 tensorflow 編寫的順序做了詳細的介紹; 這是你在官網中沒有辦法找到的詳細資料…

相對於傳統的統計學手法,例如:迴歸模型。 我們常常可以將資料與模型直接綁在一起;
例如:在R中要計算一個簡單的迴歸模型。

x <- rnorm(100)
y <- rnorm(100)
lm(y~x)

幾行就解決了,但是如果同樣的東西用 tensorflow 來處理的話: 可以參考這篇: https://github.com/yamitzky/tensorflow-practice/blob/master/Linear%20Regression%20by%20TensorFlow.ipynb
行數似乎增加了不少??
結合了邱博士的說明,我簡單將 tensorflow , 可以拆解為2個概念
  • 模型定義(modeling):抽象化,此階段完全是紙上談兵
    • 輸入項、輸出項的定義(tensorflow的術語叫:placehold)
    • 模型建構(隱藏層)
      • 定義 Variable (例:權重、誤差項)
      • 定義網路 (例:y = W*X+b)
    • 定義Loss函數
    • 最佳化:讓Loss函數最小化(Tensorflow 內建 Gradient Desecnt 等,可直接叫用)

  • 執行(session階段):戰爭期:計算資源投入(CPU/GPU)、實際資料投入
    • 要跑幾次去達成最佳化(Iterative Update)
    • 訓練資料讀入( feed)
讓模型定義更加抽象與獨立,是為了後續如果要建立不同模型時(例:3層模型變成30層)、定義不同的Loss函數、使用不同最佳化手法時,可以與原始資料完全隔離,不會受到影響
另外
參考連結:
地雷區:
  • tensorflow 目前對 python3 支援還不夠,例如圖示化的工具會有問題,請愛用python2進行學習

  • tensorflow 也提供了圖示化的方式,不過不建議初學者花太多時間在此;這個功能比較適合對於模型有完整瞭解後,要強化的情形;一般初學者,應該是先設定好自己的目標(想做的事),去找適合的模型(例:不要太多層的)、適合的資料、適合的LOSS函數、適合的最佳化手法,然後行有餘力把用到的數學都k一遍後,再去看圖示化的工具吧…

  • 日本網友測試如果在windows系統用docker搭建tensorflow, 只要遇上較大的資料集,就必定當機 … 想要學習的話,建議還是搭建個VM 或直接使用 Linux系統