2007年4月23日 星期一

1/5 rule self-adaptive under (u+k)-ES (2)

( 寫於2005/12/20 )

想了一種新方法, 測試結果還不錯

將sigma encode到chromosome裡, i.e., chromosome含有Gk, Gs, sigma

select a parent p,
if p.Gk == G
do adaptation (=> revise p.sigma)
p.Gk = p.Gs = 0
fi
p.Gk++

offspring = mutation(p)

if offpsring.fitness BetterThan p.fitness
p.Gs++
fi

如果parent在replacement時被幹掉了也沒差,
一直都留下來的話自然會做到adaptation
( 即parent夠優秀, 才有必要對它調適sigma )

看起來很直接的想法,
但在想出來之前, 一點也不直接, 得跳出幾個迷思才行

1/5 rule self-adaptive under (u+k)-ES

( 寫於2005/12/06 )

前言: 這篇是針對了解ES的人寫的

原本的(1+1)-ES如下

Gs: succesful mutation (offspring is better than parent)
G : sample generations
p = Gs / G
a = (0,1) (recommendation a = 0.8)

sigma = {
sigma / a, if p > 0.2
sigma * a, if p < 0.2
sigma , if p = 0.2
}

經測試結果, 1/5 rule非常有威力, 大大加速了收斂和找到好結果

但在(u+k)-ES時要怎麼套呢? (k > 1)

way1:

count all mutations, if it’s successful, Gs++
p = Gs / (G*k)

way2:

count all successful replacement,
Gs = number of offsprings which is replaced into populations
p = Gs / (G*u)

測試結果, way1比way2好 (還滿合理的),
但都比N step-sized的self-adaptive差

今天終於想到一個解法

way3:

for each generation, count successful mutation, say n,
Gs++ if n/k >= 0.5
p = Gs / G

結果比way1好很多, 而且比N step-sized self-adaptive好

我的解讀:

每一generation的mutation成功與否, 應該是各自判斷, 而非累計,
way1有個盲點, 假設sample 5 generation,
結果1st generation幾乎都成功, 但2~5 generation幾乎都失敗,
但加起來的機率仍 > 0.2怎麼辦? 這個反應已和1st generation的情況差很遠了

所以我認為way3最合理, 而且1/5 rule應該比N step-sized好 (一般來說)

個人認為fitness愈能合理且即時反應在meta-parameters上,
self-adaptive才會有效果, 但要怎麼個合理法, 怎樣才夠即時, 是另一大問題

EC is for optimization or design?

相較於以前不認同不知所云的解,現在我不會排斥用EC解。漸漸覺得傳統嚴僅的AI無法做出超越人腦的產物,雖然人腦運作方式還沒完全破解,但我想類神經網路或演化計算的做法,較接近人腦運作的原理吧。


( 寫於 2005/12/09 )

昨天ypchen說, 如果將design和optimization做比較,
他覺得EC是做design的還較有道理

所謂的物競天擇, 適者生存, 真的有選出最佳種嗎?
還是只是設定了一個門檻, 低於此限的物種就無法延續下去,
所以EC無法拿來做optimization, 只能去掉比較不好的

如果針對這兩者來比較的話,
EC較像用來選design的, 不是做optimization,
我們可以從EC的結果看出一些隱藏的想法

我認同這個觀點, 拿蟑螂來看就可以明白,
蟑螂稱不上很突出的物種, 它之所以能一直存活,
是因為它仍能適應環境的限制

原本我以為EC就是做optimization的,
聽了ypchen這番話後想想, 覺得很有道理,
這個想法更明確地釐清一些現象

我覺得我對EC的態度, 比較像是從中激發一些靈感, 而非用它來解決問題,
以我的個性來說, 即使用EC解決我的問題,
我也不想用一個不知所芸的東西當解決方案,
所以我會把EC當做達到最後目標的過程裡的一個嘗試吧

用Generic Algorithm實作N-Queen後的初步心得

這系列Evolutional Computation的文章是去年修課時寫的,今天收到別人寄信說看到我去年寫的筆記,對他有些幫助,滿高興的。事實上我已忘了把筆記轉到web上這回事,與其讓這些資料繼續躺在web角落,不如放到普及度較高的Blog吧。


( 寫於2005/10/08 )

Evolutionary Computation,
這是門詭異的學門, 耳熟能詳的Generic Algorithm是EC的一種

據ypchen所言, 這個領域的人不知道為什麼, 不愛寫書, 不愛寫paper,
看來神祕的力量都是不留記錄

EC發展20多年, 仍然沒有基本定理, 沒有公式, 沒有證明,
沒有人知道它為什麼對, 只能說些似是而非, 看起來好像有道理的話,
雖然有些中心思想[*1], 但不怎麼數學, 比較像物理化學,
發現一個現象, 再想辦法掰公式, 想辦法解釋它,
如果風行已久, 又沒人推翻它, 就大概是對的吧

簡單的描述一下用EC解N-Queen的一種作法 (以8-Queen為例)
1. 隨機產生100個盤面, 放到Set S裡
ex: 1 2 3 4 5 6 7 8, 4 1 2 5 3 8 7 6, …
這裡的數字表示各個row的queen要放在第幾個column上

