2017年12月13日 星期三

what is the use of the ROC curve in data mining?

對於多類別的分類問題,ROC(Receiver Operating Characteristic,接收器作業特徵值)曲線圖 可用來觀察分類器在參數不同鬆緊設定下,預測某特定類別值的表現情形。 因此,ROC曲線圖適合用來調整參數,呈現對於不同類型分類錯誤的取捨結果。

假設雙類別問題中,資料集案例數陽遠少於陰,因此比較關心陽類別的預測表現。 則ROC平面可定義成 橫軸為偽陽率(陰預測為陽比率,False Positive Rate)=FP/(FP+TN),又稱錯誤命中率、假警報率,其值相當於(1-特殊度); 縱軸為真陽率(陽預測為陽比率,True Positive Rate)=TP/(TP+FN),又稱召回率、敏感度、偵測率。

假設分類器可預測案例為陽的機率,則給定陽機率門檻參數可決定案例類別如下: 若預測機率高於門檻,則案例歸為陽,否則歸為陰。 因此,陽機率門檻參數的調整將位於如下兩種極端情況之間:

  1. 惜口如金,嚴苛型參數: 設定陽機率門檻很高,很少案例歸為陽,但判斷為陽的案例其正確率也很高。 由於多數案例判斷為陰,因此本來是陽誤歸為陰的機會增加,即第一類錯誤較多。
  2. 來者不拒,寬鬆型參數: 設定陽機率門檻很低,很多案例歸為陽,但判斷為陽的案例其正確率也很低。 由於多數案例判斷為陽,因此本來是陰誤歸為陽的機會增加,即第二類錯誤較多。

由上面可以知道,機率門檻參數的調整基本上就是在第一類錯誤及第二類錯誤之間作取捨。 如果第一類錯誤較可容忍,第二類錯誤較不可容忍,參數要調向嚴苛方向,即門檻要調高; 反之如果第一類錯誤較不可容忍,第二類錯誤較可容忍,參數要調向寬鬆方向,即門檻要調低。 因此,繪製ROC曲線的目的就在顯示不同分類錯誤的取捨結果。

ROC曲線畫法如下: 設定陽機率門檻變化由最嚴1到最鬆0,將各門檻值的分類器表現,其偽陽率及真陽率的交點連線起來,形成ROC曲線圖。 其中,若將所有案例依預測為陽的機率由大到小排序,則橫軸的偽陽率相當於機率在陽機率門檻值以上的陰案例出現比例; 縱軸的真陽率相當於機率在陽機率門檻值以上的陽案例出現比例。 ROC曲線由左到右表示,某分類器從預測陽性全不容許錯到完全容許錯之間,所有陽案例出現比例的變化。 對角直線由左到右表示,隨機分類器從0%全預測為陽,到100%全預測為陽,所有陽案例出現比例的變化。 任一分類器只要ROC曲線位於對角線上方就比隨機分類器好,離的越遠,越靠近左上角越好。

例如,使用 Weka 的 簡單貝氏分類器(NaiveBayes) 套用到內附的 乳癌案例集 (breast-cancer.arff)。 此案例集的雙類別分佈為: 無復發事件(no-recurrence-events)201例,有復發事件(recurrence-events)85例。 顯然復發案例較少,因此我們將針對復發預測進行門檻調整,畫出復發預測的ROC曲線圖如下。 此曲線圖橫軸(X)為偽陽率或假警報率,縱軸(Y)為真陽率或偵測率。

若照預設的陽機率門檻0.5,則凡是案例預測為陽的機率高於門檻者,皆視為陽(即復發)。 所以系統在偽陽率=16.4%之下,可以達到真陽率=43.5%。 表示若允許16.4%的假警報錯誤,則偵測率可達43.5%。 曲線圖上每個點表示1個案例,最右上為預測為陽機率接近0的案例,最左下為預測為陽機率接近1的案例, 中間案例則按預測為陽機率由低(曲線右上)到高(曲線左下)依序擺放。 因此,位居分界線的門檻案例約略落在1(曲線右上)起算第215個案例的預測機率位置上。 凡機率在門檻案例以上(曲線往左)者皆預測為陽性(即復發),以下(曲線往右)者皆預測為陰性(即不復發)。 有關第215個排序的門檻案例,其相關資訊如下:

此時的混淆矩陣長相如下:

分類判斷為陽分類判斷為陰
案例實際為陽真陽性(TP=37)偽陰性(FN=48)
案例實際為陰偽陽性(FP=33)真陰性(TN=168)

如果調升陽機率門檻大於0.5門檻,也就是變嚴苛、不容錯,由ROC曲線可以看到,門檻案例的分界線將往曲線左方移動。 也就是偽陽率變低,但是真陽率也將跟著變低。最極端情況,陽機率門檻設為1,偽陽率及真陽率將雙雙落為0,也就是不容假警報錯誤下,偵測率將為0%。 此時的混淆矩陣長相如下,所有案例都處於預測為陰的過於保守情況:

分類判斷為陽分類判斷為陰
案例實際為陽真陽性(TP=0)偽陰性(FN=85)
案例實際為陰偽陽性(FP=0)真陰性(TN=201)

反之,如果調降陽機率門檻小於0.5門檻,也就是變寬鬆、更容錯,由ROC曲線可以看到,門檻案例的分界線將往曲線右方移動。 也就是偽陽率變高,但是真陽率也將跟著變高。最極端情況,陽機率門檻設為0,偽陽率及真陽率將雙雙達頂1,也就是完全容許假警報錯誤下,偵測率將為100%。 此時的混淆矩陣長相如下,所有案例都處於預測為陽的過於積極情況:

分類判斷為陽分類判斷為陰
案例實際為陽真陽性(TP=85)偽陰性(FN=0)
案例實際為陰偽陽性(FP=201)真陰性(TN=0)

所以畫出分類器的某類別ROC曲線圖可以輔助用戶在偽陽率及真陽率之間,也就是容許假警報錯誤及偵測率之間作取捨,道理在此。 取捨的依據就是調整預測為陽的機率門檻,在適當鬆緊之間,找到一個平衡點,能同時滿足自己可容許的假警報率及希望的偵測率。

另外,每個分類器在ROC平面,依陽機率門檻值的變化可以畫出一條ROC曲線。此曲線底下的面積稱為AUC(Area Under the Curve)。 AUC值最大為1,最小為0,值越大越好,可表示任抽一個陽案例及陰案例,分類器會讓陽案例的位置排在陰案例之前的機率。 隨機分類器的ROC曲線為一左下到右上的對角直線,其AUC值為0.5,表示任抽一陽一陰,陽會排在陰之前的機率為0.5。

    註:
  1. An Introduction to ROC Analysis
  2. ROC曲線
  3. 混淆矩陣定義如下:
    分類判斷為陽分類判斷為陰
    案例實際為陽真陽性(TP, True Positive)偽陰性(FN, False Negative)
    案例實際為陰偽陽性(FP, False Positive)真陰性(TN, True Negative)

Summary of Java Collection Framework

Java API 提供收藏架構(Collection Framework),內含眾多寫好的記憶體容器,即資料結構。
收藏架構的容器支援泛型,可儲存任意物件當元素。
架構當中,介面負責制定容器操作的方法規格,類別負責實作眾多介面規格。
收藏介面是整個架構的根介面,此容器模擬一個收納袋(bag)或多值集合(multiset)的運作,
值可重複,無位置概念,但可詢問是否包含某元素。如果想列舉內容,可取得容器的迭代器,進行元素的列舉。
以下摘要幾種常用的容器介面,及其實作類別。

A.介面
  Collection 收藏:    放個別物件,  可重複放,無位置概念,無排序
  List 清單:          放個別物件,  可重複放,任意位置概念,無排序
  Queue 佇列:         放個別物件,  可重複放,頭位置概念,無排序
  Deque 佇列:         放個別物件,  可重複放,頭尾概念,無排序
  Set 集合:           放個別物件,不可重複放,無位置概念,無排序
  SortedSet 有序集合: 放個別物件,不可重複放,有頭尾概念,有排序
  Map 映射:           放成對物件,不可重複放,無位置概念,無排序
  SortedMap 有序映射: 放成對物件,不可重複放,有頭尾概念,有排序

B.類別
  Collection:   Vector,Stack,ArrayList,ArrayBlockingQueue,
  LinkedList,PriorityQueue,HashSet,TreeSet,...
  List:  Vector,Stack,ArrayList,LinkedList,...
  Queue: LinkedList,PriorityQueue,ArrayBlockingQueue,...
  Deque: ArrayDeque,LinkedList,LinkedBlockingDeque,...
  Set:  HashSet,TreeSet,LinkedHashSet,...
  SortedSet: TreeSet,...
  Map:  HashMap,TreeMap,HashTable,Properties,...
  SortedMap: TreeMap,...

  註: Vector (向量) 和 ArrayList (陣列清單) ,兩者差異在前者支援多緒安全性,後者無
      HashTable (雜湊表) 和 HashMap (雜湊映射), 兩者差異也在前者支援多緒安全性,後者無
      HashTable (雜湊表) 和 Properties (屬性表),兩者差異在後者多了檔案輸出入功能

C.收藏架構圖 (介面方法區分唯讀及讀寫兩類)

2017年11月8日 星期三

regular expressions (a|b) and [ab] are the same?

正規式 (a|b) 和 正規式 [ab] 兩者皆可匹配1個a或1個b,所以匹配效果一樣。
但是兩者的語法不同,表達能力也不同,說明如下:
[]表示匹配中括號(bracket)內字元集合的一個字元,所以只能匹配1個字元;
()表示匹配小括號(parenthesis)內直槓(vertical bar,|)隔開的任一正規式,所以可能匹配不止1個字元。

例如: 
1.正規式 hello 匹配 hello 5個字元
2.正規式 [hello] 匹配 h或e或l或o 任1個字元
3.正規式 (hello) 匹配 hello 5個字元
4.正規式 (hello|world) 匹配 hello 或 world 5個字元
5.正規式 ([hello]|world) 匹配 h或e或l或o 任1個字元  或 world 5個字元

參考:
difference b/w [ab] and (a|b) in regex match?

2017年11月5日 星期日

Use a jupyter and docker environment for learning tensorflow

想要學習Google的開源機器學習套件tensorflow,可以研讀網路上很多Python語言寫的程式範例。
但是,要讓自己的機器能跑得動這些Python寫的tensorflow範例,首先須跨越2個門檻:

1.安裝Python: 
    Python語法分Python2及Python3,IDE介面分jupyter及spyder等,套件管理分anaconda,pip等,
    在選擇眾多之下判斷及安裝皆費時。

2.安裝tensorflow: 
    除了依硬體分成CPU,GPU兩版,軟體也依Windows, Ubuntu, MacOS三種不同作業系統,而分成
    virtualenv、pip、anaconda、docker、原始碼等多種安裝法,各有不同安裝步驟及參數要設定。
    尤其安裝過程到底是使用 Python2 或 Pyhton3 也很容易因此而發生相容性問題。

以下介紹一個利用docker容器原理,快速建立執行tensoflow環境的作法:

1.安裝 docker 容器管理軟體:
    https://www.docker.com/community-edition#/download
       分成 Windows, Linux, Mac等免費版本,下載安裝合適公用版(community edition)
    其中,Windows 10可直接安裝 Docker CE for Windows,內含Windows及Linux兩種核心引擎
    若 Windows 非第10版,建議在Linux虛擬機環境下使用Docker,依序安裝如下軟體:
         VirtualBox Binaries Windows hosts + Ubuntu Desktop + Docker CE for Ubuntu

