① 推荐系统为什么用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进制、字符串、字节串之间的转换