2. 挑一個看起來最正確的, 隨機選兩個位置做swap
ex: 4 1 2 5 3 8 7 6 ==(swap 1,8)==> 4 8 2 5 3 1 7 6,
將新盤面加到 S 裡

3. 從 S 裡刪掉看起來最不正確的

4. 重覆step 2, 3到你高興為止
ex: 找到一組解了, 或是執行個100次

結果呢?
要找大量不同的解很困難, 但只要找到一個解到是出乎意料的快

ex: N = 100時, 4 secs, 在第171代找出一組解 (即試了100+171 = 271種可能)
N = 200時, 28 secs, 在第522代找出一組解 (試了621種可能) [*2]

很顯然的, 一般解法 (Backtracking的經典例題),
不可能在可接受的時間內(比方一天)找到一組解

從以上的作法裡, 看得出來”Why it works?”嗎?
只能說冥冥之中自有天意啊

PS

*1
EC的學者認為, 在一堆隨機的候選答案裡, 存在和最終解的關聯性,
只是我們不知道怎麼找出搜尋的規則,
EC的作法, 就是想辦法讓這莫名的規則發生,
使候選答案一步步成長為最終解

拿DP來比喻可能會有所領會,
也就是問題的最佳解取決於子問題的最佳解,
DP有明確的數學規則, EC則否

*2
N = 200時的解, 看看就好

125 142 24 196 45 105 179 140 107 20 49 92 148 165 48 197 78 8 155 80
132 7 153 93 31 72 161 190 103 53 116 40 188 75 111 119 187 69 18 130
77 55 36 106 19 83 65 141 100 89 101 129 34 162 192 28 46 10 169 173
114 32 4 143 95 61 189 193 200 133 96 166 60 22 131 172 152 112 57
146 113 102 90 87 71 15 109 183 170 52 118 174 21 186 137 167 11 67
25 157 33 35 120 2 117 98 44 50 26 104 184 68 177 73 164 9 47 147 64
97 168 1 62 121 38 178 182 13 63 154 145 160 86 199 5 138 29 74 158 3
37 126 191 91 56 181 156 94 115 110 195 39 6 23 27 16 58 81 134 128
76 150 124 180 84 42 171 151 127 41 136 163 144 99 175 17 85 122 194
185 135 70 14 66 59 54 12 82 139 30 43 149 79 176 51 159 88 108 123
198

PmWiki:顯示最近更新列表

最近讀了《資訊架構學》,覺得即使是Wiki,也可以構思如何將頁面以更豐富的方式呈現,比方加上最近更新的頁面。

原本 Site.AllRecentChanges 就有顯示所有更新過的頁面,但不方便自訂格式,像是去掉一些不想統計的頁面(例如*.RecentChange),所以自己來弄一個。做法相當簡單,只要用shell script找出wiki.d/下的更新時間即可,再將shell執行結果讀進自訂變數,由wiki page內文裡讀出變數的結果即可。由於做法太簡單了,我就沒找Cookbook裡有沒有類似工具,自己直接黑手做掉了。

修改local/config.php

最上面加入shell script取得更新列表:

function GetRecentUpdatedList() { $result = `ls -tl wiki.d | perl -ne 'print if ! /\.RecentChanges|\.AllRecentChanges|PmWiki\.|Site\.ActionLog|^total /' \ | perl -ane 'print " \$F[-4]-\$F[-3] \$F[-2] [[\$F[-1]]]\n";' | head -30`; return $result; } ... $result = GetRecentUpdatedList(); $FmtPV['$RecentUpdatedList'] = "'" . $result . "'"; #capture contents of $result

在wiki page裡讀出script結果

比方在Main.HomePage裡加上:

!! Recent Updated List {$RecentUpdatedList}

原理說明

這個做法的關鍵是使用自訂變數,參照PmWiki官網說明:OtherVariables,有使用自訂變數的範例。

2007年4月20日 星期五

圖解經濟學

書藉基本資料: 圖解經濟學

圖文並茂的入門書,編排方式都是左頁文字右頁圖,大部份內容看右頁圖就好,讀起來很快。從基本的供給和需求講起,到市場運作機制,貨幣制定和運作機制,最後是說明國際貿易和貨幣流動(升貶值)的關係,將基本名詞解釋得很清楚。除了貨幣升貶和景氣之間的變化沒完全看懂外,整本書看下來,偶而細想一下即可吸收,真的是不錯的入門書。

如同《圖解OOO》系列的副標語所言:「一冊通曉,不可不知的基礎人文知識」,理工人了解一些社會人文的內容,有個基本認知,應該很有幫助。況且在一個領域待久了,腦袋只會愈來愈硬,試著看看不同領域怎麼思考,滿有趣的。

錢也是物品的一種

《圖解經濟學》真是易讀易懂的好書,弄懂不少觀念。經濟流通的根本是供給和需求,物品的價值由供需雙方共同認定,基本觀念大家都懂:

  • 供給 > 需求:物價下跌。
  • 供給 < 需求:物價上漲。
  • 供需平衡取決於供給和需求雙方的變動。

