PageRank



轉移公告

計劃把 http://blog.hoamon.info/ 文章全部轉移至 http://www.hoamon.info/blog/ 這裡,而本 Blogger 站台的文章近 500 篇,我預計在 2014-12-31 前移轉完畢,完成後 http://blog.hoamon.info/ 將只作代轉服務,一律把舊連結如 http://blog.hoamon.info/index.html 轉成 http://www.hoamon.info/blog/index.html ,敬請舊雨新知互相走告。

新文章只發佈在 http://www.hoamon.info/blog/

何岳峰 敬上

2011年4月13日 星期三

CMClass: 簡述 libsvm(Support Vector Machine library) 使用方法

libsvm乃台大林智仁老師開發的 Open source 工具,其目的為實作 Support Vector Machine 分類器,使用語言主要是 C++ ,目前也有 JAVA 版本,也提供其他語言的 wrapper ,像是 Perl, Python, Ruby, Matlab, Hashkell, Lisp 等。

詳細數學就不介紹了,怕大家睡著(但其實是因為還沒看懂),各位可以看一下下面那段這個影片,大略了解 SVM 分類器如何區別不同資料。



本文章主要介紹的是用 Python 語言去操作 libsvm 函式庫。

先解壓縮 libsvm.tgz 檔,可以看到 python 及 windows 資料夾,如果要在 Linux 中使用的話,請在主目錄中作

$ make lib

這樣會得到 libsvm.so.2 檔,這是 libsvm 的主函式庫,而在 windows 中使用的話,它則是先幫你編譯好這個檔了,可在 windows/ 找到這個 libsvm.dll 檔。