2.下載 jupyter/tensorflow-notebook 容器映像檔:
    https://hub.docker.com/r/jupyter/tensorflow-notebook/
    利用如下 docker 指令下載容器映像檔,內含Scipy Notebook + Tensorflow and Keras for Python 3.x (without GPU support)
    # docker pull jupyter/tensorflow-notebook
    註: 本映像檔可由如下github提供的 Dockerfile 從Ubuntu製成
         https://github.com/jupyter/docker-stacks/tree/master/tensorflow-notebook 
         https://github.com/jupyter/docker-stacks/tree/master/scipy-notebook
         https://github.com/jupyter/docker-stacks/tree/master/minimal-notebook
         https://github.com/jupyter/docker-stacks/tree/master/base-notebook
         Ubuntu 16.04 (xenial)

3.下載 nfmcclure/tensorflow_cookbook 程式範例:
    https://github.com/nfmcclure/tensorflow_cookbook
    利用如下 git 指令下載範例
    > git clone https://github.com/nfmcclure/tensorflow_cookbook.git
    或
    點選[Download ZIP]下載範例壓縮檔解開

    註: TensorFlow Machine Learning Cookbook範例採用 Pyhton3 撰寫

4.啟動執行範例:
    假設程式範例位於/home/user/docker/tensorflow_cookbook,網頁連線埠為8080,
    則可利用如下指令啟動容器:
    # docker run -it --rm \
        -p 8080:8888 \
        -v /home/user/docker/tensorflow_cookbook:/work \
        --name tflow jupyter/tensorflow-notebook \
        start-notebook.sh --NotebookApp.token='demo' --NotebookApp.notebook_dir='/work'

    然後開啟瀏覽器,利用網址 http://localhost:8080,密碼 demo,連到容器,執行tensorflow範例。

    註: docker run imagePath 指令可將映像檔imagePath放入容器執行,猶如虛擬機開機一般,其參數說明如下:
        -it 保留終端機供互動用,按Ctrl-C可結束容器
        --rm 容器結束時,容器也自動刪除
        -p 8080:8888 將容器內部的8888埠對應到主機的8080埠,供外部使用
        -v outerPath:innerPath 將主機的outerPath目錄掛載到容器內部的innerPath目錄,方便內外硬碟資料共享
        --name tflow 為容器命名為tflow,方便之後取用
        jupyter/tensorflow-notebook 為映像檔在docker hub的標準名稱
        start-notebook.sh  為容器啟用後執行的批次檔,主要啟動jupyter notebook,允許預設8888埠網頁連線
        --NotebookApp.token='demo' 設定網頁連線密碼 demo,以防外人取用
        --NotebookApp.notebook_dir='/work' 設定notebook初始開檔目錄,設為/work可以對應到掛載進來的外部範例目錄,方便取用

   註: 利用docker容器啟動包含jupyter notebook及tensorflow環境的容器,執行tensorflow範例程式的長相如下:

2017年10月25日 星期三

Uncompilable source code when using NetBeans IDE

若使用NetBeans出現如下執行錯誤及對話盒:

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - .......

One or more projects were compiled with errors
[ ] Always run without asking
  <Run Anyway> <Cancel>

建議對話盒選擇Cancel取消,稍微加減空格更動原始碼,再重新編譯執行看看。

這似乎是NetBeans工具一直以來的bug,起因在預編程式碼的快取管理上有問題。
但是,因為回報時無法規律性的重現問題,很難根除。

網上建議有幾種處置法,可試看看,然後重新編譯執行:
1.加減空格更動原始碼,重新儲存
2.右鍵點選【專案名/Properties/Categories: Build/Compiling: [ ] Compile on save】
  關閉此[儲存時立即編譯]選項