以此發展的基本原則有「物以稀為貴」、「以價制量」、「以量制價(規模經濟)」,皆不離供需的運作。

當物價有廣為人知的標準時,就是俗稱的行情,比方一般600c.c.的飲用水賣20元左右。當物價的供需標準不夠流通時,就回歸原始的做法,喊到買賣雙方都認可的價格,比方買古董或接case。

貨幣也是物品的一種,運作的法則也是如此。

銀行和物品專賣店的本質一樣,只是銀行買賣的物品是貨幣。所以銀行內有很多貨幣時,借貸率低;貨幣少時,借貸率高。於是中央銀行(大盤商)要把關貨幣流通率,貨幣量對社會的影響如下:

  • 當貨幣量大於社會需求時,消費能力過度,供不應求,物價上漲,通貨膨漲,經濟不穩。
  • 當貨幣量小於社會需求時,消費能力不足,供過於求,物價下跌,經濟不景氣。

中央銀行要調整各家銀行的貨幣備存量(比方必須保留20%的貨幣),限制銀行能借出的貨幣額度。

另外政府缺錢時可以徵稅、發行公債、讓中央銀行發行貨幣(就是印鈔票啦),前兩者的運作模式和後果容易理解,但以前我搞不懂印鈔票的運作模式。如果可以印鈔票,為什麼不印?如果可以印鈔票,那錢不就無中生有,不合常理。

其實印鈔票並不是無中生有,錢也是物品,印鈔票增加鈔票量,造成鈔票貶值,也就是通貨膨脹,假設中央銀行印了現有鈔票一樣的量,也就是讓總量變兩倍,那每張鈔票的價值可能會跌為一半,一碗25元的陽春麵可能變成50元。換個角度來看,印鈔票就是讓全民買單,政府從全民口袋裡的鈔票抽走部份價值,再從自己口袋拿出來用。這樣來看,政府三種補錢的做法,只有舉行公債才不會傷到全民,徵稅是有差別比例傷害,印鈔是無差別全砍,但砍得方式比較無形,暫時看不出影響。

終於解開小時候的疑惑了。

備註:相關名詞

  • 信用創造:透過借錢而增加的金錢總額。比方甲銀行有1億貨幣,借5000萬給廠商,廠商將5000萬存到乙銀行,結果原本的1億元在市場上變成1.5億元。

2007年4月19日 星期四

讀資工不是要會寫程式,而是要寫比別人好的程式

看到學弟們在討論這個話題,也來寫些感想。

最重要的是想法,想法包含效率分析,開發前要能算出這個想法(演算法)的時間複雜度和空間複雜度,而不是用力衝下去發現很慢再回頭改。

同樣的觀念可以用不同的語言呈現,但反過來說,各種不同的語言,背後有作者的設計理念,使用不同的語言,可以讓自己學習新的想法。像是用Lisp寫些小程式,保證遞迴觀念大增,因為不用不行,沒有for和while。

沒有最好的語言,只有最適合的語言。

多學多種不同語言,能增廣不同的切入點,像是Ruby將”外而內”的map和”內而外”的iterator輕易地呈現,用Ruby寫code自然會用map和iterator的方式思考; 因為有interface的設計,用Java自然會寫得較OOP。反過來說,如果寫Java不懂OOP,那只是學另一個C/C++ like的語言,用 C 的語法在寫,不算學新的語言,語法,語意,語用,最難的是學會語用,語法細節在要用時再查即可。

上面是依個人經驗舉例,不是說Lisp,Ruby,Java就好,每個人喜歡的語言不同,在語言大混血的年代,相似的概念各個語言多少有沾一些。

在語言之外的話題是library (package,API,framework都算類似的詞),個人覺得大一大二打好基本功,能自己刻Data Structure後,就不該自己造輪子重寫一堆基本元件,大三應該開始找library,練習找資料的能力,比方要存取XML的內容,用語言A的話,要上那找library?

沾過各種語言學會不同的思維,有把握針對問題需求用適合的語言開發,找出那個語言用的library,相信不管到那都能很有自信地coding的。

2007年4月18日 星期三

和Ambuscade聊商

最近因比賽所迫,讀了一點和商相關的東西,和會長聊天聽到不少相關內容,自己又因興趣在讀《圖解經濟學》,算是踏出小小小小的第一步。

剛才Ambuscade打來聊天,先是聊到我最近做的研究,很high地和完全不同背景的人說明我在幹嘛後,Ambuscade的評語是”好吧,還滿有趣的”,加個”好吧”是聽不太懂,但好像又好滿有趣的。後來聊到我參加的比賽,話題轉到商上。

Ambuscade說最近有個仲介商用1/10價的方式賣商品,但這1/10價的手法很漂亮,等我拿到詳細介紹時再補上這塊。聽到1/10價的想法,我提到半價網,接著Ambuscade提到規模經濟也不能殺到半價吧,這讓我挺high的,因為我馬上聽懂「規模經濟」一詞,用到讀的東西,可以加深學習印象。

