2013年4月30日 星期二

Kalman Filter 簡介

一開始先講,這裡的filter是什麼呢
假設從初始時間開始,系統就紀錄了某一系統狀態的值
而這個值受到雜訊的影響, 所以你不能直接拿來用

利用從第一筆資料到目前的資料,來估算之前某一時刻的狀態值, 這種演算法稱為smoothing
利用從第一筆資料到目前的資料,來估算目前的狀態值, 這種演算法稱為filtering
利用從第一筆資料到目前的資料,來估算未來某一時刻的狀態值, 這種演算法稱為prediction

Kalman filter只是在做上述的filtering動作,這方法源自於Kalman在1960年代發表的論文,連結如下
http://www.cs.unc.edu/~welch/kalman/media/pdf/Kalman1960.pdf 


Kalman filter概念

為了簡單快速了解,這裡舉了一個簡單的例子來說明Kalman filter的概念

假設我們要研究一個房間的溫度,根據經驗判斷,這個房間是恆溫的。
但事實上,房間不是恆溫的,你的經驗估出來的溫度,可能會有幾度的誤差,這些誤差就是所謂的 white Gaussian noise,和時間無關地的雜訊。

此外,我們也在房間內放了一支溫度計,但溫度計也不是準確的,測量值和實際值也存在著誤差( white Gaussian noise )。

接下來,Kalman filter要做的事,就是根據你的經驗法則和溫度計量到的溫度,來估算房間實際的溫度。
這邊要注意的是,這個估算出來的實際溫度也會有誤差,但隨著時間往後,每次算出來的實際溫度的誤差也會越來越小!

計算過程:
經驗法則預測的誤差 和 溫度計的誤差為已知的系統參數

Step 1 , state and covariance prediction
假設我們要估算時間K的實際溫度,首先我們根據K-1時刻的溫度,來預測K時刻的溫度。
假設K-1時刻時,房間溫度是23度,我們預測K時刻房間溫度也是23度K時刻預測的誤差為5度

這邊的5度是如何得知的呢?如果K-1時刻實際溫度的誤差是3,經驗法則預估的誤差為4,那麼將他們平方相加在開根號,就是K時刻預測的誤差。

然後再去看我們溫度計量出來的結果,假設為25度,同時該溫度計的誤差是4度。

Step 2 , Kalman gain correction and state correction
我們預測房間溫度是23度,測量到的溫度是25度,那麼實際溫度到底是多少呢?
該相信哪邊多一點呢? 這邊就要看Kalman gain了。
Kalman gain的計算要用到前面的兩個誤差  
Kg^2 = 5^2 /  (5^2 + 4^2) = 0.78

Kalman gain的值,我們可以推算出K時刻的實際溫度是
預測值 + Kalman gain * (量測值 - 預測值)
23 + 0.78* (25 -23) = 24.56
這邊可以看出,因為溫度計的誤差較K時刻預測的誤差小(比較相信溫度計),所以實際溫度偏向溫度計的值

Step 3 , covariance correction
但是這個實際溫度還是有誤差,可由以下式子算出K時刻實際溫度的誤差
((1-Kg)*5^2)^0.5=2.35 
這裡的5是K時刻預測的誤差,算出來的2.35對應到前面的3 (K-1時刻的實際溫度誤差)
接下來我們就可以進入K+1時刻了!

根據以上規則,Kalman filter一直迭代下去,
我們可以發現實際溫度的誤差(covariance)會慢慢的變小,我們得到的實際溫度也會越來越準確!


看完以上部分,是否對Kalman filter有簡單的認識呢?
關於Kalman filter演算法嚴謹的數學描述,有時間我會在本篇文章繼續更新!


參考資料:
http://bilgin.esme.org/BitsBytes/KalmanFilterforDummies.aspx
http://allenluadvance.blogspot.tw/2009/09/kalman-filter.html
http://tw.knowledge.yahoo.com/question/question?qid=1009071507134
http://www.cs.unc.edu/~welch/kalman/media/pdf/Kalman1960.pdf 






2013年4月24日 星期三

Information Retrieval

最近比賽要用到的query expansion,是Information Retrieval領域的一部分
以下為參考資料

陳信希教授開的 Information Retrieval and Extraction 

