用OpenVZ安裝Zentyal失敗記錄
3月 01, 2015 0 Comments OS/Zentyal Virtual Machine/OpenVZ Zentyal
用OpenVZ安裝Zentyal失敗記錄
為了繼續之前提出的DLLL-CIAS第四版架構,我開始試著在Proxmox VE 3.2上用OpenVZ來安裝Zentyal (附帶一提,Proxmox VE本身是以VirtualBox架設的,因此是全部都在虛擬機器下運作)。我以ubuntu-14.04-x86_64.tar.gz為基礎,用apt-get來安裝Zentyal。過程很順利,但問題卻卡在最後的網路上:無法建立具有內網與外網的NAT。我嘗試了很多方法來解決這個問題,但總歸來說,無法建立的原因可歸納為兩個門檻:1. OpenVZ的veth網卡只能連到未公開的虛擬網路;2. OpenVZ的veth與venet之間無法轉遞封包。以下來說明我遇到的這兩個問題。
1. OpenVZ的veth網卡只能連到未公開的虛擬網路
在討論這個問題之前,我們必須先釐清OpenVZ的兩種網路模式:venet跟veth。下表是veth跟venet的差異比較:
Feature 特徵 | veth | venet |
---|---|---|
可使用的虛擬機器類型 | OpenVZ KVM | OpenVZ |
可透過網頁管理 直接配置網路IP | No | Yes |
MAC address 網卡位置 | Yes | No |
Broadcasts inside CT 封包會在虛擬機器間廣播 | Yes | No |
Traffic sniffing 封包攔截 | Yes | No |
Network security 網路安全 | Low | High |
Can be used in bridges 可否用於橋接器 | Yes | No |
IPv6 ready 可否使用IPv6 | Yes | Yes |
Performance 效能 | Fast | Fastest |
OpenVZ預設使用的是venet (Virtual NETwork),可以直接給定IP,速度非常快。但是venet沒有MAC位址,使用上較為受限,可能不適合作為Zentyal的網路。因此這次我選擇使用veth (Virtual ETHernet)來架設,veth是用模擬真實的網卡的方式,可給虛擬機器安裝如「eth0」的虛擬網卡,因此配置上會比較貼近我們真實使用情境下安裝Zentyal的模式。
我原本是這樣想,但很遺憾的是,veth並沒有照我想的去運作。建立的veth網卡只能在虛擬機器之前彼此連線,但是卻無法連上網際網路。
用KVM的方式新增veth:失敗
我是以Ubuntu 14.04來建立虛擬機器(又稱為container),一開始是用類似KVM的方式來新增網卡,但沒有成功。大致上步驟如下:
- 將虛擬機器關機。
- 新增veth網卡,Bridge設為vmbr0 (預設),其他參數、包括MAC位址,全由Proxmox VE自動指定。
- 虛擬機器開機。
- 在console端進入虛擬機器的指令列,設定網路。 (因為網路尚未設定好,所以沒辦法用SSH連入)
以下都是虛擬機器 (container) 中的操作。 - /etc/network/interfaces中設定eth0:
auto eth0
iface eth0 inet static
address 192.168.11.118
netmask 255.255.255.0
gateway 192.168.11.99 - 重新啟動網路:
[container]# /etc/init.d/networking restart
- 使用ifconfig,確認eth0有正常啟動
- 使用ping,無法連到網際網路。
參考OpenVZ的veth說明來設定:失敗
由於用KVM設定veth的方法失敗了,所以我改找OpenVZ官方網站的veth說明來操作。該網頁介紹了很多方法,從簡單的設定、使用IPv4的直接路由、使用IPv6的直接路由、或是建立橋接器(brdige)等等。我按照上面的指示操作,但大部分都失敗了。
在OpenVZ的介紹中有幾個動作是之前沒有做過的:
- 確保vzethdev載入:
modprobe vzethdev
- 開啟網路卡的forwarding跟proxy_arp
[host-node]# ifconfig veth101.0 0
[host-node]# echo 1 > /proc/sys/net/ipv4/conf/veth101.0/forwarding
[host-node]# echo 1 > /proc/sys/net/ipv4/conf/veth101.0/proxy_arp
[host-node]# echo 1 > /proc/sys/net/ipv4/conf/eth0/forwarding
[host-node]# echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp
其他設定網卡的方法大致上類似。但是很遺憾的是,這些設定依然是無法讓veth網卡連線到網際網路。
奇妙的是,網路上許多人在OpenVZ中使用veth看起來都很順利,可是我自己使用OpenVZ從以前到現在就沒有veth順利連線的印象,這究竟是怎麼會是呢?如果有高手看到我這篇的話,希望能夠在下面留言欄為我解惑解惑。
2. OpenVZ的veth與venet之間無法轉遞封包
由於veth未能照預期的形式運作,所以我改轉用venet來設定網卡。
Zentyal只能抓到venet一張網卡
儘管虛擬機器可以設定兩個venet的IP,各別配置對外網路用的IP: 192.168.11.117跟對內網路用的IP: 10.0.0.254,但結果會如上圖所示,Zentyal只能抓到一個venet網卡。
這是因為venet網卡只有venet0,兩個IP是用虛擬網路卡的方式模擬出來的。我們可以用ifconfig來觀察虛擬機器的設定:
[container]# ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:200 errors:0 dropped:0 overruns:0 frame:0
TX packets:200 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:10000 (10.0 KB) TX bytes:10000 (10.0 KB)
venet0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:127.0.0.2 P-t-P:127.0.0.2 Bcast:0.0.0.0 Mask:255.255.255.255
UP BROADCAST POINTOPOINT RUNNING NOARP MTU:1500 Metric:1
RX packets:35 errors:0 dropped:0 overruns:0 frame:0
TX packets:46 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:4480 (4.4 KB) TX bytes:6905 (6.9 KB)
venet0:0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:192.168.11.117 P-t-P:192.168.11.117 Bcast:192.168.11.117 Mask:255.255.255.255
UP BROADCAST POINTOPOINT RUNNING NOARP MTU:1500 Metric:1
venet0:1 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.0.0.254 P-t-P:10.0.0.254 Bcast:10.0.0.254 Mask:255.255.255.255
UP BROADCAST POINTOPOINT RUNNING NOARP MTU:1500 Metric:1
Zentyal設定邏輯中對外網路與對內網路有相當大的差異,若使用venet會導致Zentyal無法判斷那一張網卡是對外網路(External, WAN)還是對內網路,因此並不是一個可行的方案。
venet可連上網際網路,但無法架設NAT
即使如此,若使用venet的兩個IP來設定,對內網路依然連得到對內網路的虛擬機器、對外網路則可以讓網際網路的電腦來連線。不過光是這樣依然無法做成NAT的網路架構。
一般使用情境下,只要在Zentyal當中設定好對外網路與對內網路的網卡,Zentyal就會自動設定成NAT。若是不仰賴套裝軟體,也可以用iptables來實作NAT。我參考Ubuntu Server 12.04 LTS 設定 iptables 實現 NAT Server這篇的做法來做,關鍵的設定是在設定 IP Forwarding and Masquerading: iptables --table nat --append POSTROUTING --out-interface venet0:0 -j MASQUERADE
iptables --append FORWARD --in-interface venet0:1 -j ACCEPT
但是很遺憾的是,依然無法成功。然後我試著用veth來作為內部網路的網卡,結果反而連venet都無法連線。我猜是因為Zentyal會蓋掉Proxmox對虛擬機器的網路設定,兩者導致了衝突。
結論:應該使用KVM來架設Zentyal
直到剛剛我都還在嘗試各種設定,但是總是該設一個期限。當我把這篇失敗的記錄寫完之後,我想也差不多該終止以OpenVZ架設Zentyal的研究,而回歸到原本使用KVM架設的規劃。
想來還是有點不甘心,以OpenVZ架設的Zentyal壓縮後的備份檔案大小只有800MB不到,而且啟動速度又快。回去使用KVM的話,虛擬網卡會有網路轉換的額外負荷,只能說是「可以用」但稱不上是「很有效率」。只是因為伺服器虛擬化之後管理起來比較方便而已。
好吧,雖然不是一篇成功的研究,不過總是該打起精神,這條路就先到此為止吧。
(more...)壞掉的伸縮筆電電源線 / Broken Extendable Power Supply Adapter Cord
1月 06, 2015 2 Comments 新玩具 Hardware
壞掉的伸縮筆電電源線 / Broken Extendable Power Supply Adapter Cord
我之前買了筆電用的三孔伸縮式電源線,但是用沒多久它就快斷掉了。因為覺得很擔心,所以在此提醒大家不要購買。
I bought a extendable notebook power cord, but it was broken after 3 months. I have to warn you that don’t buy this extendable cord.
粗大的電源線 / Heavy Power Cord
現代的筆電雖然做得很輕薄,可是變壓器卻是一直瘦不下來。雖然最近的筆電變壓器是有逐漸變小,至少已經不再像是一個磚頭,但是電源線卻還是非常粗大。
T客邦的無敵小恩恩也寫過一篇「貼紙、充電器,那些筆電還需要進步的事」中,也剛好拿了我現在在用的Acer Aspire S7作為例子。他這樣敘述S7的電源線:
「Acer Aspire S7 雖然充電器機身變小,但還是有兩條線材,收納頗佔空間。」
筆電的電源線就不能做得像是Mac一樣纖細好帶嗎?
於是我就花了點時間,找找看有沒有其他電源線可以取代那條厚重的電線。
露天的伸縮電源線 / Extendable Power Cord from Ruten
在露天搜尋一下,居然發現了有伸縮式的筆電電源線。這種電源線是用捲軸伸縮,需要時拉長、收納時縮短,線的尺寸也比原來筆電的電源線細了許多,讓我看了心動不已。價格含運費不到200元,我很快就下單買回來,取代了原本的筆電電源線。
雖然黑色的伸縮電源線跟白色的變壓器色調不搭,但是無所謂,這條線真的讓我覺得筆電好帶許多。不僅重量比較輕,線材收納也很容易。當時我真的很高興我買了一個實用的產品,只是沒想到,這段高興的日子也不過三個月而已。
壞掉的電源線 / Broken Power Cord
買來三個月左右,我在一般情況下接著電源線使用筆電時,赫然發現筆電居然是使用電池,不是用供電器的電源。
我檢查看看到底是什麼問題的時候,竟然發現伸縮電源線的線居然裂開,裡面的銅線不僅斷掉,還都跑出來了。我大驚失色,這未免也太危險了。碰到的話可真的是會被電到啊。之前電源線大多都是擺在桌下或是筆電後面,沒有仔細觀察電源線的狀況,沒想到它居然在不知不覺間都壞成這樣了。
因為覺得很恐怖,所以我馬上把伸縮電源線拿掉,換回原本的粗重電源線。雖然粗重了一點,但也是令人安心許多。
這次的經驗告訴我們,電源的東西真的不要亂買,還是乖乖配合原廠的產品吧。(不想要粗厚電源線的話,那就考慮原廠的Mac……?)
(more...)解決Android上Google日曆同步錯誤問題:安裝Google的Googlde日曆 / How to solve Google Calendar sync error in Android: Install Google Calender APP
1月 04, 2015 0 Comments Android OS/Android
解決Android上Google日曆同步錯誤問題:安裝Google的Googlde日曆 / How to solve Google Calendar sync error in Android: Install Google Calender APP
我最近發現我的Android裝置都發生了Google日曆同步錯誤的問題,讓我無法把電腦上新增的時間同步到手機與平板上。但是安裝了Google自己推出的Google日曆之後,日曆同步就恢復正常了。
Recently my Android devices got calendar sync error. But after I installed Google Calendar APP, calendar sync is going working.
我習慣用電腦或平板電腦編輯行事曆,然後手機負責當鬧鐘。平時使用的行事曆管理工具是Digical,因為它介面簡單好操作,也可以設定通知或電子郵件提醒,一直很深得我心。
可是最近在電腦上跟平板上設定的事件,卻奇怪地沒能同步到手機上。檢查了「設定 」→「帳號」→「Google」→我的帳號→「同步化行事曆」的時候,卻發現行事曆同步出現了異常的符號。同步的時間也跟其他服務有明顯的落差,我的平板最後同步時間甚至是到一個月以前。即使我手動啟動同步,行事曆也無法順利更新,非常奇怪。
後來看網路上的建議是說需要安裝Google自己推出「Google日曆」,這樣行事曆才能正常同步。
我抱著半信半疑的心態安裝了Google日曆,並跳過簡單的使用操作,進入到了Google日曆操作畫面。由於行事曆尚未順利同步,所以這時候Google日曆上也沒有我完整的行事曆。
接著再回到設定同步化行事曆畫面,手動進行同步。這次同步時不會馬上就發生異常而停止,而是會持續連線好長一段時間。過了許久之後,行事曆就正常同步了。
不能移除Google日曆 / If Uninstall Google Calendar
後來我想說我平時不習慣Google日曆太過花俏的介面,還是主要使用Digical,索性乾脆把Google日曆移除掉好了。
結果移除掉之後,行事曆又無法同步了!真的是非得要安裝Google日曆不行。Google現在的同步服務做的真的很奇怪啊。
還是不能同步? / Still Sync Error?
用了幾天之後,即使安裝著Google日曆,赫然發現還是有同步失敗的問題。最後我參考「簡單解決 Android 裝置無法與 Google 帳戶同步」這篇文章,到 Android的 設定 > 應用程式 > 全部 > 儲存行事曆,清除行事曆的快取即可。
最近這件事情真讓我感到頭大啊……
(more...)將CSV與XLSX轉換成Solr XML格式 / Convert CSV and XLSX to Solr XML format
12月 12, 2014 2 Comments 作品 程式寫作 Server/Apache Solr
將CSV與XLSX轉換成Solr XML格式 / Convert CSV and XLSX to Solr XML format
Apache Solr要匯入資料的格式預設是使用XML,但這跟我們習慣使用的Excel有很大的差別。因此我利用js-xlsx套件作了一個可以在線上將Excel的XLSX格式轉成Solr XML格式的工具,方便大家把Excel資料匯入Solr。您可以在這個網頁直接使用此工具,而更新的程式碼則是典藏在GitHub上。
This tool is used to convert Excel XLSX format file to Apache Solr’s data import XML format. Following is online tool and you can download whole JavaScript codes on GitHub.
如何製作Excel檔案? / Prepare Excel Data
規則只有一項:Excel的第一列是欄位名稱,第二列之後才是資料。
本程式在轉換的時候,會過濾掉&之類的XML脫逸字元。如果轉換後的檔案匯入Solr時發生異常,請在下面的留言中回覆給我知道即可。
Source code from: JS-XLSX (XLSX/XLSB/XLSM) Live Demo
Configuration
Upload XLSX
- Example XLSX data: example-data.xlsx
- 如果無法下載,請直接複製XML檔案,貼上到Notepad++,另存成為data.xml即可。
漂流了將近半年的峇里島明信片
11月 20, 2014 2 Comments 日記
漂流了將近半年的峇里島明信片
今天有件意外的事情,在這邊跟大家聊聊。那就是我以為已經從峇里島寄不回臺灣的明信片,今天居然出現在我桌上了。
事情是這樣的。
我六月時到印尼峇里島參加IMLF 2014研討會時,只要一逮到時間就狂寫明信片,最後寄了好幾張回到臺灣。有地址的朋友,我就直接寫他的地址。沒有地址的朋友,我就先寄回宿舍,改天有機會再親自交給他。可是奇怪的是,其他朋友的明信片都寄到了,唯獨宿舍的明信片卻不知去向。
在六月中到七月之間,我把學校可能收發郵件的單位都問了一遍,但奇怪的是,並沒有任何的未知郵件記錄,也沒有應該送到我信箱的郵件。問了老半天也沒什麼發現,最後我也只好索性放棄,也一併對學校宿舍的郵寄系統留下了很深的壞印象。
過了五個月,來到了今天11月中的時候。我的桌上忽然出現了遺失已久的明信片。送來的學妹笑嘻嘻地跟我說明,我才知道原來這些明信片居然經過了一串離奇又曲折的旅程。
要說罪魁禍首,其實並不是學校的郵寄系統有問題,而是因為我在慌忙之際沒把收件地址寫好。宿舍寫了房號,卻沒有寫到大樓代號。明信片上面除了收件者大多寫本名之外,寄件者我也只寫了綽號「布丁」而已。
在六月時明信片就寄到了宿舍,由宿舍管理員將信件擺置信箱。看我這個「布丁」像是女性綽號,宿舍管理人員也不疑有他,就直接把這對明信片放到了隔壁女宿的信箱中。很巧的是,這是一間空房間。因此這五個月之間,明信片就就這樣默默地躺在一個無主信箱中,也沒人覺得奇怪。
直到最近宿舍出現了一些事件,導致附近房間的房客統統主動遷出,那件房間的樓層就因此淨空。但是政大女生非常多,許多學生宿舍都是一位難求,很快地就有下一批學生要求進駐。而這時候明信片所在信箱的房間,也就這樣剛好有位女同學成了他的主人。
女同學搬進去之後,發現信箱裡面竟然躺著一堆明信片。而這明信片顯然不是寄給剛搬進去的她,那就竟是誰的呢?她翻了翻,雖然不知道寄件者「布丁」是誰,但是收件者之中卻有一位名字是她熟悉的,就是她的同系所學姐。
她把那堆明信片拿給學姐看看,學姐立刻笑了出來,然後在晚上來到所上meeting時把這堆明信片放到他們原本的主人身上──哪個人就是我,而這位學姐就是我學妹。
因此到最後明信片總算完成了它們的奇幻旅程,不僅送到了我的手上,我也終於把它們拿給了真正的寄件者手中。真是不可思議,世界上果然有很多事情只能用緣分來解釋的啊。
(more...)Weka的BayesNet分類器操作說明 / A Tutorial on BayesNet Classifier with WEKA
10月 28, 2014 4 Comments 電腦軟體
Weka的BayesNet分類器操作說明 / A Tutorial on BayesNet Classifier with WEKA
這是資料探勘工具Weka中以BayesNet來做分類的操作教學。BayesNet實作了以條件機率為原理的貝氏分類法,其特色在於可以繪製出條件機率的樹狀圖形。
This is a tutorial on BayesNet Classifier by using data mining tool: WEKA. BayesNet is based on Bayes Network learning algorithms and provides network structure with conditional probability distributions.
Weka下載與安裝 / Weka Download And Install
- Weka網站
- Weka下載:有Windows x86(32位元)跟x64 (64位元)版本、Mac OS X版本、Linux版本,但是前提是要先安裝Java Run Environment
Weka是紐西蘭懷卡托大學機器學習實驗室(Machine Learning Group at the University of Waikato)發展的資料探勘工具,並以GUN授權發佈,是資料探勘領域中重要的自由軟體。Weka實作了許多發表於學術論文上的重要演算法。不僅適合作為學生學習資料探勘的好工具,也是進行演算法改良研究的平臺。
2013年該實驗室推出了5週的線上教學課程MOOC「Data Mining with Weka」,有志學習資料探勘的同學可以試著進來上課看看。
安裝Weka的時候,要特別注意的是記得安裝Java Run Environment (JRE),不然Weka無法開啟喔。
由於我之前就對於貝氏分類法感到很有興趣,雖然他在分類器中的成效一直不是很突出,但是可擴增性與簡易實作的理論等特色,讓我覺得貝氏分類法應該還有很多可以應用的潛力。這次剛好找到了李明昌老師的教學投影片,我也就來練習操作看看BayesNet這個貝氏分類法的分類器,並在此跟大家分享。
STEP 1. 開啟Explorer / Open “Explorer”
開啟Weka的時候,先選擇使用Explorer吧。
STEP 2. 開啟檔案 / Open file
進入Explorer之後,我們這次要用的檔案是範例檔案中的iris.arff。檔案位置在[Weka]\data\iris.arff。
STEP 3. 開啟分類器 / Open ”Classify”
開啟檔案之後,接下來會回到Explorer上。接下來我們要開啟Classify分類器。
在分類器上按下Choose選擇。
選擇分類法中的 weka/classifiers/bayes/BayesNet
這樣子就可以準備來開始跑囉。
STEP 4. 預設的BayesNet探勘結果 / BayesNet Mining Result with Default Options
測試方式用預設的交互驗證(Cross-validation) 10層,然後分類的目標是 (Nom) play,按下「Start」。
最後結果看可以看到其中一行:
Correctly Classified Instances 139 92.6667%
這意思是,預設的BayesNet分類法下來,正確率只有92%左右。
我們在結果集上按下右鍵,選擇「Visualize graph」。
接著會跳出BayesNet建置的樹,每個節點都是造成不同種類的條件機率。其中我們在「sepallength」上面按下左鍵。
左邊直欄class底下有Iris-setosa / Irisversicolor / Iris-virginica,第一欄則是'(-inf-5.55]'、'(5.55-6.15]'、'(6.15-inf)'。意思是說:
- 如果是品種setosa的話:花萼長度小於5.5的機率為0.922;長度介於5.55-6.15的機率為0.068;長度大於6.15的機率為0.01。
- 如果是品種versicolor的話:花萼長度小於5.5的機率為0.223;長度介於5.55-6.15的機率為0.456;長度大於6.15的機率為0.32。
- 如果是品種virginic的話:花萼長度小於5.5的機率為0.029;長度介於5.55-6.15的機率為0.204;長度大於6.15的機率為0.767。
因此這就是貝氏分類法其中一個條件下的模型。
除了基本參數之外,我們可以還調整BayesNet的參數設定讓正確率再提高一些。
BayesNet的參數設定 / BayesNet’s Properties
在BayesNet那一條欄位上按下右鍵,選擇「Show properties」。
接下來我們來看看關於BayesNet的介紹:
貝氏網路學習法(Bayes Network learning)使用了各種搜尋演算法與品質測量法。
Weka的文件並不完全,底下的設定光看名字也看不懂。細節都是要靠More裡面的介紹。讓我們按下More繼續看看。
介紹 / Information
- 名稱:weka.classifiers.bayes.BayesNet
- 概要:貝氏網路學習法使用了各種搜尋演算法與品質測量法。基於貝氏網路分類器。提供了資料結構(網路結構、條件機率分佈等等)以及使用貝氏網路學習演算法常見的工具,例如K2或B。更多細節請看http://www.cs.waikato.ac.nz/~remco/weka.pdf (可是找不到資料啦)。
能力 / Capabilities
- 資料類型 (Class):名義資料(Nominal Class)、二元資料(是否)、遺失值的資料(Missing class values)。
- 屬性(Attributes):二元屬性、數值屬性、空的名義屬性、遺失值(Missing values)、名義屬性、單一元素屬性(Unary attribute,什麼意思呢?)。
- 其他說明:最小的案例編號為0。
參數 / Options
- BIFFile:可設定一個以BIF XML格式建立的檔案名稱。可用於比較從BIF檔案中的貝氏網路結果、以及使用貝氏網路學習法學習結果的差別。統計計算為o.a.,遺失值(the number of missing)以及額外弧度(extra arcs,我真的看不懂這是什麼)
- debug:設定true,分類器會顯示額外的資訊,以供偵錯。
- estimator (評價器):選擇評價器演算法來找尋貝氏網路條件機率表,預設值是SimpleEstimator。
- searchAlgorithm (搜尋演算法):選擇搜尋網路架構的方法,預設值是K2。
- useADTree (使用AD樹):使用AD樹一般而言可以降低學習時間。然而,由於AD樹佔用大量記憶體
,這可能會造成記憶體不足的問題。關閉這個選項可能會讓結構學習演算法變慢,但消耗記憶體較少。預設會使用AD樹。必須要注意的是,這裡的AD樹是指一種資料架構,用於增加計數的速度,不要跟同名分類器搞混了。
五個參數中的三個參數還算好理解,其中estimator (評價器)跟searchAlgorithm (搜尋演算法)就有很多選擇。讓我們一一來看一下有那些評價器跟搜尋演算法吧。
參數:評價器 / Option: estimator
可選用的評價器共有4種。首先我們先看一下預設使用的SimpleEstimator,然後再看看其他評價器。但是除了SimpleEstimator可以應用於多層條件機率的評價之外,其他評價器限制都很大。因此最後我還是用SimpleEstimator。
簡易評價器 / SimpleEstimator
- 名稱:weka.classifiers.bayes.net.estimate.SimpleEstimator
- 概述:SimpleEstimator是用於評估貝氏網路中學到的條件機率表格。評估機率是直接來自於資料本身。
參數只有一個:
- alpha:Alpha是用來評估機率表格,可以用於解釋每個數值的起始值。預設值是0.5。
貝氏網路評價器 / BayesNetEstimator
- 名稱:weka.classifiers.bayes.net.estimate.BayesNetEstimator
- 概述:BayesNetEstimator是一種用於評估貝氏網路中學到的條件機率表格的基本用法。
參數只有alpha一個,解釋同SimpleEstimator。
BMA評價器 / BMAEstimator
- 名稱:weka.classifiers.bayes.net.estimate.BMAEstimator
- 概述:BMAEstimator是用貝氏模型平均法(Bayes Model Averaging, BMA)來評估貝氏網路中學到的條件機率表格。
參數除了alpha之外,還有一個useK2Prioir,但是More裡面沒有說明。
多項式BMA評價器 / MultiNomialBMAEstimator
- 名稱:weka.classifiers.bayes.net.estimate.MultiNomialBMAEstimator
- 概述:多項式的BMA Estimator。
參數除了alpha之外,還有一個useK2Prioir,但是More裡面沒有說明。
參數:搜尋演算法 / Option: searchAlgorithm
搜尋演算法很多,Weka提供了ci、fixed、global跟local這四種。預設使用的是local當中K2。我試著用不同的搜尋演算法來計算看看,赫然發現GeneticSearch的正確率挺高的。所以以下我介紹GeneticSearch這個搜尋演算法。
基因搜尋演算法 / GeneticSearch
- 名稱:weka.classifiers.bayes.net.search.local.GeneticSearch
- 概要:這個貝氏網路學習演算法使用了基因搜尋演算法來找尋良好的貝氏網路結構。基因搜尋是基於蒐集貝氏網路結構的族群(population),再以突變(mutate)與交配(get offspring)來運作。最後結果會產生貝氏網路結構。
基因演算法是傳說中只要有無限時間,就可以計算出最佳解法的超強演算法。這也是資料探勘必定會教的經典演算法。在此我就不介紹這麼多了,想要細節請看GA基因演算法介紹。
參數可多著了,共有9個:
- descendantPopulationSize:設定每一代產生子孫族群(the population of descendants)的數量。
- markovBlanketClassifier:預設為false,當設定為true的時候,每次學到一個網路結構時,馬可夫毯校正(Markov Blanket correction)就會用於網路結構上。這可以確保網路中的所有節點都屬於分類器節點的馬可夫毯的一部分。(抱歉,我知道馬可夫鏈的模型,但還真不知道這是如何運作的)
- populationSize:設定每一代的網路結構族群的數量。
- runs:設定基因演算法要運作的回數。
- scoreType:分數類型決定如何測量網路結構的品質。可用的選項包括預設的Bayes、BDeu、Minimum Description Length (MDL)、Akaike Information Criterion (AIC)以及Entropy。
- seed:亂數產生世代的初始值。設定seed可以允許實驗的可複製性(Setting the seed allows replicability of experiments. 我不會翻譯)。
- useCrossOver:決定是否可以交配(cross-voer)。交配是網路結構以位元呈現後,再隨機挑選k個位元、保留其他位元來組合。交配或突變至少必須要使用其中一項。
- useMutation:決定是否要使用突變(mutation)。突變將反轉網路結構的一個位元資料。突變或交配至少必須要使用其中一項。
- useTournamentSelection:決定選擇族群的方法。當設為true的時候將會使用競賽選擇(tournament selection),亦即選擇其中最高的數值以及隨機兩個來進行。當設為false時只會選擇成效最好的網路結構。
STEP 6. 使用基因搜尋的探勘結果 / Mining Result with GeneticSearch
我換了基因搜尋演算法再來跑跑看,正確率提升至94%,比預設的K2還要高1.3%。
基因搜尋演算法是使用上面介紹的weka.classifiers.bayes.net.search.local.GeneticSearch。
其他參數都沒有調整。事實上我嘗試用了幾種不同的組合,但是結果都一樣。基因演算法的突變跟交配是隨機的,因此理論上每次跑的結果應該都不太一樣。不過我跑了幾次結果都差不多,可能是因為runs=10已經夠多的關係吧。
讓我們來看看結果模型。跟K2跑出來的結果差別非常大。我們在意的是class的機率,點左鍵來看看:
結果如上。以第一列為例子來解釋,如果花辦長度(petallength)小於2.45、花瓣寬度(petalwidth)小於0.8,屬於品種setosa的機率為0.981、versicolor的機率為0.01、virginica的機率為0.01。其他列的解釋則可以依此類推。
與其他分類器的比較 / Compare with Other Classifiers
不過我也跑了一下其他演算法。
J48的決策樹正確率為96%。以上是建樹結果。
lazy.IBk正確率為95.333%。
SVM的funcitions.MultilayerPerception則是97.333%。
大多數演算法都能夠輕鬆勝過BayesNet啊。
(more...)
Comments