由於比賽的經驗,問Ambuscade品牌為何,如何在報告裡說明”打出自己的品牌”。聽了一些說明後,用我的方式來描述的話,就是”打出自己的品牌”的意思就是”如何宣傳自己的產品,確立自己的定位,透過行銷讓別人將品牌和產品特色建立聯想”。經濟學的詞彙讀了以後,還是要能用自己的方式想通,重描述一次,才稱得上讀懂啊。

很有趣的談話,就是要這樣充實地生活,偶而聊聊近況,獲得新的思維。

Update - KIKIGO:用十分之一的價格競標

看到KIKIGO內容後,想說Mr.6應該會有介紹,果然google “kikigo mr.6″有找到,只是連結指向Mr.6介紹半價網的文章 XD 。那篇的留言裡有些人已提到KIKIGO,更妙的是Mr.6用的Google Adsense上有KIKIGO的廣告。

簡報風格

今天group meeting是博班學長和講義報,博班學長還是一往的詳盡精闢風格,我大概也是這型的吧,功力比學長弱就是了。詳盡精闢的意思是指會將每個環節的背景、輸入和輸出加以說明,比方切入報告主題前會先來段題目背景說明外加該領域的基本觀念複習,介紹得詳細但不拖泥帶水。

講義的報告非常不同,老師要講義用英文報,但不同點不是用英文,而是聲調。講義用英文說話的抑揚頓挫超明確的,聽起來很悅耳,即使聽不懂內容(sorry,我英聽弱),卻能被聲調吸引。另外york的說話風格和我完全相反,york很喜歡用提問句,接起一段最後一句的重點,以”什麼是XX呢?”開起下個段落。我個人則是極端排斥提問、反問,嫌這種作法會製造贅句,想想有點排斥過頭,可以適度引入。

看來我有不少明確的改進方向了,朝著完美簡報逐步邁進吧!

2007年4月16日 星期一

gnuplot:顯示時間軸

xdata有些參數可設,下面的code會以timeformat表示 X 軸,不然光以數字表示 X 軸,200612的下一格不會是200701,資料無法連續表示。

set xdata time set timefmt "%b-%d-%H:%M:%S" set xrange ["Mar-25-00:00:00":"Mar-26-00:00:00"]

timefmt的參數和strftime一樣,可以隨意更改,xrange和輸入的data和timefmt一致即可。

2007年4月14日 星期六

MSRA推出Benchmark Datasets for Learning to Rank(LETOR)

剛才收到老師轉寄給lab的信,Microsoft Research Asia推出LETOR。研究ranking的最大問題在於沒有共通測量標準,於是某學者參考了99個model後提出了第100個model,但沒有人知道這100個model差在那,適用在什麼樣的資料。

MSRA推出的LETOR想建立一個通用標準,幫助評量各種model。在machine learning裡,讀入一堆traninig data改善model內部結構稱為learning,machine learning的做法多為自訂一個model,透過learning建出model後,就能拿來應用,比方ranking web pages(PageRank不是machine learning)。

官網也提到MSRA會在SIGIR’2007用LETOR辦個workshop,看起來很有意思,也有助於MSRA建立LETOR的地位。目前來看,MS Research的東西看起來都挺有趣的,只要在十年內能弄出強大的新功能,MS又能站穩它們的地位吧。

另外那篇公告是放在users/tyliu/目錄下,看了一下tyliu的介紹,真是強的亂七八糟,SIGIR’2007上三篇!中文介紹上寫他是清華大學電工系畢業,先做multimedia再轉information retrieval,完全是不同等級的人。看來若想做學術研究,當教授不如進MS/Yahoo/Google Research吧。

額外想到的事,ranking的特徵是order,clustering的關鍵是定義相似度,可以看成比order弱的屬性。若ranking的標準成立了,是否能帶出clustering的標準呢?比方以ranking相近表示相似度,再看怎麼把ranking的benchmark轉過去。

2007年4月10日 星期二

Parse invalid HTML by Hpricot

XML parser滿天飛,但能處理不符格式的HTML parser沒幾個,Ruby Cookbook裡有一些說明,用內建的REXML parsing XML,可以用DOM,也可以用SAX,看Cookbook或google一下就有範例code。

Cookbook的《Recipe 11.5. Parsing Invalid Markup》介紹幾個lib,試用後都失敗,無法處理我遇到的invalid HTML,到del.icio.us找了一下,一堆人推Hpricot ,試用後驚為天人,處理速度快又正確,支援XPath或CSS Path的方式索引HTML,可以處理XML和HTML,真是太威了。

以下為官網的說明:

若要觀察XPath或CSS Path的話,可以用firefox的extension:Web Developer ,裝好後按個Ctrl+Shift+Y,把滑鼠移到網頁上會看到該塊的CSS Path。

2007-04-11 Updated

REXML Tutorial

2007年4月8日 星期日

skylight、大中來訪

晚上接到skylight和大中的電話,說要不要出去吃個飯,聊聊天,看來這兩人待在寢室閒得發荒,正好我寫一個下午的程式也累了,三人找附近一家素食店吃套餐坐著聊天,真像上班族幹的事。

