一個數據挖掘算法的項目:dami

      (更新於2014/01/26)關注和學習數據挖掘不少年,現在數據挖掘算法已經非常多了,比較出名的基本都能找到實現好的。掌握一個算法原理十分重要,但我覺得實現一遍算法對於算法的如何適用數據纔是最有幫助的。一些挖掘工具遇到大量點的數據集就喫不消,可能是對內存不珍惜,可能是對計算不節儉等等。感覺到寫出一個能在海量規模下實用的算法應該還是有意義,能鍛鍊技術。最近業餘時間多一些,也就開始想把之前工作之餘寫過的算法重新彙總一下。很久不寫博客有點不太好。

     於是給自己建了個項目:dami 是data mining的前兩個字符組合, 

     在githubs https://github.com/lgnlgn/dami 能下到源碼

(這個項目最終會合併到feluca裏作爲單機部分)

      dami的目標是能夠高效地在單機上處理海量數據,達到億的級別。當然現在海量數據都分佈式了,有MPI\MR\BSP等各種並行處理框架, 算法也基本都被並行化了。但是可能很多人還沒這種條件,因此在單機做實驗或者工程還是有需要的。

       dami用java的原因主要有幾個,1:我覺得數據挖掘很大一部分時間是讓數據在模型裏跑,這部分開銷不可避免因此語言影響不會太大;2:java使用廣泛,效率也不差太多,代碼測試的時候覺得只用java基本類型也挺夠快了;3:另外這個項目學習爲主,希望更多的人能加入一起,當然最重要的原因還是當前我對java和python最熟悉。

       爲了能讓算法在達到單機有限內存處理大量數據,我主要用了兩個思路:一是數據集留在磁盤,只留模型在內存;二是數據ID化,儘可能連續地存放,並用id做檢索。而很多算法要迭代多次掃數據集,因此IO必須足夠快,而如果用java每次都解析文本,那速度實在不能忍,加上java的String的處理效率不行,內存控制不能. 所以我採用高效的字節流。也因此,每個數據集都得轉換成字節碼存放在文件裏。對一個算法的格式而言,轉換的工作無聊而繁瑣,但是又必須進行,雖然理論上是每條數據可以獨立地流式處理,不存在內存問題,但java字符流速度使處理速度不如人意。

增加了兩個基礎庫:1. 數據向量池,通過一個小緩存進行一邊讀一邊寫的異步IO,提高CPU使用率;2. 簡單的純ID的數據的解析工具類,就是簡單把文本字符的ascii碼取出,對照ascii碼錶與數值有關的字符,包括'0123456789+-.',其他字符一律當成分隔符。

       dami有幾個算法,基本都在我博客上能找到,列表如下,將會不斷更新:

目前有:

  • 分類:SGD邏輯迴歸 L1以及L2
  • 推薦:SlopeOne\SVD\RSVD\ItemNeighborSVD
  • 顯著檢驗:隨機交換
  • 圖挖掘:pagerank

下一步推出:

  • 近似查找:simhash(結構不太一樣,暫不放進去了
  • 爭取實現SGD邏輯迴歸的hadoop版

未來需要:

  • 其他算法

      基礎庫部分,接口基本上階段性完成了,可能還需要些深入測試,那麼實現算法只需要關心核心計算。如果有哪位朋友也希望加入項目一起學習、增加算法、提出意見,歡迎隨時留言聯繫,郵箱:gnliang10 [at] 126.com 或QQ:一久叄35三⑤三


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章