① 推薦系統為什麼用mahout實現
mahout 有基於用戶的協同過濾演算法的hadoop實現經驗豐富 體製程序健全,ok ,原創/
② 如何在Hadoop平台上實現K-means演算法
一、介紹Mahout
Mahout是Apache下的開源機器學習軟體包,目前實現的機器學習演算法主要包含有協同過濾/推薦引擎,聚類和分類三 個部分。Mahout從設計開始就旨在建立可擴展的機器學習軟體包,用於處理大數據機器學習的問題,當你正在研究的數據量大到不能在一台機器上運行時,就 可以選擇使用Mahout,讓你的數據在Hadoop集群的進行分析。Mahout某些部分的實現直接創建在Hadoop之上,這就使得其具有進行大數據 處理的能力,也是Mahout最大的優勢所在。相比較於Weka,RapidMiner等 圖形化的機器學習軟體,Mahout只提供機器學習的程序包(library),不提供用戶圖形界面,並且Mahout並不包含所有的機器學習演算法實現, 這一點可以算得上是她的一個劣勢,但前面提到過Mahout並不是「又一個機器學習軟體」,而是要成為一個「可擴展的用於處理大數據的機器學習軟體」,但 是我相信會有越來越多的機器學習演算法會在Mahout上面實現。[1]
二、介紹K-Means
這是Apache官網上的演算法描述,簡單來說就是基於劃分的聚類演算法,把n個對象分為k個簇,以使簇內具有較高的相似度。相似度的計算根據一個簇中對象的平均值來進行。[2]
三、在Hadoop上實現運行
1,實驗環境
①hadoop集群環境:1.2.1 一個Master,兩個Slaves,在開始運行kmeans時啟動hadoop
②操作系統:所有機器的系統均為ubuntu12.04
③Mahout版本:採用的是0.5版
2,數據准備
數據採用的是 這是網上提供的一個比較不錯是數據源。然後用指令 hadoop fs -put /home/hadoop/Desktop/data testdata,將在我桌面的文件data上傳到HDFS的testdata目錄下,這里為什麼是testdata,我也正在思考,因為我本來是上傳到 input里,但是運行時提示could not find ….user/testdata之類的,所以現改為了testdata。
3,運行
①配置Mahout環境:在Apache官網下載Mahout的版本,我選擇的是0.5。然後解壓到你指定的目錄,將此目錄路徑寫入/etc/profile,添加如下語句:
export MAHOUT_HOME=/home/hadoop/hadoop-1.2.1/mahout-distribution-0.5
export HADOOP_CONF_DIR=/home/hadoop/hadoop-1.2.1/conf
export PATH=$PATH:/home/hadoop/hadoop-1.2.1/bin:$MAHOUT_HOME/bin
然後執行 source /etc/profile。在mahout目錄下執行bin/mahout命令,檢測系統是否安裝成功。如圖:
註:此處修改環境變數有些網上提示是/etc/bash.bashrc,我也試著修改過,但是發現在我這里使環境變數生效的是profile。
②運行Mahout里自帶的K-Means演算法,bin/mahout org.apache.mahout.clustering.syntheticcontrol.kmeans.Job,這里啟動後遇到了一點問題,提示 Could not find math.vector。
4,結果
在我的環境下運行5分鍾左右,最後生成一個文件,如圖
四、總結
Mahout是一個很強大的數據挖掘工具,需要進行更深層的了解。
③ mahout包括哪些演算法
一、分類演算法
(一)Logistic 回歸(SGD)
(二)Bayesian
(三)SVM
(四)Perceptron 和Winnow
(五)神經網路
(六)隨機森林
(七)受限玻爾茲曼機
(八)Boosting
(九)HMM
(十)Online Passive Aggressive
二、聚類演算法
(一)Canopy
(二)K-Means
(三)Fuzzy K-means
(四)EM
(五)Mean shift
(六)層次聚類
(七)Dirichlet process
(八)LDA
(九)Spectral
(十)MinHash
(十一)Top Down
三、推薦演算法
Mahout包括簡單的非並行的推薦和基於Hadoop的並行推薦的實現。
(一)非並行推薦
(二)分布式的基於Item的協同過濾
(三)並行矩陣分解的協同過濾
四、關聯規則挖掘演算法
並行FP-Growth
五、回歸
Locally Weighted Linear Regression
六、降維
(一)SVD
(二)SSVD
(三)PCA
(四)ICA
(五)GDA
七、進化演算法
八、向量相似性計算
④ mahout推薦當uid是uuid(16進制字元串)而不是Long型的處理方式
最近在做使用mahout做協同過濾推薦的時候,發現無論是數據源還是推薦函數的介面user_id必須是Long型的變數
由於業務提供的 user_id 是 uuid ,所以是個字元串類型,並且 item_id (做的是崗位推薦,即為job_id)也是 uuid 類型,於是另外再弄三張表 uid-uuid , jid-jjid , uid-jid-score 的映射,但是這樣做實在太麻煩了,我分析用戶日誌存儲用戶偏好表還要再多維護所有用戶和所有崗位表,遂開始研究 uuid 和 uid 能不能做個映射。
首先了解一下 UUID :
重點來了:
我現在需要處理的 uuid 就是這個 標準的UUID格式 ,了解了UUID的構成以後我們就好辦了:
1. 首先將uuid去掉連接符,從原先的uuid格式字元串轉化為沒有連接符的16進制字元串
2. 將16進制字元串轉化為10進制數(內部使用mahout介面)
用BigInt來存儲這個唯一的十進制數,這樣就構成了一種映射。
查了下python的內置uuid庫的API用法:
這里我直接用 python 演示( python3 )
輸出見下圖
寫完的時候google了一下發現牆外面也有不少討論這個的,mahout官方也是說要做轉換,直接用字元串類型進入推薦演算法,效率會特別慢!
如下:
Why user id and item id must be long type ?
how to map uuid to userid in preference class to use mahout recommender
mahout-user mailing list archives:UUID based user IDs
參考:
Python 3.x 格式化輸出字元串 % & format 筆記
python常用的十進制、16進制、字元串、位元組串之間的轉換