大家都過得很充實,一直有新東西可以聊真有趣,skylight一直想賺錢,想做很實務的事,大中看起來像要走學術路線(並且朝實務面做),但這心機仔到底要做什麼,沒等到95%完成時,沒人知道吧。我大概一半一半,這樣有趣的組合,如果選好話題能讓大家發揮,仔細討論起來應該會成為有深度的討論,不過還是亂聊最自然。

高中和朋友聊想法,聊到最後的瓶頸是技術不足,想法很多,但關鍵技術都沒有,不知道怎麼開始著手。大學時大家都在充實能力,想法也在轉變,不再是單純的技術狂,看的層面比較廣一些。大學畢業後,瓶頸變成不敢衝下去實現。看到別人實踐的創意,會覺得這的確會成功,衝下去的人真有見地,但對象轉為自己時就沒這膽識。有趣的事永不嫌少,只是最該做的事永遠找不到。不知道下次碰面時,大家想法會轉變多少,曾經有的迷惘能解決多少。

大學畢業的改變,比我想像的還要大很多啊,看到大家走向不同的路,增長見聞,繼而重新體認自己所在的圈子太窄,應該更宏觀些去擴大世界。

2007年4月7日 星期六

查詢字意的關聯

WordNetWord Association Thesaurus是查詢字意關聯的線上免費網站,也可以下載站上的dataset。前者似乎是用推論的方式去定義,後者對學生做限時測驗,要他們在極短的時間下回答第一個聯想到的字。

這種工具也許可以在寫作時拿來當替換詞使用,也可以當人工query suggestion或query expansion使用。像用Google搜尋時,如果keyword輸入一點錯字,比方”restaurent”,Google會輸出

您是不是要查: restaurant

這是query suggestion;搜尋結果最下面另有一排訊息,則是query expansion:

相關搜尋:
herbs restaurant hong kong restaurant restaurant menu chinese restaurant macau restaurant
japanese restaurant jj restaurant maxim restaurant aqua restaurant eden restaurant

之前在查PmWiki的fold plugin時有用WordNet達到人工query suggestion的功效,詳見這篇。Word Association Thesaurus有趣的地方是兩種模式:

  • Stimulus:輸入一個詞 Q,輸出可能被想到詞 A,given Q, find all A, where Q -> A。
  • Response :given A, find all Q, where Q -> A。

我分別查了camel,Stimulus的結果裡有hump、desert,Response則是straw。另外查了traffic,前後的結果分別是jam、congestion,看來世界各地的交通都不太好啊。

補註

  1. straw -> camel的原因八成是這句諺語:

    “The straw that broke the camel’s back”

  2. Thinkmap Visual Thesaurus:裝Java才能用,好像很強的樣子。del.icio.us裡可以查到不少相關工具,有機會再玩看看。

做研究真是奇怪的職業

最近都在看paper,定義論文方向,規劃實驗,仔細想想,花了這麼多心力弄的東西,到底有啥屁用,也說不上來,是有那麼一些用處啦,大概在和現實脫節的邊界,很像我的作風。

記得大四下時老師拿social network的paper給我讀,那篇是輸入一堆conference/journal的paper list,輸出那些作者有共同興趣,當時我和老師說,這還算有趣,但興致不大,不想做這個。不過我現在做的東西,卻和social network很像,只是著眼點偏重在thinking的產物,而不是thinking的主體 - 人。現在和一年前的心態差別,大概是一年前我在尋找最有興趣,可以一做再做不能罷手的題目;而現在則認為這樣的題目不見得存在,將對研究的看法放低,不是思索要全心做研究,還是投入業界這種極端問題,而是在中間的模糊地帶漫遊,邊做邊想下步往那靠近。

昨天讀了WWW’2006 Best Paper: Visualizing Tags Over Time,Yahoo! Research的作品,滿有趣的,demo在這裡。進Google/Microsoft/Yahoo的Research部門的話,有取之不盡的data,可以盡情發揮創意實作出來,有興致的話再將成果投paper,感覺很有意思。

4/5雜記

由於清明節的關係,大部份餐廳沒開,加上昨天看Code Geass看太晚,睡醒後頭腦昏沉,不適合集中精神思考,索性回家休息。

傍晚先到lab印兩份paper,在學校7-11買好車票,在綿綿細雨下走往清大旁的客運站。途中經過水木漫畫店,竟然有開,可惜時間太趕,不然就進去殺個兩小時。到台北第一件事是到漫畫小子領書,過年前訂的《四葉妹妹》日文版2-4來了,目前這套漫畫的難度最適合我,寓教於樂,用來練日讀,大概可以看懂80%吧。

回到店裡後,老爸老媽竟然偷懶不下廚,說到附近的店吃飯,不用煮、不用洗碗,省事。吃完回家,我先讀了半本《四葉妹妹》,目前學日文的方法相當自然,不太懂日文文法,但一讀下去就自然地用日文方式思考,就像腦裡有個開關:日文Mode - Switch On,接著就能讀簡單的日文漫畫和聽簡單的日文Drama,堪稱優良的自然學習,待累積到一定程度,再挑文法書來看。反到是英文成見太深,太在意英文的立即用處,很難轉為自然學習法。