3.右鍵點選【專案名/Clean】清除快取
4.退出NetBeans,利用檔案總管刪除如下快取索引目錄,再重新啟動NetBeans
     C:\Windows\Users\用戶名/.netbeans/var/cache/index/s*/java/*/classes
     或
     C:\Users\用戶名\AppData\Local\NetBeans\Cache\版本\index\

2017年10月13日 星期五

how to retrieve the peer comments from a moodle workshop activity

Moodle 教學平台提供工作坊(Workshop)活動可由同學互評給分。
在工作坊中,每份上傳作業(Submission)可由同學打分數及給評語(PeerComment)。
若想取得一份上傳作業的所有評語,則必須逐一擷取,無法集中一目了然。
以下展示如何利用 Moodle 外掛模組 Ad-hoc database queries 擷取所有評語的作法。

1.下載外掛: 下載合適自己Moodle版本的隨意資料庫查詢外掛
    Reports: Ad-hoc database queries
    https://moodle.org/plugins/pluginversions.php?plugin=report_customsql

2.安裝外掛: 【管理/網站管理/外掛/安裝外掛:】
        外掛套件類型: 網站報告
        ZIP包裹: report_customsql_moodle27_2014061800.zip
        銘謝: V
        點選【從這ZIP壓縮檔安裝外掛】

3.建立查詢: 【管理/網站管理/報表/Ad-hoc database queries:】
        點選【Add a new query】
        Query Name: 工作坊查詢
        Description:
             ## 由提交id=2097找評分id及評語
             SELECT a.id as aid,g.id as gid,g.peercomment
             FROM `mdl_workshop_assessments` as a join `mdl_workshop_grades` as g join `mdl_workshop_submissions` as s
             WHERE g.assessmentid=a.id and a.submissionid=2097
             GROUP BY aid,gid
        Query SQL:
             SELECT a.id as aid,g.id as gid,g.peercomment
             FROM   {workshop_assessments} as a  join {workshop_grades} as g join {workshop_submissions} as s
             WHERE g.assessmentid=a.id and a.submissionid=:submissionid
             GROUP BY aid,gid
        點選【Verify the SQL text and update the form】作測試
        點選【儲存變更】

4.使用查詢: 【管理/網站管理/報表/Ad-hoc database queries:】
       點選【工作坊查詢】
       輸入查詢參數submissionid: xxx
       點選【Run Report】
       取得所有評分同學給某份上傳作業(submissionid=xxx)的評語(peercomment)

註1: 工作坊某份上傳作業的提交編號(submissionid)可由如下工作坊操作簡單取得:
      由【工作坊的成績報告】,找到某份上傳作業,滑鼠停留其上,可顯示其網址如下:
         http://moodle_site/mod/workshop/submission.php?cmid=1344&id=2097
      其中,id=2097即為提交編號

註2: 安裝外掛若遇如下錯誤
       外掛套件類型位置/moodle_data/wwwRoot/moodle/xxx/yyy 是不可寫入的
     表示目錄權限受SELinux管制無法寫入,可利用管理員身份以如下指令開放目錄可寫:
       # chcon  -t public_content_rw_t   /moodle_data/wwwRoot/moodle/xxx/yyy

參考:
1. Moodle資料庫工作坊資料表大綱:
     http://examulator.com/er/components/workshop.html
        workshop: id,...
        workshop_submissions: id,workshopid,...
        workshop_assessments: id,submissionid,...
        workshop_grades: assessmentid, peercomment,...

2. Moodle也可安裝管理人(Adminer)外掛,方便資料表瀏覽及查詢測試:
     https://moodle.org/plugins/pluginversions.php?plugin=local_adminer
     【管理/網站管理/主機/Moodle管理人】
     --以下為測試例子--
       ## 由課程簡稱找工作坊id=232
       SELECT w.id, w.name
       FROM `mdl_workshop` as w join `mdl_course` as c
       WHERE w.course=c.id and c.shortname='課名簡稱'

       ## 由工作坊id找提交id=2097
       SELECT s.id, s.title
       FROM `mdl_workshop_submissions` as s join `mdl_workshop` as w
       WHERE s.workshopid=w.id and w.id=232

       ## 由提交id=2097找評分id
       SELECT a.id
       FROM   `mdl_workshop_assessments` as a  join `mdl_workshop_submissions` as s
       WHERE a.submissionid=s.id and s.id=2097

       ## 由提交id=2097找評分id及評語
       SELECT a.id as aid,g.id as gid,g.peercomment
       FROM   `mdl_workshop_assessments` as a  join `mdl_workshop_grades` as g join `mdl_workshop_submissions` as s
       WHERE g.assessmentid=a.id and a.submissionid=2097
       GROUP BY aid,gid

2017年8月7日 星期一

how to show NLSC taiwan maps on JOSM

開放街圖(OpenStreetMap)的圖資可利用開放源碼Java撰寫的JOSM 製圖工具協助繪製。
在繪製地圖時,為了有可靠的依據,常須參考實際衛星圖、空拍圖、或行政區圖綜合判斷位置。

其中,中華民國內政部國土測繪中心(National Land Surveying and Mapping Center,NLSC)
提供很多開放的台灣區地圖可供JOSM免費介接,其使用法如下:

A.加入NLSC WMS圖磚來源方法:

  1.從JOSM的選單,點選【編輯/偏好設定/WMS_TMS/+WMS】
2.加入服務的URL網址: http://wms.nlsc.gov.tw/wms?SERVICE=WMS&REQUEST=GetCapabilities 點選【GetLayers】 3.選取圖層: [v] Store WMS endpoint only, select layers at usage 勾選表示使用時再選圖層 4.選取影像格式 image/jpeg image/png 5.查驗建立的WMS URL 網址 https://wms.nlsc.gov.tw/wms?VERSION=1.1.1&FORMAT=image/png&TRANSPARENT=TRUE& SERVICE=WMS&REQUEST=GetMap&LAYERS=&STYLES=& SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox} 6.輸入圖層的名稱 nlsc_wms_2020 【確定】
B.選用NLSC WMS圖磚方法: 1.從JOSM的選單,點選【圖磚/nlsc_wms_2020】
2.所有圖層選項將出現如下畫面,點選其中圖層,例如•臺灣通用電子地圖(新)。
3.臺灣通用電子地圖圖層將顯示在畫面,右上角圖層框的最上層將出現【nlsc_wms_2020EMAP98】圖層,如下。
註1: NLSC另外提供WMTS地圖服務,JOSM的設定步驟如下: 1.從JOSM的選單,點選【編輯/偏好設定/WMS_TMS/+WMTS】 2.輸入 getCapabilities 的 URL 網址: http://maps.nlsc.gov.tw/OpenData/wmts 或 http://maps.nlsc.gov.tw/S_Maps/wmts 3.輸入圖層的名稱: nlsc_wmts 【確定】 註2: 中研院也提供WMTS地圖服務,內含很多台灣舊地圖,JOSM的設定步驟如下: 1.從JOSM的選單,點選【編輯/偏好設定/WMS_TMS/+WMTS】 2.輸入 getCapabilities 的 URL 網址: http://gis.sinica.edu.tw/tileserver/wmts 或 http://gis.sinica.edu.tw/worldmap/wmts 3.輸入圖層的名稱: sinica_wmts 【確定】 註3: 國內WMTS服務資源清單 註4: 2019年國土測繪中心提供WMS地圖服務: wms.nlsc.gov.tw (2019) maps.nlsc.gov.tw web map service (Can also generate PNG,JPG) 縣市界 (CITY) 鄉鎮區界 (TOWN) 村里界 (Village) 段籍圖 (LANDSECT) 地政事務所轄區圖 (LandOffice) 各級學校範圍圖 (SCHOOL) - 1/5000基本地形圖 (B5000) 1/5000圖幅框 (MB5000) - 坡向圖 (MOI_ASPECT) 等高線圖(2003-2005) (MOI_CONTOUR) 等高線圖(2010-2015) (MOI_CONTOUR_2) 陰影圖 (MOI_HILLSHADE) 渲染圖 (MOI_SHADERMAP) 坡度圖-30%坡(2003-2005) (MOI_SLOPEP_GT30) 坡度圖-30%坡(2010-2015) (MOI_SLOPEP_GT30_2) 坡度圖-7級(2003-2005) (MOI_SLOPEP_LV7) 坡度圖-7級(2010-2015) (MOI_SLOPEP_LV7_2) - 國土利用調查成果圖 (LUIMAP) 國土利用調查-1類農業 (LUIMAP01) 國土利用調查-2類森林 (LUIMAP02) 國土利用調查-3類交通 (LUIMAP03) 國土利用調查-4類水利 (LUIMAP04) 國土利用調查-5類建築 (LUIMAP05) 國土利用調查-6類公共 (LUIMAP06) 國土利用調查-7類遊憩 (LUIMAP07) 國土利用調查-8類礦鹽 (LUIMAP08) 國土利用調查-9類其他 (LUIMAP09) - 正射影像圖(通用) (PHOTO2) 正射影像(混合) (PHOTO_MIX) - 臺灣通用電子地圖 (EMAP) 臺灣通用電子地圖(灰階) (EMAP01) 臺灣通用電子地圖透明 (EMAP2) 臺灣通用電子地圖(套疊等高線) (EMAP5) 臺灣通用電子地圖(套疊等高線)opendata, 最大比例尺一萬八千分之一 (EMAP5_OPENDATA) 臺灣通用電子地圖(不含等高線) (EMAP6) 臺灣通用電子地圖(不含等高線)opendata, 最大比例尺一萬八千分之一 (EMAP6_OPENDATA) taiwane-map(transparent) (EMAP7) taiwane-map(en) (EMAP8) 臺灣通用電子地圖(無鐵公路) (EMAP9) 臺灣通用電子地圖透明(無門牌) (EMAP12) 臺灣通用電子地圖(無門牌) (EMAP15) 臺灣通用電子地圖(不含等高線及門牌) (EMAP16) 臺灣通用電子地圖(高dpi字) (EMAP96) taiwan e-map(new) (EMAP97) 臺灣通用電子地圖(新) (EMAP98) 臺灣通用電子地圖(無文字) (EMAPX99) 註5: 2017年國土測繪中心提供WMS地圖服務: 縣市界 (CITY) 鄉鎮區界 (Town) 村里圖 (Village) 各級學校範圍圖 (SCHOOL) 段籍圖 (LANDSECT) - 國土利用調查成果圖 (LUIMAP) - 1/5000圖幅框 (MB5000) 1/5000基本地形圖 (B5000) - 正射影像圖(通用) (PHOTO2) 正射影像圖104年更新區 (PHOTO2015) - 臺灣通用電子地圖 (EMAP) 臺灣通用電子地圖透明 (EMAP2) 臺灣通用電子地圖(套疊等高線) (EMAP5) 臺灣通用電子地圖(不含等高線)opendata,最大比例尺一萬八千分之一 (EMAP6_OPENDATA) 臺灣通用電子地圖(不含等高線) (EMAP6) 臺灣通用電子地圖(套疊等高線)opendata,最大比例尺一萬八千分之一 (EMAP5_OPENDATA) taiwan-map(transparent) (EMAP7) taiwan-map(en) (EMAP8) 臺灣通用電子地圖(不含等高線及門牌) (EMAP16)

2017年8月4日 星期五

workaround before bug fix to set up a vpn server on win10

升級Windows 10之後,若出現無法建立或使用虛擬私人網路vpn服務,可考慮如下微軟論壇建議解法。

【症狀1】 由於不明原因,路由及遠端存取服務無法啟動,造成連入連線設定失敗
   <服務端主機>
   Win-R: cmd
     > ver
     Microsoft Windows [版本 10.0.15063]

   控制台/網路和網際網路/網路和共用中心/變更介面卡設定/檔案/新增連入連線...
      新增使用者: 使用者名稱,全名,密碼,確認密碼,確定,下一步
      如何連線? V 透過網路網路
      網路軟體: 網際網路通訊協定第4版(TCP/IPv4),內容
          網路存取: V 允許來電者存取我的區域網路
          IP位址指派: 指定IP位址,從XXXX,到YYYY
          確定
      允許存取
      --
      出現如下畫面:
          <允許連線到這部電腦>
          Windows無法建立您的連線
          連入連線依賴[路由及遠端存取]服務,但該服務無法啟動。
          如需詳細資訊,請查看系統事件記錄檔。
          [取消]
   --
   本機/管理/系統工具/事件檢視器/Windows記錄/系統:
      等級:錯誤,來源:Service Control Manager,識別碼:7024
      一般:Routing and Remote Access服務因下列服務特定錯誤而終止:
            發生一般性存取被拒的錯誤
   --
   本機/管理/服務與應用程式/服務/Routing and Remote Access/啟動
      出現如下畫面: 在本機電腦的 Routing and Remote Access服務已啟動又停止。
                   有些服務如果並未由其他服務或程式使用,會自動停止。

解法: 在註冊區新增兩組機碼,再重新開機
   <服務端主機>
   Win-R: regedit

   電腦\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RasMan:
     編輯/新增/DWORD(32位元)值:
              數值名稱: SvcHostSplitDisable
              數值資料: 1

   電腦\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RemoteAccess:
     編輯/新增/DWORD(32位元)值:
              數值名稱: SvcHostSplitDisable
              數值資料: 1

   開始/電源/重新啟動


【症狀2】 由於不明原因,路由及遠端存取服務正常執行中,但是vpn服務的1723埠卻未受監聽,造成客戶端連線失敗
   <服務端主機>
   Win-R: cmd
     > netstat -ap tcp
     ...
     TCP    [::]:623               :0                  LISTENING
     TCP    [::]:3389              :0                  LISTENING
     ...
     漏掉tcp 1723埠號沒有服務監聽

   --
   本機/管理/服務與應用程式/服務:
     名稱: Routing and Remote Access
     狀態: 執行中
   --
   控制台/網路和網際網路/網路和共用中心/變更介面卡設定:
     名稱: 連入連線
     狀態: 沒有用戶端連線
   
   <客戶端主機>
   開始/設定/網路和網際網路/VPN/連線名稱/連線
   出現如下畫面:
      無法連線
      因為嘗試的VPN通道失敗,未建立遠端連線。可能無法連線到VPN伺服器。
      若此連線嘗試使用L2TP/IPsec通道,可能是因為未正確設定IPsec交涉所需的安全性參數。
      [關閉]

解法: 服務端主機不要勾選[電源關機]設定的[開啟快速啟動]選項,再重新開機

   <服務端主機>
   控制台/硬體和音效/電源選項/選擇按下電源按鈕時的行為/關機設定:
      去掉勾選: 開啟快速啟動(建議選項)

   開始/電源/重新啟動


參考:
1.Q:RRAS unable to start service (Windows 10)
  微軟承認有此問題,並打算在未來版本更新中修正,目前只能採用其建議的解法應急。

2.Incoming VPN connection not working on Windows 10, PPTP port 1723 not listened

3.若【控制台/網路和網際網路/網路和共用中心/變更介面卡設定】看不到【檔案】選項,可按ALT鍵或如下解開:
 檔案總管/檔案/變更資料夾和搜尋選項/檢視
  勾選【一律顯示功能表】

2017年7月28日 星期五

steps for setting up an osm-style map server from OsmHackTW

在 GitHub 開源平台上,OsmHackTW 提供許多台灣相關的地圖資源。
其中,openstreetmap-tiles-docker 專案利用docker容器建立本地端開放街圖標準樣式的台灣地圖服務。
以下介紹如何快速建立此服務映像檔及啟動服務的方法:

1.下載映像檔製作環境
  利用瀏覽器連線到網址 https://github.com/sekewei/openstreetmap-tiles-docker
    點選 【Clone or Download / Download ZIP】,將下載的壓縮環境檔解開

  若有安裝 git 開發環境,也可使用下列 git 指令下載製作環境
    git clone https://github.com/sekewei/openstreetmap-tiles-docker.git

2.製作地圖服務映像檔
  進入製作環境的資料夾,利用如下 docker 指令製作地圖服務映像檔
    cd openstreetmap-tiles-docker
    docker build -f ./Dockerfile -t twstd:latest .

3.初始化地圖資料庫
3.1.啟動容器,執行資料庫初始化腳本
    docker run -it -v /docker/osm-postgresql:/var/lib/postgresql --name twstd twstd:latest /bin/bash
    cd /usr/local/sbin/
    ./run initdb
    ./run startdb
    ./run createuser
    ./run createdb

3.2.下載台灣地圖資料,匯入資料庫
    wget -O /data/import.pbf http://download.geofabrik.de/asia/taiwan-latest.osm.pbf
    ./run import

3.3.含圖資存成新版映像檔
    暫時跳離容器終端機可使用 Ctrl-p + Ctrl-q
    docker commit -m full_loaded twstd twstd:latest

4.啟動地圖服務容器
  利用如下指令啟動地圖服務容器
   docker run -it -p 80:80 -v /docker/osm-postgresql:/var/lib/postgresql --name twstd twstd:latest
   cd /usr/local/sbin/
   ./run startservices

5.測試地圖服務
  利用瀏覽器連線到本地主機80號埠測試地圖服務,點選'本地街圖'選項
    http://localhost

6.更新圖資
  利用如下指令來更新台灣區地圖資料
   docker attach twstd
   cd /usr/local/sbin/
   ./run startdb       # 若執行updatemap出現資料庫連線錯誤,須先啟動資料庫
   ./run updatemap
   Ctrl-p + Ctrl-q

註: 
1. 此服務的設計,利用-v參數將容器內地圖資料庫目錄 /var/lib/postgresql 
   連結到主機目錄/docker/osm-postgresql,方便主機獨立維護圖資。

2. 如下兩個台灣地圖服務專案的差異為地圖樣式不同:
     開放街圖標準樣式: https://github.com/sekewei/openstreetmap-tiles-docker
     開放街圖明亮樣式: https://github.com/sekewei/docker-opentileserver

2017年7月27日 星期四

how to set up auto hibernation and wakeup for windows

若想讓Windows系統每日定時開關機器,可利用【工作排程器】進行設定,
其步驟如下:

(1) 允許休眠: 以管理員身份利用命令列指令 powercfg -h on

(2) 遇啟動失敗不要自動重新啟動:
     【本機/內容/進階系統設定/進階/啟動及修復/設定/系統失敗:】
  去掉勾選: 自動重新啟動

(3) 何時開關機器:
     【本機/管理/系統工具/工作排程器/工作排程器程式庫】
 每日休眠: 24:00 shutdown /h /t 300 -c "daily hibernate"
 每日甦醒: 08:00 cmd dir \Windows\Tasks\

註: 上述每日甦醒設定對某些電腦無效,例如: Dell T3600

how to create and import courses in moodle?

使用moodle教學平台,常有建立新課程及匯入舊課程的需求,
其操作步驟如下:

(1) 建立新課程的方法:
    點選【管理/網站管理/課程/管理課程和類別/其它/建立新課程】
    填入以下欄位:
 課程全名:
 課程簡稱:
 課程類別:
 課程開始日期:
 課程摘要:
 課程格式:  主題格式/週次格式
 週數/主題數:

(2) 匯入舊課程的方法:
    先進入目前課程,點選【管理/課程管理/匯入/選擇課程: 舊課程名稱】
 再點選【繼續/下一個.../執行匯入】

註1: 管理/課程管理/備份(backup): 將目前為止的課程內容存成壓縮檔,供當機或換機還原之用
    管理/課程管理/還原(restore): 將以前存下的課程內容,以合併或覆寫方式還原到目前課程
    管理/課程管理/匯入(import): 將以前類似課程內容,匯入到目前課程之後,供修改之參考

註2: 大量新增學生加入課程方法:
      管理/網站管理/用戶/帳戶/批次建立用戶:
          username, password, firstname, lastname, email, lang, idnumber, maildisplay, course1, group1
          403612345, 403612345, 王小明, 403612345, 403612345@mail.xx.edu.tw, zh_tw, 403612345, 0, 106-1-DS, 2
          403654321, 403654321, 葉大同, 403654321, 403654321@mail.xx.edu.tw, zh_tw, 403654321, 0, 106-1-DS, 3
      其中,如下前5個欄位必填,其餘可選。 course1為加入的【課程簡稱】。
          username, password, firstname, lastname, email 
      若遇username已存在,帳戶不再重建,直接加入課程。

註3: 若新課程無法添加用戶,可以設定手動選課如下
      點選【管理/課程管理/用戶/選課方式/新增方式: 手動選課】

註4: 統計學生平台使用度方法如下:
      點選【管理/報表/日誌】,選擇: 所有參與者,所有日期,所有活動,所有動作,
      以Excel檔案格式下載,下載這些日誌,儲存,另存新檔。
      再用Excel開日誌,依用戶名作筆數統計。

2017年6月26日 星期一

How to use QNAP NAS as a desktop frontend?

當手邊缺乏靜音電腦當前端桌面時,若有提供HDMI接頭的NAS連網儲存設備,也可當成前端桌面使用。
以QNAP公司的連網儲存產品HS-251+為例,其當成前端桌面作法如下:

1.硬體接線: 將螢幕、鍵盤、滑鼠接到NAS
     將HS-251+設備的HDMI接頭接到螢幕,同時接上USB滑鼠及鍵盤

2.NAS安裝HD Station桌面軟體及Chrome瀏覽器:
     進入HS-251+的網頁管理介面,選擇
       控制台/應用服務/HybridDesk Station混合桌面工作站: 啟動
                      /HD Station套件: 安裝 Chrome 瀏覽器

3.主從兩桌面主機皆於Chrome瀏覽器安裝Chrome遠端桌面:
     利用chrome://apps網址,點選[線上應用程式商店],安裝[Chrome遠端桌面]
     當成桌面服務端的主機,要啟動我的電腦允許人在哪裏皆可取用桌面,設定PIN密碼
     當成桌面客戶端的主機,可點選服務端主機,輸入PIN密碼,連線取得遠方桌面
    
這樣NAS透過HD Station套件的Chrome遠端桌面,即可連線取得遠方主機的桌面

註: 目前HD Station套件尚未內建RDP客戶端軟體,故只能經由Chrome遠端桌面軟體,取得遠方Windows桌面

2017年5月17日 星期三

java right shift and and/or operators in comparison

⬛ >> versus >>>
 Java的位元運算有兩個很類似的右移運算子,目的是將其唯一的運算元進行往右的位元平移。
 當運算元為正時,兩者結果相同,分不出來;遇負數時,兩者結果才有差異。
 說明如下:

 邏輯右移運算子 >>>: number >>> bits; 表示將2進位數字右移bits位元,左邊補0
 算術右移運算子 >> : number >> bits; 也表示將2進位數字右移bits位元,左邊保留目前符號位元

     例1: 對於負數,兩種位元右移結果的比較: >> versus >>>

        int n = -7;
        System.out.printf("n = %d (%x)\n",n,n);
        System.out.printf("n >> 2 = %d (%x)\n",n >> 2,n >> 2);
        System.out.printf("n >>> 2 = %d (%x)\n",n >>> 2, n >>> 2);

     則3行輸出如下:
        n = -7 (fffffff9)               // 二進位表示為 1111 1111  1111 1111  1111 1111  1111 1001
        n >> 2 = -2 (fffffffe)          // 二進位表示為 1111 1111  1111 1111  1111 1111  1111 1110
        n >>> 2 = 1073741822 (3ffffffe) // 二進位表示為 0011 1111  1111 1111  1111 1111  1111 1110
     其中,第一行二進位為原始數字;
          第二行運算將二進位數字往右平移2位元,左邊補目前符號位元1;
          第三行運算將二進位數字往右平移2位元,左邊補0

  註: 須要維持正負號的右移運算可用 >>
  註: 不補符號位元的右移運算可用 >>>
  註: 至於左移運算子,因為右邊永遠補0,沒有其他選擇,所以只有一種 << 運算子


⬛ & versus &&  as well as  | versus ||
 Java的且及或運算也各有很接近的運算子,其說明如下:

 邏輯且:  b = bool_1    &&  bool_2;     // 有短路求值,遇bool_1假,不看bool_2值,一律回傳假
 位元且:  b = bool_1     &  bool_2;     // 無短路求值
         n = number_1   &  number_2; 

 邏輯或:  b = bool_1    ||  bool_2;     // 有短路求值,遇bool_1真,不看bool_2值,一律回傳真
 位元或:  b = bool_1     |  bool_2;     // 無短路求值
         n = number_1   |  number_2;

     例2: 對於數字及布林值,兩種【且】運算的比較: & versus &&

        System.out.printf("true &   false    = %b\n", true & false);
        System.out.printf("true &&  false    = %b\n", true && false);
        System.out.printf("1100 &   0101     = %x\n", 0b1100 & 0b0101);
      //System.out.printf("1100 &&  0101     = %d\n", 0b1100 && 0b0101);

     則3行輸出如下:
        true &   false    = false
        true &&  false    = false
        1100 &   0101     = 4        // 二進位表示 為0100
     其中,第一行兩布林值進行【位元且】運算,只當兩布林值同時為真時才為真,故得到假;
          第二行兩布林值進行【邏輯且】運算,只當兩布林值同時為真時才為真,故得到假;
          第三行兩數字進行【位元且】運算,只留下兩數字同時為1的位元才為1,故得到0100=4。
     另外,第四行語法不允許兩數字進行【邏輯且】運算,故註解起來。


     例3: 對於數字及布林值,兩種【或】運算的比較: | versus ||

        System.out.printf("true |   false    = %b\n", true | false);
        System.out.printf("true ||  false    = %b\n", true || false);
        System.out.printf("1100 |   0101     = %x\n", 0b1100 | 0b0101);
      //System.out.printf("1100 ||  0101     = %d\n", 0b1100 || 0b0101);

     則3行輸出如下:
        true |   false    = true
        true ||  false    = true
        1100 |   0101     = d        // 二進位表示 為1101
     其中,第一行兩布林值進行【位元或】運算,只當兩布林值同時為假時才為假,故得到真;
          第二行兩布林值進行【邏輯或】運算,只當兩布林值同時為假時才為假,故得到真;
          第三行兩數字進行【位元或】運算,只留下兩數字同時為0的位元才為0,故得到1101=13=d。
     另外,第四行語法不允許兩數字進行【邏輯或】運算,故註解起來。


     例4: 對於布林值,短路求值與否的【且】運算比較: & versus &&

         b = b1 = b2 = true;
         b = (b1=false) & (b2=false); 
         System.out.printf("no short circuit evaluation: b:%b, b1:%b, b2:%b\n",b,b1,b2);
         b = b1 = b2 = true;
         b = (b1=false) && (b2=false); 
         System.out.printf("use short circuit evaluation:b:%b, b1:%b, b2:%b\n",b,b1,b2);

     則2行輸出如下:
         no short circuit evaluation: b:false, b1:false, b2:false
         use short circuit evaluation:b:false, b1:false, b2:true
     其中,第一行輸出不作短路求值,所以b1及b2皆接收到false值;
          第二行輸出有作短路求值,所以b1接收回傳false值後,不須進行b2=false運算,就可判定b為假,故b2維持true值。


     例5: 對於布林值,短路求值與否的【或】運算比較: | versus ||

         b = b1 = b2 = false;
         b = (b1=true) | (b2=true); 
         System.out.printf("no short circuit evaluation: b:%b, b1:%b, b2:%b\n",b,b1,b2);
         b = b1 = b2 = false;
         b = (b1=true) || (b2=true); 
         System.out.printf("use short circuit evaluation:b:%b, b1:%b, b2:%b\n",b,b1,b2);

     則2行輸出如下:
         no short circuit evaluation: b:true, b1:true, b2:true
         use short circuit evaluation:b:true, b1:true, b2:false
     其中,第一行輸出不作短路求值,所以b1及b2皆接收到true值;
          第二行輸出有作短路求值,所以b1接收回傳true值後,不須進行b2=true運算,就可判定b為真,故b2維持false值。

  註: 數字的且/或運算只能用 &, |
  註: 條件式或布林值的且/或運算,若須要短路求值可用 &&, ||
  註: 條件式或布林值的且/或運算,若不須要短路求值可維持 &, |

參考: 
1.StackOverflow: Difference between >>> and >>
2.Wiki: Short Circuit Evaluation

2017年5月11日 星期四

how to create an auto-scoring assignment for network planning using cisco packet tracer

思科的封包追蹤模擬軟體Packet Tracer可以自動評分,
適合當成網路規劃課程的練習、作業或小考題目。
其出題過程分成如下7階段:

0.Extensions/Activity Wizard/Password: 設定密碼

1.Answer Network/Show Answer Network: 建立答案版的網路拓樸

2.Instructions: 建立html標籤版的題目說明

3.Answer Network/Assessment Tree/Assessment Items
      勾選哪些設備的哪些設定要當評分項,配分多少
      宜勾選[X] Show Checked Only,只顯示勾選評分項的答案及配分,方便一目了然
      從Answer Network/Settings頁籤,可設定如下一種得分的回饋模式(Feedback Settings):
          No Dynamic Feedback          不回饋
          Show Score                   顯示答對的分數
          Show Item Count              顯示答對的評分項個數
          Show Score Percentage        顯示答對的分數百分比
          Show Item Count Percentage   顯示答對的評分項個數百分比 (預設值)
      從Answer Network/Settings頁籤,另可如下鎖定用戶基本資料(Name,Email),防止答案檔分享:
          [X] User Profile Locking     用戶必須綁定某基本資料,作答中不得再行變更,否則答案歸零
          [X] No Guest Profile         用戶不允許綁定預設訪客基本資料

4.Initial Network/Copy from Answer Network
      先拷貝答案拓樸,再刪除設定值或連線,留下初始網路拓樸
      設定喜好
          Options/Preferences:
            Interface/Customize User Experience:
              .....
              Show Device Name Labels
              .....
              Disable Auto Cable
              Use Metric System (Uncheck to use Imperial)
              Show Link Lights
              .....
              Show Port Labels When Mouse Over in Logical Workspace
              .....
            Hide/Customize User Experience:
              Hide Physical Tab
              .....
              Hide Router/Switch CLI Tab
              Hide Services Tab
              .....
              Hide Attributes Tab
              Hide Wireless/Cellular Connection
              Hide Legacy Equipment
              Show Wireless Grid
              Fill Wireless Grid With Pattern
              .....            
      設定哪些功能要鎖定
          Initial Network/Locking Options/Locking Items
              Interface
                Switching to Logical Workspace
                .....
                Preferences (Deprecated)
                Activity
                   View Assessment Items  註: 預設可查看評分項得分,若勾選表示不允許
                   .....
                   Check Results   註: 預設可按鈕查看活動成績(含評分項得分及連線測試),若勾選表示不允許
                   Reset Activity  註: 預設可重置回初始拓樸,若勾選表示不允許
                   .....
          Topology
              Global
                  Use Config Tab 註: 預設設備有組態頁籤,若勾選表示不允許
              Existing Devices
              Existing Annotations
              Clusters
              Remove Networks
              Physical Locations
          Simulation
              Global
              Existing Scenarios


5.Variable Manager: 建立IP/數字/字串的亂數範圍(Pool)及變數名稱(Variable),填入(1)~(4)中
      Seeds/Number/Strings/IP Addresses
      --
      (1) Answer Network/Show Answer Network的設備名稱可填入[[亂數變數名]]
      (2) Instructions的題目變動部份可填入[[亂數變數名]]
      (3) Answer Network/Assessment Tree/Assessment Items的評分項答案可填入[[亂數變數名]]
      (4) Initial Network/Show Initial Network的設備名稱可填入[[亂數變數名]]

6.複查題目初始為0,最後可達滿分方法:
      對一份完成題目,存檔名為my_1.pka,檢查步驟如下:
      (a) 打開題目,解開密碼,設定
              Answer Network/Settings: Show Item Count回饋模式
              Initial Network/Locking Items: View Assessment Items及Check Results不鎖定
          另存新檔名my_1_check0.pka

      (b) 利用如下操作,切換到答案拓樸
              Initial Network/Copy from Answer Network
          另存新檔名my_1_check100.pka

      (c) 打開my_1_check0.pka,檢查完成度是否為Completion: 0/?
          若非0,利用選單Check Activity/Check Results/Assessment Items看哪些評分項得分無法歸零
          記錄問題點

      (d) 打開my_1_check100.pka,檢查完成度是否為Completion: ?/?
          若非全拿,利用選單Check Activity/Check Results/Assessment Items看哪些評分項得分無法拿分
          記錄問題點

      (e) 將(c),(d)問題點的修正反應在my_1.pka,適當修改如下設定:
              Initial Network/Initial Network Setup: 可針對各評分項改變初始設定值
              Answer Network/Assessment Tree/Assessment Items: 可針對無法歸零或滿分的評分項放棄勾選,不列入評分
          另存新檔名my_2,pka,回到(a)進入下一輪修訂,直到題目初始為0,最後可達滿分為止
 
      註: 有時候因為未知原因,在設定5.亂數變數之後,原來無法歸零的評分項得分可以歸零列入評分
      註: 無線AP在發放DHCP時,常出現筆電接收不到訊息,造成無法為0或滿分,宜放棄筆電端評分項
      註: 由於Packet Tracer本身問題,有可能明明設定正確,卻無法滿分,這時只能割捨該評分項,不列入計分
 

2017年5月1日 星期一

weka.classifiers.functions.MultilayerPerceptron

weka.classifiers.functions.MultilayerPerceptron 為多層感知機學習器。
使用具備輸入層、隱藏層、及輸出層的類神經結構,以倒傳遞法學習各層之間的連結權重,於輸出層進行類別或數值預測。
若遇名目屬性,將先進行二值化處理再學習及預測。

參數說明:
 -L <learning rate> 依據下降梯度的多少百分比更新權重,稱為學習速率,介於[0,1]之間,預設值 0.3。
 
 -M <momentum> 參考上回權重更新量的多少百分比更新本回權重,稱為更新動量,介於[0,1]之間,預設值 0.2。
 
 -N <number of epochs> 訓練迭代次數,預設值 500。
 
 -V <percentage size of validation set> 連續變差終止訓練用的驗證集大小比例,介於[0,100],預設值0。
 
 -S <seed>  亂數產生器種子,值應>=0,預設值為0。
 
 -E <threshold for number of consequetive errors> 網路終止前驗證集允許的連續錯誤門檻,值應>0,預設值20。
 
 -G 開啟圖形介面,預設不開啟圖形介面。
  
 -A 不要自動建立網路連結,只在開啟圖形介面(-G)才有作用。
 
 -B 不要自動使用【名目轉成二元】屬性過濾器,預設使用【名目轉成二元】屬性過濾器。
 
 -H <comma seperated numbers for nodes on each layer> 建立網路的隱藏層。
       0表示不要隱藏層,預設值是a。決定隱藏層逐層的節點個數值可以是 
       i表示輸入層屬性個數, o表示輸出層類別數, t表示i+o總數, a表示i及o平均值。
  
 -C 不要對數值類別輸出作正規化,預設數值類別輸出會作正規化
  
 -I 不要對屬性輸入值作正規化,預設屬性輸入值會作正規化,名目屬性值將介於[-1,1]之間
  
 -R 不允許重設網路
  
 -D 學習速率會衰減,預設不衰減

>java -cp weka.jar;. weka.classifiers.functions.MultilayerPerceptron -t data\weather.numeric.arff
      -L 0.3 -M 0.2 -N 500 -V 0 -S 0 -E 20 -H a

Options: -L 0.3 -M 0.2 -N 500 -V 0 -S 0 -E 20 -H a


Sigmoid Node 0
    Inputs    Weights
    Threshold    -3.248835441689124
    Node 2    5.706344521860183
    Node 3    2.443270263208691
    Node 4    2.6425576499015655
    Node 5    2.5103414057156117
Sigmoid Node 1
    Inputs    Weights
    Threshold    3.247940047055843
    Node 2    -5.7047440571074866
    Node 3    -2.3959635449403223
    Node 4    -2.61941341516743
    Node 5    -2.57892674553124
Sigmoid Node 2
    Inputs    Weights
    Threshold    -1.4298110453038173
    Attrib outlook=sunny    1.2796074137730873
    Attrib outlook=overcast    2.5993304643376662
    Attrib outlook=rainy    -2.482189408449902
    Attrib temperature    -0.991784436689735
    Attrib humidity    -4.132575972523981
    Attrib windy    -0.8030823939514043
Sigmoid Node 3
    Inputs    Weights
    Threshold    -0.7740672340804496
    Attrib outlook=sunny    -1.9100370742566128
    Attrib outlook=overcast    2.3822068707682824
    Attrib outlook=rainy    0.2349921312574373
    Attrib temperature    -0.8639638424331715
    Attrib humidity    -0.8117295111072012
    Attrib windy    3.0923597946788437
Sigmoid Node 4
    Inputs    Weights
    Threshold    -0.7812523749731839
    Attrib outlook=sunny    -2.0149350612947305
    Attrib outlook=overcast    2.4850160661055654
    Attrib outlook=rainy    0.2429746779978898
    Attrib temperature    -0.9010443938018432
    Attrib humidity    -0.8326891162034927
    Attrib windy    3.255120039808521
Sigmoid Node 5
    Inputs    Weights
    Threshold    -0.7574102682219431
    Attrib outlook=sunny    -1.9605922799976891
    Attrib outlook=overcast    2.481930135373603
    Attrib outlook=rainy    0.2838381715677166
    Attrib temperature    -0.8613350411165092
    Attrib humidity    -0.775628050353589
    Attrib windy    3.169910152935346
Class yes
    Input
    Node 0
Class no
    Input
    Node 1

註: 學到的神經網路如下圖,其中,黃色兩個節點由上而下分別為Node 0, Node 1。
   紅色4個節點由上而下分別為Node 2, Node 3, Node 4, Node 5。
   隱藏層會有4個節點的理由為參數-H a,而 a=(i + o)/2=(6 + 2)/2=4。
Time taken to build model: 0.1 seconds Time taken to test model on training data: 0.01 seconds === Error on training data === Correctly Classified Instances 14 100 % Incorrectly Classified Instances 0 0 % Kappa statistic 1 Mean absolute error 0.036 Root mean squared error 0.0454 Relative absolute error 7.7533 % Root relative squared error 9.4618 % Total Number of Instances 14 === Confusion Matrix === a b <-- classified as 9 0 | a = yes 0 5 | b = no === Stratified cross-validation === Correctly Classified Instances 11 78.5714 % Incorrectly Classified Instances 3 21.4286 % Kappa statistic 0.5116 Mean absolute error 0.265 Root mean squared error 0.4627 Relative absolute error 55.6497 % Root relative squared error 93.7923 % Total Number of Instances 14 === Confusion Matrix === a b <-- classified as 8 1 | a = yes 2 3 | b = no 如下 weather.numeric.arff 案例集的14個案例利用2個文字屬性及2個數字屬性,預測文字屬性。
outlooktemperaturehumiditywindyplay
sunny8585FALSEno
sunny8090TRUEno
rainy6570TRUEno
sunny7295FALSEno
rainy7191TRUEno
overcast8386FALSEyes
rainy7096FALSEyes
rainy6880FALSEyes
overcast6465TRUEyes
sunny6970FALSEyes
rainy7580FALSEyes
sunny7570TRUEyes
overcast7290TRUEyes
overcast8175FALSEyes
參考: 1.weka.classifiers.functions.MultilayerPerceptron code | doc

2017年4月23日 星期日

weka.classifiers.bayes.BayesNet

weka.classifiers.bayes.BayesNet 為貝氏網路學習器,
可克服屬性之間相關性,學得貝氏網路結構及其機率表,以進行類別預測。
若遇數值屬性,將先進行離散化後再學習。

參數說明:
 -B <BIF file> 供結構比對之用的貝氏網路描述檔,副檔名.bif。預設無。

 -D  不要使用ADTree資料結構,較省記憶體,但跑較慢。預設使用,較耗記憶體,但跑較快。

 -Q <weka.classifiers.bayes.net.search.searchAlgorithm> 結構學習演算法。
    -- 條件獨立法
     weka.classifiers.bayes.net.search.ci.CISearchAlgorithm
     weka.classifiers.bayes.net.search.ci.ICSSearchAlgorithm
    -- 採用固定結構
     weka.classifiers.bayes.net.search.fixed.FromFile  外部檔案結構
     weka.classifiers.bayes.net.search.fixed.NaiveBayes  簡單貝氏結構
    -- 全域法,-S LOO-CV 預設值表示選用留一法交叉驗證決定好壞
     weka.classifiers.bayes.net.search.global.GeneticSearch
     weka.classifiers.bayes.net.search.global.HillClimber
     weka.classifiers.bayes.net.search.global.K2
     weka.classifiers.bayes.net.search.global.SimulatedAnnealing
     weka.classifiers.bayes.net.search.global.TabuSearch
     weka.classifiers.bayes.net.search.global.TAN
    -- 區域法,-S BAYES 預設值表示選用Bayes評分指標決定好壞
     weka.classifiers.bayes.net.search.local.GeneticSearch
     weka.classifiers.bayes.net.search.local.HillClimber
     weka.classifiers.bayes.net.search.local.K2 (-P 1 表示親節點個數限制1個)
     weka.classifiers.bayes.net.search.local.SimulatedAnnealing
     weka.classifiers.bayes.net.search.local.TabuSearch
     weka.classifiers.bayes.net.search.local.TAN
     預設值weka.classifiers.bayes.net.search.local.K2。

 -E <weka.classifiers.bayes.net.estimate.estimateAlgorithm> 機率表學習演算法。
     weka.classifiers.bayes.net.estimate.BayesNetEstimator
     weka.classifiers.bayes.net.estimate.BMAEstimator
     weka.classifiers.bayes.net.estimate.MultinomialBMAEstimator
     weka.classifiers.bayes.net.estimate.SimpleEstimator (-A 0.5 表示初始機率值0.5)
     預設值weka.classifiers.bayes.net.estimate.SimpleEstimator。


>java -cp weka.jar;. weka.classifiers.bayes.BayesNet -t data\weather.nominal.arff
    -D 
    -Q weka.classifiers.bayes.net.search.local.K2 -- -P 1 -S BAYES 
    -E weka.classifiers.bayes.net.estimate.SimpleEstimator -- -A 0.5

Options: -D -Q weka.classifiers.bayes.net.search.local.K2 -- -P 1 -S BAYES -E weka.classifiers.bayes.net.estimate.SimpleEstimator -- -A 0.5


Bayes Network Classifier
not using ADTree
#attributes=5 #classindex=4
Network structure (nodes followed by parents)
outlook(3): play
temperature(3): play
humidity(2): play
windy(2): play
play(2):
LogScore Bayes: -69.07317135664013
LogScore BDeu: -83.46880542273107
LogScore MDL: -82.71568504897063
LogScore ENTROPY: -65.56181240647145
LogScore AIC: -78.56181240647145


Time taken to build model: 0.02 seconds Time taken to test model on training data: 0 seconds === Error on training data === Correctly Classified Instances 13 92.8571 % Incorrectly Classified Instances 1 7.1429 % Kappa statistic 0.8372 Mean absolute error 0.2615 Root mean squared error 0.3242 Relative absolute error 56.3272 % Root relative squared error 67.6228 % Total Number of Instances 14 === Confusion Matrix === a b <-- classified as 9 0 | a = yes 1 4 | b = no === Stratified cross-validation === Correctly Classified Instances 8 57.1429 % Incorrectly Classified Instances 6 42.8571 % Kappa statistic -0.0244 Mean absolute error 0.415 Root mean squared error 0.4909 Relative absolute error 87.1501 % Root relative squared error 99.5104 % Total Number of Instances 14 === Confusion Matrix === a b <-- classified as 7 2 | a = yes 4 1 | b = no 如下 weather.nominal.arff 案例集的14個案例有9個yes、5個no。
outlook temperature humidity windy play
sunny hot high FALSE no
sunny hot high TRUE no
rainy cool normal TRUE no
sunny mild high FALSE no
rainy mild high TRUE no
overcast hot high FALSE yes
rainy mild high FALSE yes
rainy cool normal FALSE yes
overcast cool normal TRUE yes
sunny cool normal FALSE yes
rainy mild normal FALSE yes
sunny mild normal TRUE yes
overcast mild high TRUE yes
overcast hot normal FALSE yes
參考: 1.weka.classifiers.bayes.BayesNet code | doc 2.weka.classifiers.bayes.net.search code | doc 3.weka.classifiers.bayes.net.estimate code | doc

2017年4月6日 星期四

how to build an osm map server for taiwan on docker

最近集眾人智慧的開放街圖(OpenStreetMap)很熱門,以下介紹一個簡便架設台灣區 OSM 地圖伺服器的方法。
前提是需先安裝 docker 容器環境,例如: Windows 10 上安裝 docker for windows 容器軟體。
有了 docker 容器環境之後,取圖資及架網站的步驟如下:

0.主機打開命令列工具,例如: Windows 10 的 powershell 命令列工具。


以下分成手動及自動安裝兩種說明,手動說明方便理解安裝步驟,自動說明方便快速安裝。

A.【手動安裝法】以下利用原始映像檔,手動建立新映像檔taiwan-osmbright:v1

1.主機下載 dmakan/ubuntu-opentileserver:v1 原始映像檔,啟動容器命名 twbright
    > docker pull dmakan/ubuntu-opentileserver:v1
    > docker run -t -i -p 80:80 --name twbright dmakan/ubuntu-opentileserver:v1
    註: -t for terminal, -i for interactive 表示取得容器的終端機互動視窗,可用 Ctrl-p Ctrl-q 退回主機
    註: -p host_port:container:port for port mapping 先主機埠,後容器埠,可將容器埠對應到主機埠,對外提供服務

2.容器修改 opentileserver.sh 批次檔,讓資料庫接受 utf8 文字編碼
    # vi /opentileserver/opentileserver.sh

    原始 if [ $(psql -Upostgres -c "select datname from pg_database" | grep -m 1 -c ${OSM_DB}) -eq 0 ]; then
    之前新增一行 psql -Upostgres -c "DROP DATABASE IF EXISTS ${OSM_DB};"

    原始 psql -Upostgres -c "create database ${OSM_DB} owner=${OSM_USER};"
    修改 psql -Upostgres -c "CREATE DATABASE ${OSM_DB} TEMPLATE template0 ENCODING 'UTF8' OWNER ${OSM_USER};"

    原始 CREATE EXTENSION hstore;
    修改 CREATE EXTENSION IF NOT EXISTS hstore;

    原始 CREATE EXTENSION postgis;
    修改 CREATE EXTENSION IF NOT EXISTS postgis;

    註: 要先刪除原有資料庫,再重新建立一個接受 utf8 統一碼的資料庫
    註: OSM_USER 預設資料庫用戶名為 tile,OSM_DB 預設資料庫名稱為 gis

3.容器執行 opentileserver.sh 批次檔,下載套件及圖資
    # cd /opentileserver/
    # ./opentileserver.sh web bright http://download.geofabrik.de/asia/taiwan-latest.osm.pbf

    註: 紅色州名/國名可替換成任何想提供服務的國家,詳http://download.geofabrik.de/
    註: geofabrik每日更新一次圖資,只要再執行 opentileserver.sh 批次檔,就重新下載最新圖資,覆寫原有資料庫內容

4.容器修改 OSMBright.xml 樣式檔,讓形狀檔路徑正確
   利用串流修改指令sed進行字串取代
    # sed -ie 's/pulated_places/pulated_places_simple/g' /usr/local/share/maps/style/OSMBright/OSMBright.xml

   或者利用編輯器vi進行修改
    # vi /usr/local/share/maps/style/OSMBright/OSMBright.xml

    原始 <Parameter name="file">
          <![CDATA[/usr/local/share/maps/style/osm-bright-master/shp/
                      ne_10m_populated_places/ne_10m_populated_places.shp]]>
        </Parameter>
    修改 <Parameter name="file">
          <![CDATA[/usr/local/share/maps/style/osm-bright-master/shp/
                      ne_10m_populated_places_simple/ne_10m_populated_places_simple.shp]]>
        </Parameter>

5.容器開啟資料庫,網站,圖磚服務
    # service postgresql restart
    # service apache2 restart
    # service renderd restart

6.主機開啟瀏覽器驗證
    http://localhost/openlayers-example.html

7.主機儲存容器內容為新映像檔,供下回使用
    > docker commit twbright taiwan-osmbright:v1   # 新映像檔命名 taiwan-osmbright:v1
    > docker stop twbright     # 關閉容器
    > docker rm twbright    # 刪除容器


8.主機利用新映像檔,開啟容器,仍命名為 twbright,提供地圖服務
    > docker run -i -t -p 80:80 --name twbright taiwan-osmbright:v1
    http://localhost:80/openlayers-example.html



B.【自動安裝法】以下利用Github映像檔製作環境包快速製作新映像檔taiwan-osmbright:v1

1.下載映像檔製作環境包
  利用瀏覽器連線到網址 https://github.com/sekewei/docker-opentileserver
  點選下載映像檔製作環境包 taiwan-osmbright_v1_build.tar.gz

2.製作地圖服務映像檔
  利用如下指令製作地圖服務映像檔,其中,- 表示映像檔製作環境取自導向(<)進來的環境包檔案,
    -f ./Dockerfile 表示製作步驟檔位於映像檔製作環境之路徑
  > docker build -f ./Dockerfile -t taiwan-osmbright:v1 - < taiwan-osmbright_v1_build.tar.gz

3.啟動地圖服務容器
  利用如下指令啟動服務容器,命名twbright,介接到主機80號埠
  > docker run -it -p 80:80 --name twbright taiwan-osmbright:v1
  按Ctrl-p + Ctrl-q跳出容器終端機

4.測試地圖服務
  利用瀏覽器連線到本地主機80號埠測試地圖服務
  http://localhost:80/openlayers-example.html

  註: 如果要修改初始地圖顯示位置為(lon,lat),方法如下:
        # vi /var/www/html/openlayers-example.html
            var toProjection   = new OpenLayers.Projection("EPSG:900913"); // spherical mercator projection
            var fromProjection = new OpenLayers.Projection("EPSG:4326"); // WGS 1984
            var position       = new OpenLayers.LonLat(lon,lat).transform(fromProjection, toProjection);
            var zoom           = 15;
            map.setCenter(position, zoom);

5.更新地圖資料
  利用如下指令連入容器終端機,執行腳本下載圖資,匯入資料庫,重新啟動服務
  > docker attach twbright
  # cd /opentileserver
  # sh ./reload-opentileserver.sh
  按Ctrl-p + Ctrl-q跳出容器終端機



C.【除錯資訊】以下為自動或手動建立新映像檔,啟動容器後的除錯要點:
0.本機進入容器的終端機 > docker attach twbright 

1.圖磚前景啟動 # sudo -u tile renderd -f -c /usr/local/etc/renderd.conf
     可確認字型檔 unifont.ttf 及形狀檔 ne_10m_populated_places_simple.shp 是否載入正確

2.圖磚快取位置 # ls /var/lib/mod_tile/default/
     可確認目錄下是否有.png圖磚產生

3.字型位置必須有unifont統一碼字型
     # ls /usr/share/fonts/truetype/unifont/unifont.ttf

4.資料庫設定檔必須驗證方式為trust才不必輸入密碼,如下:
     /etc/postgresql/9.3/main/pg_hba.conf
     local all all trust

5.資料庫驗證
     # psql -d gis -Utile   # 以用戶 tile 身份連入資料庫 gis
     gis=# \d         # 列出資料表
               List of relations
   Schema |        Name        | Type  |  Owner
  --------+--------------------+-------+----------
   public | geography_columns  | view  | postgres
   public | geometry_columns   | view  | tile
   public | planet_osm_line    | table | tile
   public | planet_osm_nodes   | table | tile
   public | planet_osm_point   | table | tile
   public | planet_osm_polygon | table | tile
   public | planet_osm_rels    | table | tile
   public | planet_osm_roads   | table | tile
   public | planet_osm_ways    | table | tile
   public | raster_columns     | view  | postgres
   public | raster_overviews   | view  | postgres
   public | spatial_ref_sys    | table | tile
  (12 rows)
 
     gis=# \d planet_osm_point  # 列出欄位
  osm_id             | bigint                 |
  access             | text                   |
  addr:housename     | text                   |
  addr:housenumber   | text                   |
  addr:interpolation | text                   |
  admin_level        | text                   |
  aerialway          | text                   |
  aeroway            | text                   |
  amenity            | text                   |
  area               | text                   |
  barrier            | text                   |
  bicycle            | text                   |
  brand              | text                   |
  bridge             | text                   |
  boundary           | text                   |
  building           | text                   |
  .....
  water              | text                   |
  waterway           | text                   |
  wetland            | text                   |
  width              | text                   |
  wood               | text                   |
  z_order            | integer                |
  way                | geometry(Point,900913) |

     gis=# select osm_id, name from planet_osm_point limit 10;  # 取10個點看中文名正確否
     osm_id   |   name
  ------------+-----------
     63252122 |
   1647048653 | 青屿
   1645249987 | 五膽島
   1645249985 | 四膽島
   1645249984 | 三膽島
   1645249983 | 二膽島
   1645249988 | 大膽島
   1645251414 | 獅球
   1645249986 | 大南礁
   1645249989 | 兔嶼

     gis=# select count(*) from planet_osm_point;  # 計算總共資料庫有幾個點
  count
--------
 198300
(1 row)

     gis=# \q         # 離開

2017年3月30日 星期四

revival of an installed cygwin system after change of os

Cygwin 是一個依附在 Windows 作業系統上的 Linux 作業系統,可以方便用戶同時享用兩者便利功能。
更換 Windows 作業系統後,若不想重灌 cygwin 系統,想利用原有安裝目錄資料,可參考如下復活法。
假設參數如下:
  舊根目錄 Root install directory: D:\Cygwin64
  舊套件目錄 Local package directory: D:\Install\Cygwin64
  新舊用戶名 Windows User Name: Old_User, New_User

1.利用安裝程式重建桌面終端機捷徑
    下載執行 Cygwin 安裝程式 setup-x86_64.exe (64位元)
    Choose a download source: Installed from local directory
    Select root install directory: Root directory: [D:\Cygwin64]
    Select local package directory: Local package directory: [D:\Install\Cygwin64]
    Select packages: Current
    不裝新套件,選[下一步],[完成]後,會在桌面產生 Cygwin64 Terminal

2.利用終端機重建用戶密碼檔
    點選桌面 Cygwin64 Terminal 右鍵,選擇 [以系統管理者身分執行(A)]
    以命令列指令重建用戶檔: mkpasswd -l > /etc/passwd

3.利用 Windows 檔案總管設定安裝目錄的用戶權限
    檔案總管開啟 D:\Cygwin64,按右鍵,點選 內容(R)/安全性/進階(V)

  a)設定新用戶為目錄擁有者
    點選 擁有者/變更(C): 請輸入物件名稱來選取(E): [New_User]/檢查名稱/確定

  b)設定新用戶對目錄擁有完全控制權限
    點選 權限項目: 主體: [Old_User]/移除(R)
     新增(D)/選取一個主體/請輸入物件名稱來選取(E): [New_User]/檢查名稱/確定
      類型: 允許
      套用到: 這個資料夾、子資料夾及檔案
      基本權限: 完全控制
      確定

註1: 若 ssh 對外連線時,出現個人憑證權限不可開放外界存取訊息,可設定如下:
      > chmod 0700 /home/NEW_USER/.ssh/id_*
    其中,針對如下3個個人憑證檔,需確定個人可讀 (有時要透過檔案總管安全性設定才能設定成功)。
          /home/NEW_USER/.ssh/id_dsa
          /home/NEW_USER/.ssh/id_rsa
          /home/NEW_USER/.ssh/identity

2017年3月29日 星期三

weka.classifiers.bayes.NaiveBayesSimple

weka.classifiers.bayes.NaiveBayesSimple 為簡單貝氏機率學習器的簡化版,
記錄各類別事前機率,及給定類別下各屬性值出現之條件機率,
再依案例,累乘得到給定屬性值下各類別出現之事後機率,取機率高者為預測類別,
可提供案例集不錯表現值供標竿比較之用。

NaiveBayesSimple 學習分類時,同樣為每個類別統計其類別事前機率(prior probability)、給定類別下各屬性值出現之條件機率。
遇數值屬性時,一律假設母體為常態分布,統計其平均值、標準差,供條件機率之推估。
預測分類時,依新案例,累乘得到給定屬性值下各類別出現之事後機率(posterior probability),取機率高者為預測類別。

參數說明:

出處: R. Duda and P. Hart (1973). Pattern Classification and Scene Analysis. Wiley, New York.

>java -cp simpleEducationalLearningSchemes.jar;weka.jar;. 
   weka.classifiers.bayes.NaiveBayesSimple -t data\weather.numeric.arff


Naive Bayes (simple)

Class yes: P(C) = 0.625

Attribute outlook
sunny   overcast        rainy
0.25            0.41666667      0.33333333

Attribute temperature
Mean: 73        Standard Deviation: 6.164414

Attribute humidity
Mean: 79.11111111       Standard Deviation: 10.21572861

Attribute windy
TRUE    FALSE
0.36363636      0.63636364



Class no: P(C) = 0.375

Attribute outlook
sunny   overcast        rainy
0.5             0.125           0.375

Attribute temperature
Mean: 74.6      Standard Deviation: 7.8930349

Attribute humidity
Mean: 86.2      Standard Deviation: 9.7313925

Attribute windy
TRUE    FALSE
0.57142857      0.42857143


Time taken to build model: 0.77 seconds
Time taken to test model on training data: 0 seconds

=== Error on training data ===

Correctly Classified Instances          13               92.8571 %
Incorrectly Classified Instances         1                7.1429 %
Kappa statistic                          0.8372
Mean absolute error                      0.3003
Root mean squared error                  0.3431
Relative absolute error                 64.6705 %
Root relative squared error             71.5605 %
Total Number of Instances               14


=== Detailed Accuracy By Class ===

                 TP Rate  FP Rate  Precision  Recall   F-Measure  MCC      ROC Area  PRC Area  Class
                 1.000    0.200    0.900      1.000    0.947      0.849    0.933     0.963     yes
                 0.800    0.000    1.000      0.800    0.889      0.849    0.933     0.925     no
Weighted Avg.    0.929    0.129    0.936      0.929    0.926      0.849    0.933     0.949


=== Confusion Matrix ===

 a b   <-- classified as
 9 0 | a = yes
 1 4 | b = no



=== Stratified cross-validation ===

Correctly Classified Instances           8               57.1429 %
Incorrectly Classified Instances         6               42.8571 %
Kappa statistic                         -0.0244
Mean absolute error                      0.4699
Root mean squared error                  0.5376
Relative absolute error                 98.6856 %
Root relative squared error            108.9683 %
Total Number of Instances               14


=== Detailed Accuracy By Class ===

                 TP Rate  FP Rate  Precision  Recall   F-Measure  MCC      ROC Area  PRC Area  Class
                 0.778    0.800    0.636      0.778    0.700      -0.026   0.444     0.636     yes
                 0.200    0.222    0.333      0.200    0.250      -0.026   0.444     0.398     no
Weighted Avg.    0.571    0.594    0.528      0.571    0.539      -0.026   0.444     0.551


=== Confusion Matrix ===

 a b   <-- classified as
 7 2 | a = yes
 4 1 | b = no


如下 weather.numeric.arff 案例集的14個案例利用2個文字屬性及2個數字屬性,預測文字屬性。
outlooktemperaturehumiditywindyplay
sunny8585FALSEno
sunny8090TRUEno
rainy6570TRUEno
sunny7295FALSEno
rainy7191TRUEno
overcast8386FALSEyes
rainy7096FALSEyes
rainy6880FALSEyes
overcast6465TRUEyes
sunny6970FALSEyes
rainy7580FALSEyes
sunny7570TRUEyes
overcast7290TRUEyes
overcast8175FALSEyes
參考: 1.weka.classifiers.bayes.NaiveBayesSimple code | doc 2.從Weka 3.7.2版之後,NaiveBayesSimple 類別 從 weka.jar 主套件改歸到 simpleEducationalLearningSchemes.jar 選擇性套件內, 可利用Tools/Package Manager/Search: simpleEducationalSchemes/Install進行安裝。 在Windows下,下載套件存放位置在 C:\Users\用戶名\wekafiles\packages\ 資料夾內。 simpleEducationalSchemes 包含IB1,Prism,Id3,NaiveBayesSimple四個簡單分類器

matlab backslash benchmarking on T3600 + Tesla C2075

Dell T3600 (CPU: Intel Xeon E5-1607, quad-core, 3GHz) +
(GPU: Tesla C2075, 14 MultiProcessor x 32 cores per MP = 448 cores, 1.15GHz)

>> paralleldemo_gpu_backslash
Warning: Support for GPU devices with Compute Capability 2.0 will be removed in a future MATLAB release.
To learn more about supported GPU devices, see www.mathworks.com/gpudevice. 
> In parallel.internal.gpu.selectDevice
  In parallel.gpu.GPUDevice.current (line 44)
  In gpuDevice (line 23)
  In paralleldemo_gpu_backslash (line 25) 

Starting benchmarks with 8 different single-precision matrices of sizes
ranging from 1024-by-1024 to 22528-by-22528.
Creating a matrix of size 1024-by-1024.
Gigaflops on CPU: 48.665627
Gigaflops on GPU: 88.271370
Creating a matrix of size 4096-by-4096.
Gigaflops on CPU: 100.882839
Gigaflops on GPU: 413.998827
Creating a matrix of size 7168-by-7168.
Gigaflops on CPU: 118.687441
Gigaflops on GPU: 509.776228
Creating a matrix of size 10240-by-10240.
Gigaflops on CPU: 133.868299
Gigaflops on GPU: 573.530695
Creating a matrix of size 13312-by-13312.
Gigaflops on CPU: 139.691629
Gigaflops on GPU: 599.239014
Creating a matrix of size 16384-by-16384.
Gigaflops on CPU: 137.981033
Gigaflops on GPU: 611.514780
Creating a matrix of size 19456-by-19456.
Gigaflops on CPU: 143.995683
Gigaflops on GPU: 620.246637
Creating a matrix of size 22528-by-22528.
Gigaflops on CPU: 149.399225
Gigaflops on GPU: 628.924035

Starting benchmarks with 6 different double-precision matrices of sizes
ranging from 1024-by-1024 to 16384-by-16384.
Creating a matrix of size 1024-by-1024.
Gigaflops on CPU: 29.380086
Gigaflops on GPU: 63.980649
Creating a matrix of size 4096-by-4096.
Gigaflops on CPU: 48.082489
Gigaflops on GPU: 227.926438
Creating a matrix of size 7168-by-7168.
Gigaflops on CPU: 61.270138
Gigaflops on GPU: 270.644244
Creating a matrix of size 10240-by-10240.
Gigaflops on CPU: 64.503818
Gigaflops on GPU: 291.146412
Creating a matrix of size 13312-by-13312.
Gigaflops on CPU: 68.655104
Gigaflops on GPU: 300.565164
Creating a matrix of size 16384-by-16384.
Gigaflops on CPU: 56.189737
Gigaflops on GPU: 302.010177

ans = 

  struct with fields:

         sizeSingle: [1024 4096 7168 10240 13312 16384 19456 22528]
    gflopsSingleCPU: [48.6656 100.8828 118.6874 133.8683 139.6916 137.9810 143.9957 149.3992]
    gflopsSingleGPU: [88.2714 413.9988 509.7762 573.5307 599.2390 611.5148 620.2466 628.9240]
         sizeDouble: [1024 4096 7168 10240 13312 16384]
    gflopsDoubleCPU: [29.3801 48.0825 61.2701 64.5038 68.6551 56.1897]
    gflopsDoubleGPU: [63.9806 227.9264 270.6442 291.1464 300.5652 302.0102]
Single precision GFlops
Double precision GFlops
Speedup

2017年3月24日 星期五

missing font display in ms word

當你在使用中文繁體Windows作業系統時,若突然發現怎麼純文字檔(.txt)的中文碼亂掉或Office的標楷體,細明體消失,出現楷体、DFKai-SB、PMinLiU等字型,這時別慌,你的繁體字型都還在,只是顯示不出來。只要修改如下位置的設定,一切就回復成繁體原狀。

    [控制台 / 時鐘、語言和區域 / 語言 / 系統管理 / 非Unicode程式的語言 / 變更系統地區設定(C)...]

將目前的系統地區設定由 [中文(簡體、中國)] 改為 [中文(繁體、台灣)],然後選擇 [立即重新啟動] 。

    註解:
  1.  Unicode字碼可同時顯示多國語言,但為了容舊,繁體中文Windows純文字檔仍使用Big5字碼,所以當非Unicode語言設定成簡體GB字碼時,原來的純文字檔顯示就變亂碼。
  2.  Office字型名稱的顯示會依據 [非Unicode程式的語言] 設定而決定。當正常設定為繁體時,DFKai-SB會顯示成標楷體、PMinLiU會顯示成細明體。所以當不知何原因被切換成簡體時,就顯示其英文名。至於楷体是簡體字型,在設定回復為繁體後,就顯示其英文名KaiTi。
  3. 常見漢字字型如下: 繁體中文字型有細明體(MinLiU) 、新細明體(PMinLiU)、標楷體(DFKai-SB)、微軟正黑體(Microsoft JhengHei);簡體中文字型有宋体(SimSun)、新宋体(NSimSun)、仿宋(FangSong)、楷体(KaiTi)、黑体(SimHei)、微软雅黑(Microsoft YaHei)、等线(DengXian);日文字型有明朝體(MS Mincho)、黑體(MS Gothic)。

2017年3月11日 星期六

benefits of installing guest additions in virtualbox guest os

電腦主機可以安裝虛擬機軟體VirtualBox,在主機上建立虛擬硬體層,
其上再安裝諸多客戶作業系統,同時間跑多個作業系統。
為了提升用戶體驗,VirtualBox同時提供客戶補充包(Guest Additions)套件,
若將其安裝在客戶作業系統上,使用起來會更上手,其具體好處如下:

1.滑鼠指標整合
    在客戶作業系統安裝滑鼠驅動器,進出視窗點選內容,不必再按主機鍵(右邊Ctrl鍵)跳出

2.共用資料夾
    可指定主機某資料夾分享給客戶作業系統,自動掛載顯示在桌面,
      Windows: 自動多一台磁碟機
      Linux: /media/sf_sharename
             用戶要對其讀寫須加入vboxsf群組

    或手動設定掛載點:
      Windows: net use x: \\vboxsvr\sharename
      Linux: mount -t vboxsf [-o OPTIONS] sharename mountpoint
          或 vi /etc/fstab
             sharename   mountpoint   vboxsf   defaults  0   0

3.共用剪貼簿
    主機和客戶系統可共用剪貼簿

4.檔案拖放
    主機和客戶系統可拖放檔案

5.較佳視訊支援
    支援更多非標準視訊模式,方便任意調整視窗大小

6.無縫視窗
    利用主機鍵(右邊Ctrl鍵)+"L"切換,可讓虛擬機桌面放大到主機桌面並且隱藏虛擬機桌面背景。
    這樣虛擬機桌面的視窗感覺就像主機桌面的視窗

7.時間同步
    確保客戶系統時間和主機相同.

8.通用主機客戶通訊管道
    方便主機控制和監看客戶系統

9.自動登入(傳送憑證)
    須透過複雜設定才能自動登入Windows或Linux系統

10.記憶體汽球調整及合併
    利用汽球調整(ballooning)及合併(fusion)技術,讓客戶系統間記憶體互相支援及共用,減少主機記憶體負荷

參考: https://www.virtualbox.org/manual/ch04.html#idm1721

2017年3月9日 星期四

weka.classifiers.rules.DecisionTable

 
weka.classifiers.rules.DecisionTable 為決策表學習器,適用於類別/數值預測。
預設利用最佳優先(登山)搜尋法,以交叉驗證之準確率或均方差為指標,找出最佳的屬性子集合。
然後,將訓練案例集縮減為只用留下的屬性子集合描述。
視每個案例為一條規則,其前件由留下屬性值組成,其後件則為多數決類別或平均值。
預測時若新案例有符合某規則之前件,則依其後件進行預測。
若遇決策表未涵蓋新案例,則使用k最近鄰居法,或背景多數決法作預測。

參數說明:
-X  crossVal: [1] 交叉驗證切割組數,1表只保留一測試案例,餘供訓練
-I  useIBk: [false] 遇未涵蓋新案例,使用k最近鄰居法,否則使用多數決法
-R  displayRules: [false] 列印決策表
-E  evaluationMeasure: [acc 或 rmse] 最佳指標遇類別採用準確率,遇數值採用均方差
                       其他指標還有  mae , auc
-S  search: [weka.attributeSelection.BestFirst] 子集合搜尋策略

  -- 以下為搜尋策略的參數 --

-D  direction: [1] 0表向後屬性變少,1表向前屬性變多,3表雙向
-S  lookupCacheSize: [1] 保留候選子集合的個數為案例集屬性個數的多少倍
-N  searchTermination: [5] 放棄搜尋前,能忍受指標無進步之試走步數
-P  startSet: [] 找尋初始點的屬性子集合,預設為空集合

參考: 
    kohavi-ecml-95-the power of decision tables

> java weka.classifiers.rules.DecisionTable -R -t data\weather.nominal.arff


Options: -R 

Decision Table:

Number of training instances: 14
Number of Rules : 1
Non matches covered by Majority class.
 Best first.
 Start set: no attributes
 Search direction: forward
 Stale search after 5 node expansions
 Total number of subsets evaluated: 12
 Merit of best subset found:   64.286
Evaluation (for feature selection): CV (leave one out) 
Feature set: 5

Rules:
================
play  
================
yes
================



Time taken to build model: 0 seconds
Time taken to test model on training data: 0 seconds

=== Error on training data ===

Correctly Classified Instances           9               64.2857 %
Incorrectly Classified Instances         5               35.7143 %
Kappa statistic                          0     
Mean absolute error                      0.4524
Root mean squared error                  0.4797
Relative absolute error                 97.4359 %
Root relative squared error            100.0539 %
Total Number of Instances               14     


=== Confusion Matrix ===

 a b   <-- classified as
 9 0 | a = yes
 5 0 | b = no



=== Stratified cross-validation ===

Correctly Classified Instances           6               42.8571 %
Incorrectly Classified Instances         8               57.1429 %
Kappa statistic                         -0.3659
Mean absolute error                      0.5318
Root mean squared error                  0.5583
Relative absolute error                111.6786 %
Root relative squared error            113.1584 %
Total Number of Instances               14     


=== Confusion Matrix ===

 a b   <-- classified as
 6 3 | a = yes
 5 0 | b = no

如下 weather.nominal.arff 案例集的14個案例有9個yes、5個no。
outlooktemperaturehumiditywindyplay
sunnyhothighFALSEno
sunnyhothighTRUEno
rainycoolnormalTRUEno
sunnymildhighFALSEno
rainymildhighTRUEno
overcasthothighFALSEyes
rainymildhighFALSEyes
rainycoolnormalFALSEyes
overcastcoolnormalTRUEyes
sunnycoolnormalFALSEyes
rainymildnormalFALSEyes
sunnymildnormalTRUEyes
overcastmildhighTRUEyes
overcasthotnormalFALSEyes
參考:
1.weka.classifiers.rules.DecisionTable
   code | doc

2017年1月19日 星期四

docker command line summary

docker command line summary
===========================

image: a read-only file system consisting of a base layer and a series of difference layers
container: a writable file system consisting of an image and a top writable layer with network and volume hooks

an image has id, name, tag, read-only_layers, entrypoint, and cmd
a container has id, name, source_image, writable_layer, overwrite_cmd,
  cpu_limit, memory_limit, volume_hook, network_hook, and state (active/un-active)

what docker can do with images in a local image store
  -- creation --
  - import/export with docker hub
   search in a docker hub (docker search)
   pull from a docker hub (docker pull)
   push to a docker hub (docker push)
  - import/export with local filesystem
   load from a local file (docker load)
   save to a local file (docker save)
  - born from scratch
   commit an un-active container to create an image (docker commit)
   build an image with Dockerfile instructions (docker build)
 
  -- management --
  list (docker images)
  remove (docker rmi)

what docker can do with containers in a local container store
  -- creation -- 
   create an un-active container from an image (docker create)
   run from an image with an overwrite command (docker run)
   execute a command (docker exec)

  -- management
   stop an active container with a grace period (docker stop)
   kill an active container (docker kill)
   start an un-active container (docker start)
   restart an active container (docker restart = docker stop + docker start)
  -
   copy with local filesystem (docker cp)
  -
   attach the console to a container (docker attach)
  -
   commit an un-active container to create an image (docker commit)
  -
   list (docker ps [-a])
   remove (docker rm [-f])

an image runs a new container with an overwrite command
= an image creates a new container + the container starts with an overwrite command

a container is created when docker creates from an image or runs from an image with an overwrite command
an image is created when docker commits a container or builds from a base image and a Dockerfile

#
#
# image operation
#
#

#### search for an image
docker search image_keyword

#### download an image
docker pull [registry.hub.docker.com/]image_path[:tag] 

#### list images in local drive
docker images [image_path]

#### create new images
1.docker commit -m "submit message" -a "submit user" container_id image_path[:tag]

 $ vi ./Dockerfile
 # This is a comment
 FROM ubuntu:14.04
 MAINTAINER Docker Newbee <newbee docker.com="">
 RUN apt-get -qq update
 RUN apt-get -qqy install ruby ruby-dev
 RUN gem install sinatra
 # put my local web site in myApp folder to /var/www
 ADD myApp /var/www
 # expose httpd port
 EXPOSE 80
 # the command to run
 CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]

2.docker build -t="image_path:tag" .  

3.cat ubuntu-14.04-x86_64-minimal.tar.gz  | docker import - ubuntu:14.04

4.docker tag container_id image_path:new_tag

#### upload an image
docker push image_path # all tags

#### save and load an image as local file 
docker save -o ubuntu_14.04.tar ubuntu:14.04

docker load --input ubuntu_14.04.tar
docker load < ubuntu_14.04.tar

#### remove a local image
docker rmi image_path

#
#
# container operation
#
#

#### start and run a container with an image
docker run [-name container_name] ubuntu:14.04 /bin/echo 'Hello world'
docker run -t -i ubuntu:14.04 /bin/bash   ### start a container in interactive mode
docker start ubuntu:14.04

docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
docker ps [-a]     ### list containers, [all, inclusive of un-active containers]
docker logs insane_babbage

#### start and stop container
docker restart
docker stop
docker run -idt ubuntu
docker attach container_name

#### start a shell in a container, detach from it, and re-attach to it
docker exec -it container_name /bin/bash
# use Ctrl-p + Ctrl-q to detach from the container
docker attach container_name

#### import and export container 
docker export container_id > snapshot.tar
cat snapshot.tar | docker import - image_path[:tag]
docker import snapshot_url image_path

#### remove container
docker rm container_name
docker rm $(docker ps -aq)  ## remove all exited containers



References:
1.《Docker —— 從入門到實踐­》Run命令
2.How to use Docker without sudo on Ubuntu
  # grant docker permission to specific user 'foobar'
  > sudo setfacl -m user:foobar:rw /var/run/docker.sock
  > getfacl /var/run/docker.sock
  getfacl: 從絕對路徑名尾部去除“/”字符
  # file: var/run/docker.sock
  # owner: root
  # group: docker
  user::rw-
  user:foobar:rw-
  group::rw-
  mask::rw-
  other::---
3.Play With Docker provides an Alpine Linux 3.10 environment with docker and git ready for use
     CPU: Intel(R) Xeon(R) CPU E5-2673 v4 @ 2.30GHz with 8 cores
     Memory: 32GB
     Drive: 64GB with 16GB used
     Limit: Use of up to 5 nodes for up to 4 hours per session

2017年1月15日 星期日

integer and float division in C

>celsius = (5 / 9) * (fahren - 32);
>不管打什麼fahren數字,celsius都是 0
>我把 5 或 9 換成 5.0 或 9.0, 再compile和execute就正常。

C或Java高階語言重視數字型別,將除法運算(/ operator)分成整數除法及實數除法。
整數除法的商結果為整數,小數忽略。
實數除法的商結果為實數。
決定整數或實數除法是由運算子(operand)型別決定:
(1)  整數 / 整數 = 整數商
(2)  實數 / 實數 = 實數商
(3)  整數 / 實數 = ?數商
(4)  實數 / 整數 = ?數商

例子 5/9 屬於情況(1)所以得到結果為0;
至於 5.0 / 9.0 屬於情況(2)所以得到結果有小數。
至於情況(3)及(4)結果為何,可以實驗一下。
(情况 3 跟 4 结果會以最精確的型別為準,輸出實數商)

除了加.0將整數變實數,也可以利用轉型運算子,寫法如下:

  celsius = ((float) 5 / (float) 9) * (fahren - 32);

數字前面加 (float) 運算子可將其型別轉為float。

2017年1月12日 星期四

C pointer concept in Java

>關於C語言裡指標變數的概念,指標變數和一般變數的差別在哪? Java語言中是否沒有這類概念?

C語言中只要宣告時加*號就是指標變數,例如: int *p; 的p就是指標變數。變數p存的是某整數空間的住址,透過p可以存取該整數 空間的整數。

Java沒有明確的指標觀念,但是所有宣告為參考型別的變數都可隱含視為類似指標的變數。例如: Integer n;的n就是整數物件變 數。變數n存的是某整數物件編號,透過n可以存取該整數物件的整數。

the cold start problem in user-based collaborative filtering

>如果使用user-based的協同過濾來進行產品推薦,對於新加入的使用者,他還沒有對任何產品的評分紀錄,因此似乎沒有辦法找出與其相近的鄰居,此時是否需要混用其他方式進行推薦呢?

協同過濾推薦技術遇到新用戶無法推薦的情況稱為冷啟動問題。一般常混用基於內容推薦或知識推薦技術作輔助。另外新用戶也可使用非個人化推薦作法,就其目前感興趣項目進行短暫(ephemeral)推薦。有關解決協同冷啟動的問題,可參考如下電子書第1章之多處討論。

aggarwal-16- springer-recommender systems- the textbook