在 Linux 中,請把 python/*py 放到 /usr/local/lib/python2.6/site-packages 中,而 libsvm.so.2 放到 /usr/local/lib/python2.6/ 。

在 windows 中,請把 python/*py 放到 C:\Python26\Lib\site-packages 中,而 libsvm.dll 請放到 C:\Python26\Lib\windows 資料夾中(因為 svmutil.py 寫死了它的相對路徑,所以務必依它的相對位置置放)。

請在 Python shell 中,鍵入下列指令,測試是否安裝成功。

>>> from svmutil import *
>>>

沒錯誤訊息,那就是安裝對了。

使用 svm ,主要就是兩個動作: 訓練及預測。

訓練:

svmutil.svm_train 函式的引數有「類別標籤」、「觀察值」、「參數」。

你的原始資料若是如下:

1. 3, 4, 5, 6 => 第二類
2. 3, 4, 5, 5 => 第一類
3. ....

前面的 #. 表第幾個觀察值,後面逗號分隔的數據為各維度的值,行末則是放置該觀察值為第幾類的說明。請把它轉成

>>> Y = [2, 1, ...]
>>> x = [(3, 4, 5, 6), (3, 4, 5, 5), ...]

類別標籤請獨立放置到一個 list 中,而觀察值維度則依序放置到另一個 list 中。接下來,就能使用 svm_train:

>>> from svmutil import *
>>> model = svm_train(Y, x, '-c 4')

所得到的 model 就是一個經過訓練的分類器。

預測

接下來,我們要拿訓練好的分類器去預測新的觀察值:

>>> p_label, p_acc, p_val = svm_predict([0]*len(new_x), new_x, model)

而 p_label 就是依 new_x 順序所對應的類別標籤 list 。

下圖是我隨機生成的 300 點,圓點為原始的觀察值,而以線相連的連續點則是預測點。



詳細程式碼請參照如下:

 1 #! /usr/bin/python
2 # -*- coding: utf8 -*-
3
4 __author__="hoamon"
5 __date__ =u"$2011/4/12 下午 05:52:31$"
6
7 from math import pi, sin, cos
8 from random import random
9 from matplotlib import pyplot as plt
10 from svmutil import *
11
12 def circleData(centre, radius, down_limit_percent=0, lens=100, range=[0, 100]):
13 points = []
14 while len(points) < lens:
15 _angle = 2 * pi * random()
16 radius_percent = random()
17 if radius_percent < down_limit_percent: continue
18 _radius = radius * radius_percent
19 x = centre[0] + cos(_angle) * _radius
20 y = centre[1] + sin(_angle) * _radius
21 if range[0] <= x <= range[1] and range[0] <= y <= range[1]:
22 points.append((x, y))
23 return points
24
25
26 def test():
27 u""" 製作三群的隨機資料,每群皆 100 個點,點位置的 x, y 限制在 0 ~ 100 之間
28
29 最後利用 matplotlib 繪製出來的圖,"單點"表原始資料,而連續點畫線的部份,
30 該點位的類別則是利用 svm_predict 計算出來的。
31
32 Y = [1, 1, 1, ..., 2, 2, 2, ..., 3, 3, 3, ...]
33 x = [(x1, y1), (x2, y2), ...]
34 """
35 Y = [1] * 100 + [2] * 100 + [3] * 100
36 x1, x2, x3 = (circleData((35, 40), 12),
37 circleData((35, 40), 48, down_limit_percent=0.25),
38 circleData((80, 80), 20)
39 )
40 x = x1 + x2 + x3
41
42 m = svm_train(Y, x, '-c 4')
43
44 #INFO 在 100x100 的畫布上,打出 40000 個點,拿這 4 萬個點去給 m 作預測,算出這 4 萬個點的類別
45 points = [(i*0.5, j*0.5) for j in xrange(0, 200) for i in xrange(0, 200)]
46 p_label, p_acc, p_val = svm_predict([0]*40000, points, m)
47
48 line_1, line_2, line_3, pre_label = [], [], [], p_label[0]
49 for i in xrange(0, 200):
50 for j in xrange(0, 200):
51 index = i * 200 + j
52 now_label = p_label[index]
53 if now_label == 1 :
54 line_1.append(points[index])
55 elif now_label == 2 :
56 line_2.append(points[index])
57 elif now_label == 3 :
58 line_3.append(points[index])
59
60 fig = plt.figure()
61 ax = fig.add_subplot(111)
62 ax.plot([p[0] for p in x1], [p[1] for p in x1], 'ro')
63 ax.plot([p[0] for p in x2], [p[1] for p in x2], 'go')
64 ax.plot([p[0] for p in x3], [p[1] for p in x3], 'bo')
65 ax.plot([p[0] for p in line_1], [p[1] for p in line_1], 'r-', alpha=0.5)
66 ax.plot([p[0] for p in line_3], [p[1] for p in line_3], 'b-', alpha=0.5)
67 ax.set_title('Points of three classes')
68 ax.set_xlabel('x')
69 ax.set_ylabel('y')
70 ax.set_xlim(0, 100)
71 ax.set_ylim(0, 100)
72 plt.show()
73 return m, p_label, p_acc, p_val
74
75
76 if __name__ == "__main__":
77 test()

2011年4月12日 星期二

無法在 Windows 上的 NetBeans 作中文註解

為了讓 Python 程式能容易在團隊之間快速流動,我們要求大家在程式編碼上一律使用 utf8 。只要在程式檔的第一行宣告 #-*- coding: utf8 -*- 以及使用 utf-8 編碼存檔即可。

不過,在 Windows 中執行時,因為它還活在 cp950 的時代,所以我們還要在 Python 主安裝目錄中的 Lib/site-packages/sitecustomize.py 中加入

import sys
sys.setdefaultencoding('utf8')

這樣 python 程式在執行時,才不會遇到 UnicodeEncodeError (其實偶爾還是會遇到,原因是搞混了 Unicode 編碼及 UTF-8 編碼)。

而在使用 NetBeans 時,我們也會在 /etc/netbeans.conf 中設定 -J-Dfile.encoding=utf8 來讓 NetBeans 正常顯示程式中的 UTF-8 編碼中文字。

不過,在 mercurial commit 時,卻無法使用中文作註解。這時候,只要在 netbeans.conf 加入 -J-Dmercurial.encoding=utf8 即可。


2011年4月8日 星期五

廣告:申辦壹網樂機上盒(免費收看壹電視新聞及多部電影)

利益揭露: 透過網頁連結申辦機上盒,能讓我參加抽獎,什麼獎呢? 我也不太曉得,請看倌自行查閱

之前在 PCHome 上買了台 X201i NB,結果貨到時,多送了一台壹網樂機上盒,之前有在壹電視網站上觀看五都選戰的節目,覺得他們真是幹得不錯,只不過我的 Ubuntu + Chrome + flash player 有時候看一看就會自動變灰畫面。

當然他們也有提供桌面程式 NXPlayer 安裝在電腦上看,可惜只有 Window$ 版。

使用壹網樂機上盒就沒這個問題啦! 而且這個機上盒內的作業系統可是 Open source 的 Linux ,有興趣可到下載,這讓人又更加地樂意為他們推廣。而且目前使用機上盒觀看電影、影集,有上百部片是免費的。

有興趣地免費申請一台吧! 只要有 Email 、手機號碼及真實地址(它才能寄機上盒給你呀!)就能申請。

2011年3月16日 星期三

該砍掉右腿嗎?

某天,老婆和我吵架。在爭執了一段時間後,我們進行了以下對話:

老婆:「我是不是你最愛的人?」

我:「我才是我這世界上最愛的人!」

…(大家沉默了一段時間)

老婆:「那你離開我之後,你不會難過囉~」

我:「我不知道。」

老婆:「你又有什麼好難過的,我又不是你最愛的人。」

我:「左腳是我的最愛,右腿第二,妳要我砍掉右腿嗎?」

老婆笑了。

我實在難以想通「女人的想法」,因為「到底是不是最愛的人?」這件事跟我們一開始爭執的問題根本沒有關係。

2011年3月13日 星期日

有幸一睹「槍炮、病菌與鋼鐵:人類社會的命運」

真是該死呀! 當初在大學時,就有機會讀讀這本書,只是當時對於這本書的書名:「槍炮、病菌與鋼鐵」實在沒啥興趣,也不曉得原來它談論的是人類歷史,根本就沒拿來翻翻。不若「歷史之終結與最後一人」來得響亮,結果這本「歷史之終結與最後一人」,我至今還沒看懂,冤枉了荷包。

讀著這本書,讓我想到許多過去想過但不一定有解的事情:「該不該撲殺外來種?」、「台灣抗日的意義在那裡? 個人的國家定位何在?」、「到底該不該吃素?」、「K策略與R策略那個好?」、「人的成功條件中,運氣重不重要?」、「為什麼有些植物比較好吃?其他則否!」、「宗教是用來更有效地統治人民?」。

且給我多一點時間再次細讀這本書,讓我把這些問題好好地整理才分享給大家。

今天發這篇文的目的,只是告訴大家:『「槍炮、病菌與鋼鐵:人類社會的命運」真是一本重要且有趣的書』。事實上,看完這本書後,我又去博客來買了該作者的另二本書:「第三種猩猩:人類的身世及未來」、「大崩壞」。

2011年2月26日 星期六

「投資人宣言」讀後感

這書裡講的概念,大概都在綠角投資筆記、約翰.柏格以及威廉.伯恩斯坦(同本書作者)的書中看過了,像是
  • 高報酬往往伴隨著高風險,但高風險不一定帶來高報酬

  • 分散式投資: 金錢投資的目的並不是獲取暴利,而是安穩、優雅地渡過退休生活

  • 好公司,大多是壞股票; 壞公司,整體而言,是好股票

  • 主動投資長期績效往往不如被動投資

  • 績效來來去去只有成本是固定的

  • 金融從業人員不一定是站在客戶的立場

  • 如何作好資產配置(股債比)

  • 掌握好個人的人力資本
所以一直以來,我愛當金融保險業者的股東勝於當他們的顧客,努力學習程式設計及其他學問提升個人人力資本,先投資自己才作金融投資,並且分散式地購買各種類股(不過,金融股還是佔了半數),達到「如何閱讀一本書」中所提之「贊同實用書之後,你應該實踐書中理論」(在第十三章)。

不過,我的實踐也還不到百分百,像是國內債券及國外股債這二項,我的資產比例還是 0% 。有鑑於此,我開始研究 006202寶富盈 ETF 。過陣子,再向大家報告。

另外,這本書帶給我惟一的新收獲就是「高經濟成長體,不見得是好投資對象」,但理由並不是「好公司,爛股票; 爛公司,好股票」。所謂的「好公司,爛股票」是因為投資人偏好好公司致使其股票的風險貼水減少所以實質報酬率降低。然則在本書中,作者實際提出中國、印尼、南韓、…台灣等亞洲新興市場國家與美國在 1988 ~ 2008 年之間的年化 GDP 、 年化名目股市報酬率比較表(表2.3),從表中,可看到美國以 2.77% 的 GDP 數字卻能提供股市投資人 8.8% 的股市報酬,但中國以 9.61% 的 GDP 卻只能帶來 -3.31% 的股市報酬,原因在於「股票稀釋和安全法規不足而發生的明目張膽竊取」

這現象帶給我相當大的震憾,原來法治國家的好處是這麼棒。中國股市的這種表現也才與我的日常經驗搭上線。因為一直以來,聽別人說:「在大陸作生意,給公務員的額外費用是明明白白、清清楚楚的規費」,而這些沒放到國家口袋,從公司股東口袋搬出來的錢,果然是有反應在股市報酬率上。

雖然台灣的數據是贏過中國大陸的,但這也沒什麼好高興的。至今,我們親愛的同胞: 王又曾、曾正仁、陳由豪、朱安雄同志都還在海外過著顛沛流離的生活,什麼時候才能盼著他們回到溫暖的故鄉:「台灣」呀!
Related Posts Plugin for WordPress, Blogger...