漫畫看累了索性改看paper,看起來很驚人的行為,之前不曾這麼幹過。paper讀起來還滿順的,看漫畫和paper的期間,老媽在旁邊讀《打噴嚏》,之前推薦她看很多次了,最近終於進入狀況,看了2/3本,接著如我所料,老媽就在昨晚一口氣把《打噴嚏》讀完。我想,沒有人能抗拒《打噴嚏》的結尾攻勢而把書放下吧。

很平常的一天,隔天又回新竹,接下來要應付一堆接續而來的事,不知那一天才會再回家。

2007年4月5日 星期四

PmWiki Plugin:ShowHide (=Fold)

官網:ShowHide

注意事項

如果裝完ShowHide沒作用的話,大概是用的Theme不標準,參照作者的回答修改pub/skins/THEME/THEME.tmpl,在</body>前加上<!–HTMLFooter–>。

相關性低的碎碎唸

(對解決問題有興趣的可以參考)

雖然前陣子覺得DokuWiki實在是強到不行,不過PmWiki也有它方便的地方,操作起來比DokuWiki更簡單一點,另一特點是PmWiki有一堆Plugin(PmWiki稱它的Plugin為Cookbook),結果是我兩套都在用,。

Wiki寫久了會遇到兩個問題,其一是想要只編輯單頁的section,其二是想讓顯示時可以把內容摺起來,點了再展開內容。DokuWiki內建section editing,但沒有fold,用fold當keyword找plugin,一下就找到DokuWiki的folding plugin,鳥的是,PmWiki找半天都找不到。

最近Wiki量愈用愈凶,實在受不了沒有fold的PmWiki,甚至想來研究PmWiki自己寫一個。轉念一想,一定有這個plugin,只是作者用的keyword不是fold。於是我用WordNet查fold的同意字,看到”close up”,再回PmWiki官網搜”close”,掃一下Cookbook區的列表,就找到ShowHide了。

ShowHide裝好後沒有作用,但官網上的例子有效,一開始懷疑是PmWiki版本問題,更新到和官網同版本仍然無效後,再仔細翻該頁的問答,發現是Theme的問題。

備註

找ShowHide的過程裡,看到兩個滿有趣的plugin,有機會可以試試:

2007年4月4日 星期三

Google Image Labeler

官網:Google Image Labeler

系統會幫你找另一個想玩的人,兩人一組看同一張圖,各自給 label, 雙方的label一樣時各+100。

這是幫圖片加semantic tag的好方法啊,高招!至少可以防止含最多semantic tag的都是正妹圖 XD 。下一步就是用圖上的tag強化image search吧。

2007-04-08 Updated

Mr./Ms. Days的Blog有一篇詳細介紹:《玩遊戲,做研究》,說明Google Image Labeler的idea來源和相關發展。

2007年4月3日 星期二

聽風的歌

書藉基本資料: 聽風的歌

這應該是最後一次嘗試村上的作品吧,看書的時候就像在海底隧道隔著強化玻璃看著美麗的海底,一切是這麼自然真實,卻又和我隔著一道看不見、無法打穿的牆,我與書裡描述的真實,似乎相當接近,卻無法相觸。無意識地寫下這段感想,等待那天被自己理解,或是遺忘。

之前herbage推這本,這本又是村上春樹的出道作,就借來看看了。我看的舊版書收錄兩篇故事,第一篇是《開往中國的Slow Boat》,第二篇才是《聽風的歌》。在夜深有種無可奈合的孤寂感時,來看村上春樹的作品才能對味,或許也是那個時間,理性思考退到最後線的時期,才能去除雜訊地感受文字流露的訊息,可惜看書的時間沒配合好,沒有好好享受讀小說的樂趣。

這次看完的感想還是不知所云,看大家對村上春樹的評論反而較有意思,這突顯出我思想上的盲點。然而,在寫心得時又自然地引出了些什麼,覺得好像能再回頭翻出什麼東西,但拿起手邊的書一翻,卻無法找到。

《聽風的歌》裡穿插三頁描述虛構作家哈德費爾的作品《火星的井》,全書只有這段帶來直接衝擊,若這個短篇能完整呈現一定很有意思。轉念一想,其實這三頁已完成《火星的井》想傳達的意識,也無須多做改寫。

google一下可以看到《火星的井》的全文,比方這篇,這篇同時也引用村上的話,說明Blog作者對這短篇摘要的感想:

“人生基本是孤獨的,但同時又能通過孤獨這一頻道同他人溝通。”村上春樹繼續說,“人們總要進入自己一個人的世界,在進得最深的地方就會產生連帶感。或者說人們總要深深挖洞,只要一直挖下去就會在某處同別人連在一起。”

說來也是如此,藉由長年孤獨的自我探索,當遇到同樣探索孤獨的人時,不須太多唇舌,即能從對方散發的氣息獲得共鳴。太過強求而外顯的訊息,少了些自然的韻味。