只有2009年這課程的投影片沒設密碼,所以這邊貼出09年的課程網站
不過還是可以根據底下列的推薦用書去查query expansion部分
連結:http://nlg.csie.ntu.edu.tw/courses/IR/IR2009.html

Introduction to Information Retrieval 

2008出版的IR參考書,官網上有電子書和投影片,我們要的query expansion在第九章
連結:http://nlp.stanford.edu/IR-book/


Modern Information Retrieval

整個第五章在講query expansion,礙於版權問題,就不放連結
去GOOGLE一下就有電子書了
http://www.cs.utexas.edu/~mooney/ir-course/
這連結是本書的相關課程的投影片

2013年4月11日 星期四

如何在.NET平台繪製統計圖表 (使用C# + ZedGraph函式庫)

首先先去官方網站http://zedgraph.sourceforge.net/linesamples.html
下載ZedGraph之後

導入visual studio 2010

在visual studio 2010的工具箱,右鍵→選擇項目→在.NET FRAMEWORK的頁面下按瀏覽,
找到ZedGraph.dll,加入後就可以在工具箱看到ZedGraphControl了


簡介


將ZedGraphControl拉近程式後,可以看到空的圖表,如果要看title、X axis、Y axis這幾個字樣不爽的話,我們可以透過以下的程式碼來修改


zedGraphControl1.GraphPane.Title.Text = "標題測試";
zedGraphControl1.GraphPane.XAxis.Title.Text = "X軸";
zedGraphControl1.GraphPane.YAxis.Title.Text = "Y軸";



接下來我們以長條圖和折線圖作範例

首先定義資料


double[] data1 = { 1, 3, 5, 7, 9, 11 };

double[] data2 = { 2, 4, 6, 8, 10, 12 };

double[] data3 = { 5, 2, 6, 7, 5, 2 };



長條圖

BarItem myBar;  //長條圖
myBar = zedGraphControl1.GraphPane.AddBar("資料1", null, data1, Color.Red);
myBar.Bar.Fill = new Fill(Color.Red, Color.White, Color.Red);
myBar = zedGraphControl1.GraphPane.AddBar("資料2", null, data2, Color.Green);
myBar.Bar.Fill = new Fill(Color.Green, Color.White, Color.Green);
myBar = zedGraphControl1.GraphPane.AddBar("資料3", null, data3, Color.Purple);
myBar.Bar.Fill = new Fill(Color.Purple, Color.White, Color.Purple);

折線圖

LineItem myCurve;   //折線圖

myCurve = zedGraphControl1.GraphPane.AddCurve("資料1", null, data1, Color.Red);
myCurve.Line.Fill = new Fill(Color.Red, Color.White, Color.Red);
myCurve = zedGraphControl1.GraphPane.AddCurve("資料2", null, data2, Color.Green);
myCurve.Line.Fill = new Fill(Color.Green, Color.White, Color.Green);
myCurve = zedGraphControl1.GraphPane.AddCurve("資料3", null, data3, Color.Purple);
myCurve.Line.Fill = new Fill(Color.Purple, Color.White, Color.Purple);

以上二選一,接下來設定座標軸資料、更新圖表,就可以畫出統計圖了!


string[] xTitle = { "1", "2", "3", "4", "5", "6" }; //X軸的刻度資料
zedGraphControl1.GraphPane.XAxis.Scale.TextLabels = xTitle;
zedGraphControl1.GraphPane.XAxis.Type = AxisType.Text;
zedGraphControl1.GraphPane.Chart.Fill = new Fill(Color.White, Color.FromArgb(255, 255, 166), 90F);
zedGraphControl1.GraphPane.Fill = new Fill(Color.FromArgb(250, 250, 255));
zedGraphControl1.AxisChange();
zedGraphControl1.Refresh();

如果要清除統計圖,可以這樣做

zedGraphControl1.GraphPane.CurveList.Clear();//把舊的圖資清掉


2013年4月6日 星期六

26個應聘時最漂亮的回答

覺得這篇文章還不錯,就轉過來了
轉貼自:http://aobiman.blogspot.tw/2013/03/26.html  (原始出處不可考)



1、請你自我介紹一下自己好嗎?
  
  回答提示:一般人回答這個問題過於平常,只說姓名、年齡、愛好、工作經驗,這些在簡歷上都有。
其實,企業最希望知道的是求職者能否勝任工作,包括:最強的技能、最深入研究的知識領域、個性中最積極的部分、
做過的最成功的事,主要的成就等,這些都可以和學習無關,也可以和學習有關,但要突出積極的個性和做事的能力,
說得合情合理企業才會相信。企業很重視一個人的禮貌,求職者要尊重考官,在回答每個問題之後都說一句“謝謝”,企業喜歡有禮貌的求職者。
  
2、你覺得你個性上最大的優點是什麼?
  
  回答提示:沉著冷靜、條理清楚、立場堅定、頑強向上、樂於助人和關心他人、適應能力和幽默感、樂觀和友愛。
我在北大青鳥經過一到兩年的培訓及專案實戰,加上實習工作,使我適合這份工作。
  
3、說說你最大的缺點?
  
  回答提示:這個問題企業問的概率很大,通常不希望聽到直接回答的缺點是什麼等,如果求職者說自己小心眼、愛忌妒人、非常懶、脾氣大、工作效率低,企業肯定不會錄用你。
絕對不要自作聰明地回答“我最大的缺點是過於追求完美”,有的人以為這樣回答會顯得自己比較出色,但事實上,他已經岌岌可危了。
企業喜歡求職者從自己的優點說起,中間加一些小缺點,最後再把問題轉回到優點上,突出優點的部分,企業喜歡聰明的求職者。
  
4、你對薪資的要求?
  
  回答提示:如果你對薪酬的要求太低,那顯然貶低自己的能力;如果你對薪酬的要求太高,那又會顯得你分量過重,公司受用不起。
一些雇主通常都事先對求聘的職位定下開支預算,因而他們第一次提出的價錢往往是他們所能給予的最高價錢,他們問你只不過想證實一下這筆錢是否足以引起你對該工作的興趣。
  
  回答樣本一:我對工資沒有硬性要求,我相信貴公司在處理我的問題上會友善合理。
                       我注重的是找對工作機會,所以只要條件公平,我則不會計較太多。
  
  回答樣本二:我受過系統的軟體程式設計的訓練,不需要進行大量的培訓,而且我本人也對程式設計特別感興趣。
                       因此,我希望公司能根據我的情況和市場標準的水準,給我合理的薪水。
  
  回答樣本三:如果你必須自己說出具體數目,請不要說一個寬泛的範圍,那樣你將只能得到最低限度的數字。
最好給出一個具體的數字,這樣表明你已經對當今的人才市場作了調查,知道像自己這樣學歷的雇員有什麼樣的價值。
  
5、你對加班的看法?
  
  回答提示:實際上好多公司問這個問題,並不證明一定要加班,只是想測試你是否願意為公司奉獻。
  
  回答樣本:如果工作需要我會義不容辭加班,我現在單身,沒有任何家庭負擔,可以全身心的投入工作。但同時我也會提高工作效率,減少不必要的加班。
  

  
6、如果通過這次面試我們錄用了你,但工作一段時間卻發現你根本不適合這個職位,你怎麼辦?
  
  回答提示:一段時間發現工作不適合我,有兩種情況:①如果你確實熱愛這個職業,那你就要不斷學習,
虛心向領導和同事學習業務知識和處事經驗,瞭解這個職業的精神內涵和職業要求,力爭減少差距;②你覺得這個職業可有可無,
那還是趁早換個職業,去發現適合你的,你熱愛的職業,那樣你的發展前途也會大點,對單位和個人都有好處。
  
7、談談你對跳槽的看法?
  
  回答提示:①正常的“跳槽”能促進人才合理流動,應該支持。②頻繁的跳槽對單位和個人雙方都不利,應該反對。
  
8、工作中難以和同事、上司相處,你該怎麼辦?
  
  回答提示:①我會服從領導的指揮,配合同事的工作。②我會從自身找原因,仔細分析是不是自己工作做得不好讓領導不滿意,
同事看不慣。還要看看是不是為人處世方面做得不好,如果是這樣的話我會努力改正。③如果我找不到原因,我會找機會跟他們溝通,
請他們指出我的不足,有問題就及時改正。④作為優秀的員工,應該時刻以大局為重,即使在一段時間內,領導和同事對我不理解,
我也會做好本職工作,虛心向他們學習,我相信,他們會看見我在努力,總有一天會對我微笑的。
  
9、你對於我們公司瞭解多少?
  
  回答提示:在去公司面試前上網查一下該公司主營業務。如回答:貴公司有意改變策略,加強與國外大廠的OEM合作,自有品牌的部分則透過海外經銷商。
  
10、最能概括你自己的三個詞是什麼?
  
  回答提示:我經常用的三個詞是:適應能力強,有責任心和做事有始終,結合具體例子向主考官解釋,
  
11、你的業餘愛好是什麼?
  
  回答提示:找一些富於團體合作精神的,這裡有一個真實的故事:有人被否決掉,因為他的愛好是深海潛水。主考官說:因為這是一項單人活動,我不敢肯定他能否適應團體工作。
  

  
12、作為被面試者給我打一下分?
  
  回答提示:試著列出四個優點和一個非常非常非常小的缺點(可以抱怨一下設施,沒有明確責任人的缺點是不會有人介意的)。
  
13、你為什麼要離開原來的公司?
  
  回答提示:①回答這個問題時一定要小心,就算在前一個工作受到再大的委屈,對公司有多少的怨言,都千萬不要表現出來,
尤其要避免對公司本身主管的批評,避免面試官的負面情緒及印象。建議此時最好的回答方式是將問題歸咎在自己身上,
例如覺得工作沒有學習發展的空間,自己想在面試工作的相關產業中多加學習,或是前一份工作與自己的生涯規劃不合等等,
回答的答案最好是積極正面的。②我希望能獲得一份更好的工作,如果機會來臨,我會抓住。我覺得目前的工作,已經達到頂峰,即沒有升遷機會。
  
14、你欣賞哪種性格的人?
  
  回答提示:誠實、不死板而且容易相處的人、有“實際行動”的人。
  
15、你通常如何對待別人的批評?
  
  回答提示:①沈默是金,不必說什麼,否則情況更糟,不過我會接受建設性的批評。②我會等大家冷靜下來再討論。
  
16、怎樣對待自己的失敗?
  
  回答提示:我們大家生來都不是十全十美的,我相信我有第二個機會改正我的錯誤。
  

  
17、你為什麼願意到我們公司來工作?
  
  回答提示:對於這個問題,你要格外小心,如果你已經對該單位作了研究,你可以回答一些詳細的原因,像“公司本身的高技術開發環境很吸引我。
”、“我同公司出生在同樣的時代,我希望能夠進入一家與我共同成長的公司。”、“你們公司一直都穩定發展,在近幾年來在市場上很有競爭力。
”、“我認為貴公司能夠給我提供一個與眾不同的發展道路。”這都顯示出你已經做了一些調查,也說明你對自己的未來有了較為具體的遠景規劃。
  
18、對這項工作,你有哪些可預見的困難?
  
  回答提示:①不宜直接說出具體的困難,否則可能令對方懷疑應聘者不行。②可以嘗試迂回戰術,
說出應聘者對困難所持有的態度——工作中出現一些困難是正常的,也是難免的,但是只要有堅忍不拔的毅力、良好的合作精神以及事前周密而充分的準備,任何困難都是可以克服。
  
19、如果錄用了你,你將怎樣開展工作?
  
  回答提示: ①如果應聘者對於應聘的職位缺乏足夠的瞭解,最好不要直接說出自己開展工作的具體辦法。
②可以嘗試採用迂回戰術來回答,如“首先聽取領導的指示和要求,然後就有關情況進行瞭解和熟悉,接下來制定一份近期的工作計畫並報領導批准,最後根據計畫開展工作。”。
  
  分析:這個問題的主要目的也是瞭解應聘者的工作能力和計劃性、條理性,而且重點想要知道細節。如果向思路中所講的迂回戰術,面試官會認為回避問題,如果引導了幾次仍然是回避的話,此人絕對不會錄用了。
  
20、你希望與什麼樣的上級共事?
  
  回答提示:①通過應聘者對上級的“希望”可以判斷出應聘者對自我要求的意識,這既上一個陷阱,又是一次機會。②最好回避對上級具體的希望,多談對自己的要求。③如“做為剛步入社會的新人,我應該多要求自己儘快熟悉環境、適應環境,而不應該對環境提出什麼要求,只要能發揮我的專長就可以了。
  
  分析:這個問題比較好的回答是,希望我的上級能夠在工作中對我多指導,對我工作中的錯誤能夠立即指出。總之,從上級指導這個方面談,不會有大的紕漏。
  
21、與上級意見不一時,你將怎麼辦?
  
  回答提示:①一般可以這樣回答“我會給上級以必要的解釋和提醒,在這種情況下,我會服從上級的意見。”②如果面試你的是總經理,而你所應聘的職位另有一位經理,且這位經理當時不在場,可以這樣回答:“對於非原則性問題,我會服從上級的意見,對於涉及公司利益的重大問題,我希望能向更高層領導反映。”
  
  分析:這個問題的標準答案是思路①,如果用②的回答,必死無疑。你沒有摸清楚改公司的內部情況,先想打小報告,這樣的人沒有人敢要。
  

  
22、為什麼選擇我們公司?
  
  回答提示:曾經在報章雜誌看過關於貴公司的報導,與自己所追求的理念有志一同。而貴公司在業界的成績也是有目共睹的,而且對員工的教育訓練、升遷等也都很有制度。
  
  分析:去面試前先做功課,瞭解一下該公司的背景,讓對方覺得你真的很有心想得到這份工作,而不只是探探路。
  
  23、談談如何適應辦公室工作的新環境?
  
  回答提示①辦公室裡每個人有各自的崗位與職責,不得擅離崗位。②根據領導指示和工作安排,制定工作計畫,提前預備,並按計劃完成。③多請示並及時彙報,遇到不明白的要虛心請教。④抓間隙時間,多學習,努力提高自己的政治素質和業務水準。
  
24、除了本公司外,還應聘了哪些公司?
  
  回答提示:很奇怪,這是相當多公司會問的問題,其用意是要概略知道應徵者的求職志向,所以這並非絕對是負面答案,就算不便說出公司名稱,也應回答“銷售同種產品的公司”,如果應聘的其他公司是不同業界,容易讓人產生無法信任的感覺。
  
25、你還有什麼問題要問嗎?
  
  回答提示:企業的這個問題看上去可有可無,其實很關鍵,企業不喜歡說“沒問題”的人,因為其很注重員工的個性和創新能力。企業不喜歡求職者問個人福利之類的問題,如果有人這樣問:貴公司對新入公司的員工有沒有什麼培訓項目,我可以參加嗎?或者說貴公司的晉升機制是什麼樣的?企業將很歡迎,因為體現出你對學習的熱情和對公司的忠誠度以及你的上進心。
  
26、如果你被錄用,何時可以到職?
  
  回答提示:大多數企業會關心就職時間,最好是回答“如果被錄用的話,到職日可按公司規定上班”,但如果還未辭去上一個工作、上班時間又太近,似乎有些強人所難,因為交接至少要一個月的時間,應進一步說明原因,錄取公司應該會通融的。
  

2013年4月1日 星期一

雲端計算 (cloud computing) 簡介

最近參加【 2013 騰雲駕霧 Big Data 創意程式大賽】,因應比賽需要了解一些雲端計算的知識,因此把最近學到的雲端計算知識記錄下來

雲端服務分為以下三種
1. SAAS (software as a service)
提供軟體服務,像是GMAIL、google document...等


2. PAAS (paltform as a service)
提供平台服務,像是Hadoop、微軟的windows Azure

3. IAAS (infrastructure as a service)
提供硬體服務,也就是租給你硬體設備給你,這些硬體不一定是真的硬體(用VM虛擬出來的虛擬主機)

這次比賽我們所要做的就是SAAS

關於SAAS應用部分,以下列舉一些例子

趨勢騰雲駕霧 2009年冠軍:Location plus
Location Plus從大量的批踢踢BBS文章中,找出臺灣17個城市的熱門話題,每個城市提供30個熱門話題和相關的參考詞,可以讓使用者用這些熱門話題來搜尋Yahoo知識+、生活+、無名小站等內容,此外,也提供了手機版介面,讓使用者到任何地方就知道當地有哪些熱門話題。

趨勢騰雲駕霧 2011冠軍:http://www.trend.org/event/2011contest/news.html
不知是做什麼的,有空再來查

趨勢:年底前防毒產品將大量導入雲端防毒技術
http://www.ithome.com.tw/itadm/article.php?c=60065
我想這也是趨勢辦比賽的原因吧

根據趨勢提供的教程,以下為可能用到的技術及工具 (更新中)

技術

Map-Reduce:將演算法拆成很多份工作,丟到N台電腦平行執行的技術

H-base:一種分散式資料庫,並非建立在關聯模型上的關聯式資料庫

平台

Zookeeper:Zookeeper是一個分散式系統的架構,整合了許多工具。在這邊只好貼上官網對於zookeeper的介紹
ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services. All of these kinds of services are used in some form or another by distributed applications. Each time they are implemented there is a lot of work that goes into fixing the bugs and race conditions that are inevitable. Because of the difficulty of implementing these kinds of services, applications initially usually skimp on them ,which make them brittle in the presence of change and difficult to manage. Even when done correctly, different implementations of these services lead to management complexity when the applications are deployed.

學習 Apache ZooKeeper
 http://ricky906.blogspot.tw/2012/01/zookeeper.html


Chubby:跟Zookeeper一樣功能的系統,由google開發,詳情參考這篇文章

Hadoop: 可以讓我們實現map-reduce的平台,其檔案系統為HDFS。以下是國網中心的免費hadoop系統   http://hadoop.nchc.org.tw/


工具

Flume:未知,目前還沒有感覺...

Sqoop:將關聯式資料庫(如MYSQL、Oracle) 和 Hadoop的資料互相轉移的工具
           
Hive: an SQL-like interface to Hadoop,讓使用者可以用SQL語法對HDFS做存取

Pig:一種script language,簡化了Hadoop常見的工作任務,可以使我們寫Map-Reduce程式更加簡單,關於pig和hive的介紹與比較,可以參考http://book.douban.com/annotation/17153277/


Oozie:在Hadoop中執行的任務有時候需要把多個Map/Reduce作業連接到一起,這樣才能夠達到目的。在Hadoop中,有一種workflow scheduler叫做Oozie,它讓我們可以把多個Map/Reduce作業組合到一個邏輯工作單元中,從而完成更大型的任務。
           PS:當時資料探勘HW3的canopy +  k-mean,整套流程用了很多Map-Reduce,k-mean每迭代一次,就是一次的Map-Reduce,當時這邊我是寫批次檔達成目的,當時批次檔所扮演的角色,我想就是Oozie了。這邊有Oozie的一些簡單範例

Machout:Machout是一個資料探勘的函式庫。在Mahout中,提供了好幾大類的演算法,像是Recommendation System(Mahout中專指Collaborative Filtering的推薦)、分類演算法、分群演算法、Pattern Mining (fp-growth)、Dimension Reduction,以及Vector Similarity等,在每一類裡,又各自提供多種經典演算法的實作。
以分類演算法來說,它目前就提供了像Bayesian、Support Vector Machine、Neural Network,以及Hidden Markov Models等等常見的演算法實作。

HUE:HUE是Hadoop的web UI,可以讓我們更方便的使用hadoop,而不需要面對command line,以下引用官網的一句話
Hue’s target is the Hadoop user experience and lets users avoid the command line interface and have them focus on visibility and getting results quickly.








如何在google blog貼程式碼


首先打開部落格的後台
範本→編輯HTML→勾選小裝置範本
然後在

.post-body {
  position: relative;
}

這段程式碼前面貼上

CODE {
display: block; /* fixes a strange ie margin bug */
font-family: Courier New;
font-size: 8pt;
overflow:auto;
background: #f0f0f0 url(http://klcintw.images.googlepages.com/Code_BG.gif) left top repeat-y;
border: 1px solid #ccc;
padding: 10px 10px 10px 21px;
max-height:200px;
line-height: 1.2em;
}


之後在部落格貼程式碼時,打完程式碼後,進到HTML模式,在程式碼前後加上
<code>和</code>,就會有這篇文章上面的功能了