test “google-code-prettify”

官網:google-code-prettify

這裡看到的,似乎還有些問題。我原本是用Code Auto Escape,功能陽春但還過得去的plugin。先繼續用Code Auto Escape吧。

Ruby

test ruby

#!/usr/local/bin/ruby exit if ARGV.length < 2 # read stop words stop = File.new(ARGV[0]) stop_words = Hash.new() while line = stop.gets line.split.each { |e| stop_words[e] = 1} end stop.close # read text text = File.new(ARGV[1]) count = Hash.new(0) while line = text.gets line.split.each { |e| count[e] += 1 if stop_words[e] == nil } end text.close # dump results count.keys.each { |key| puts "#{count[key]} #{key}" }

Java

test java
Table stopTable = buildStopWordTable(args[0]); // store String Table doc = new HashTableLL(); // store Count BufferedReader br = openFile(args[1]); String s; while ((s=br.readLine()) != null) { StringTokenizer stk = new StringTokenizer(s); while (stk.hasMoreTokens()) { s = stk.nextToken(); if (s.length() == 0 || stopTable.find(s) != null) continue; Count nc = new Count(s); Count c = (Count)doc.find(nc); if (c != null) c.count++; else { doc.add(nc); } } } br.close(); Iterator iterator = doc.getIterator(); while(iterator.hasNext()) { System.out.println(iterator.next()); }

Computer Science? Computer Engineering?

看到flyhermit提的一篇文章《Computer Science 算不算Science ?》,我覺得內文和comment都很有意思,像是comment提到:

Science 和 Engineering 的不同不在難易、方法或甚至內容,不同之處在於目的。

針對”以目的區分 Science 跟 Engineering”這點,我回了一些看法,這裡就直接貼上啦。


套用DL一哥的話,科學家的目的在追尋真理,工程師是解決問題,這個說法不全然正確,但已突顯出明確的差異。

科學和工程都是由人得來的產物,用人來看比較清楚,所以我以科學家和工程師的角度來看。舉例來說,科學家喜歡尋找有趣的問題,那問題不見得要有什麼用,也許有一天會有用,像代數之於密碼學,但科學家在做研究時不見得關心這個。

工程師是看到現存問題,要解決問題,他們不關心沒有用的問題,像是費馬最後定理x^n + y^n = z^n,對n >=3 到底成不成立。 ( 若有位科學家要求工程師寫程式模擬,讓他能依數據猜測思考方向,那麼,由於有使用者要求,這問題對工程師來說,就變成有用的問題了 )

Computer Science的媒介是電腦,現今所有科學都要透過電腦匯整資料,電腦的本質相當應用,天生就是工程師愛用的工具。像Lisp誕生時,Lisp作者John McCarthy的學生想把它變成programming language,John McCarthy笑著對學生說,你沒搞懂,Lisp只是個描述用數學而已。

從結果論來看,John McCarthy發明Lisp時,是在研究科學(數學),他的學生把它變成工具,進一步推演了progamming language的發展,甚至影響到今日PL的設計,開發軟體的設計,變成很有用的東西,於是工程師們用Lisp,或用帶有Lisp理念所設計出的PL (Python,Ruby)解決問題 。

所以我覺得Computer Science本質是很工程的,但它也自有理論基礎,要搞科學也沒問題,只是發展歷史比其它科學淺,看起來比較不科學。從Computer Science背景的人做事來看,視他們的目的,他們可能是科學家,也可能是工程師。

至於美感,不管是科學家還是工程師,在各自領域發展到一個程度,相信有類似氣息的人,都會同意那是種藝術,將人的想法發揮到極致的結晶。而真理這類有爭議的詞,就不在討論範圍內了。

附帶一提,會思考是科學還是工程,是因為我曾煩惱要走那條路,後來發現科學和工程的道路不是兩個點,而是一個spectrum,可以當工程師裡的科學家,也可以當科學家裡的工程師,到不需要拘泥於走那條路,在中間打轉也好,順著興趣發展就好。

我自己原本較偏工程,所以想朝陌生的科學發展看看,兩邊都轉一圈再回來,定能有更有趣的觀點,而且中庸之道尚來是我喜好的,甚至是人生觀的核心概念。

2007年4月1日 星期日

學習決策模式

人生充滿許多決策,不僅是商業上要做決策,個人行為隨時也得做決策,學習決策模式有其必要性。

一個多月前和台大國貿系的朋友去逛國際書展,他推薦看《決策聖經》,號稱商學院必看的經典書,全書收錄14篇論文。從浩然借回來後,我耐著性子看完第一篇,完全不懂。接著我想到我不該試著思考商學院的學生怎麼思考,以我的條件來說,應該要用理工人的角度思考商學,這樣才有我的思考價值,不然只是從頭花大量的時間培養出商學院學生的能力,我不是專讀商學的,再怎麼花時間也達不到他們的水準。

抱著這樣的心態又讀了第二、三篇,還是看不懂,於是我把書還回圖書館。打電話問我朋友,這本書是什麼回事啊,對方回答:「你不覺得條列分明,分析得很清楚嗎?好吧,其實我讀起來也滿吃力的。」我只能說,從理工人的標準來看,我不能接受這算條列分明,雖然有分項,但難以理解。似乎每次讀到理科外的科學都有這種感覺,一來也是非理科的本質較為複雜,資訊混亂不清。

剛才看到這篇《有效的決策》,容易懂多了,大師不愧為大師,可以用很實務的方式描述理論。不過我想等遇到實例時,再回頭依這篇說的方式走一遍,成效會比現在細讀更多。

摘要心得:

  • 區分一般性和特殊性:用三維座標容易理解,X軸為人、Y軸為問題出現次數、Z軸為時間,XY平面上的水平線和垂直線都表示一般化;孤立的點為特殊化,但要區分是否在時間軸上仍是孤立點(預測未來)。一般性問題要參考舊例,特殊性問題要拋棄包袱。
  • 定義問題。
  • 定出邊界條件,決定正確決策的範圍,不要先以可接受的角度選擇,這樣失去界定邊界的意義。
  • 沒有行動的決策只是構想,要考慮具體實現方式:人、時、事、地等。
  • 循序漸進改善決策(iterative evolution)。
  • 要踏入第一線了解實況,和現實脫節做不出有效的決策。

ps

備忘原文出處,萬一link失效了還可以去出處找。

《有效的決策》:作者:彼得 杜拉克,原刊载于《Harvard Business Review》1967 年 1-2月。

定義問題的類型:以邏輯馬賽克為例

昨晚思想爆走,什麼都不想做的情況下,玩了一下邏輯馬賽克。遊戲規則如下:

  • 按左鍵決定該格存不存在方塊。
  • 按shift + 左鍵標示該格為空白。
  • 點出一幅圖案即完成遊戲。
  • 橫軸和縱軸的數字表示該列(行)有多少個方塊,比方第一列寫著135,表示有個三水平長條方塊,長度分別為剛好1、3、5格。

以這樣的遊戲為例,有許多面向可以思考。

依想到的順序條列如下,接著是整理它們之間的關係和重要性:

  1. 解題的演算法:暴力搜尋有2^(15*15)種可能,明顯地不可行。玩一陣子後可以找出一些邏輯規則,藉由邏輯推理的必然性,可以整理出推論的演算法,有系統地嘗試。或是引入Heuristic Algorithm,比方用機率分佈猜測各格存在與否的可能性,從最高可能性的組合試起。修過AI Search的話,有許多方法可試。也可以嘗試用演化計算的觀點亂入,應該很有趣。
  2. 問題是否有解、是否有唯一解:藉由先畫圖反向推出兩軸的數字,可以發現不見得都是唯一解,也不見得都有解。比方兩軸的數字全是 1 ,會有15!種解。也可以發現問題不見得有解;比方橫軸全是15,縱軸全是0會產生矛盾。於是解題的演算法依解題順序產生兩個子問題:是否有解和有多少組解。也可以將兩者統整為同一問題,無解為 0 組解的特例。
  3. 如何產生問題、怎樣才算難的問題:隨機產生圖案再回頭算兩軸的數字為何即可產生問題,但要產生唯一解或困難的問題,得從產生的邏輯組合可能著手,試著由解題演算法反向推出問題困難的模式,像是大數字愈少愈難,從提供數字的組數和大小之間找出困難的平衡,亦可用實驗測試找出可能做法。
  4. 減化或延伸問題:定義相似性而決定近似解的優劣;將問題推廣到3維、N維,即對N維空間(d1, d2, …, dn)來說,di為1 ~ k,針對各軸給定數量限制,共有 n*k 組條件,找出符合的分佈方式決定(d1, d2, …, dn)每一點是否存在。原本的問題是n = 2、k = 15的特例。
  5. 研究問題的性質:在用n, k描述的一般化問題下,發掘n, k對題目或解法的影響,在什麼條件下會有特殊特性?比方n = 1、k = 1的情況下永遠都是唯一解,不會無解。
  6. 統合上述觀點,畫出問題地圖,建立各子問題之間的關係,找出沒看到的問題。亦可針對各個元件決定加入新條件、鬆綁條件會有什麼變化,像鬆綁解的定義就會產生近似解的問題。

偶而做這樣的練習還滿有趣的。最後附上稍微組織過的Mind Map,原本想把上述6項轉為flowchart,做起來不太順,改以Mind Map呈現。

tylerks_process

加深還是加廣

過去我一直覺得只有半調子的思考沒有意義,全世界的人都在看、在想,若自己沒有深入思考到一個程度,不如別思考。但近來能思考的事太多了,類型不同、層面不同,趕不上資料浮現的速度,常造成思緒混亂,開始想著是否要換個方式思考,拼量而非拼質,看看會有什麼變化。

但改變自己思考習慣的代價,是會遺忘自己原本的優勢,所以在這記下目前的觀點,那天轉不回來時,至少還有個「還原點」可以補救 XD 。另外,隨著分類「Life」的快速成長,看來這個Blog還是需要分類「Thinking」,以區分「Life」、「Thinking」和「Life + Thinking」。