mahout 学习

---------------------
运行
hadoop jar mahout-examples-0.9-job.jar org.apache.mahout.cf.taste.hadoop.item.RecommenderJob --input /input2/intro.txt --output /out3 --usersFile /users.txt --booleanData --similarityClassname SIMILARITY_COOCCURRENCE

mahout不与hadoop2.2兼容,需要重新编译下载
csdn: mahout0.9 jar支持hadoop2
http://download.csdn.net/download/fansy1990/7166055

运行n长时间 多个mapper reducer 但是出来的结果还是不对
用户3的结果 3 [106:3.3,102:3.0833333,103:3.0625]
但是正确答案是 103
吐槽一下 mahout太山寨了

-----------------------
Mahout用两种方式来实现推荐引擎
1, 单机
用基于用户,物品,模型的方式
-- 出来的结果很奇怪,很多都不对
2, 分布式 
共现矩阵
-- 简单易于理解
-- 易用性好, 可以支持评分或不评分



--------------- 推荐------------------
场景
1, 推荐用户可能感兴趣的商品
2, 推荐用户可能认识的好友
3, 分析大量文章之间的超链接关系
4, 去哪里吃饭

实际运用
当当,豆瓣会展现买了X1的人也会买X2
淘宝会在一些页面侧面推荐一些你所查询过的物品


推荐算法分为基于用户, 基于物品的

基于物品 (物以类聚)更加实用
基于物品的算法容易理解,更适合于大数据, 而且如果产品小于用户数的话, 性能更优。

公式
物物之间的共生矩阵 * 该用户偏好值的向量
共生矩阵 - 两件商品被同时购买的次数 - 针对所有选定的用户
A B C D
A NA 3 4 4
B 3 NA 3 2
C 4 3 NA 3
D 4 2 3 NA


原理
如果用户喜欢物品A, 而且物品A和物品B同时出现的次数很多, 推荐物品B

基于用户 (人以群分)
从相邻用户中找到推荐物品。
问题是
如何找到相邻用户,选取几个相邻用户作为参考呢?
寻找相邻用户的方法(排除随机寻找)
1, 皮尔逊相关系数 (默认) PersonCorrelationSimiliarity
线性关系, 偏好值一起增大或减小。
类似于余弦相似性,用角度来判断。
再用权重来优化 (Weighting)

2, 欧式距离 最简单
计算偏好度的直线距离


3, 对数似然 LogLikelihood
当偏好度是个boolean型的, 即没有具体的数字时使用。
是谷本系数的增强版


4, 基于聚类
将物品推荐给相似的用户族,而不是具体用户


----------- 分类(有监督学习)----------
分类场景
1, 过滤垃圾邮件
2, 信用卡欺诈
3, 保险,电信预测客户流失

步骤
1, 提取特征值
   a> 预处理  产生用作训练样本的可分类数据(将多张表的数据转成一行记录)
   b> 转换成向量 Vector -- 就是一个map的形式

2, 选择/训练算法 生成model目录
Logistic  (S函数, 梯度下降)
朴素贝叶斯 (概率统计)
P(yes|E) = P(E1|yes) *  P(E2|yes) *  P(E3|yes) *  P(E4|yes) *  P(yes) /P(E)
P(no|E) = P(E1|no) *  P(E2|no) *  P(E3|no) *  P(E4|no) *  P(no) /P(E)

随机森林(先训练大量的简单的分类器,然后通过投票机制得出唯一的结果)
k近邻算法 (距离计算,但是运行量大)
决策树 (香农熵, 信息增益)

3, 检验结果
summary  
confusion matrix


归一化数值
将特征值的数据都换算成0-1, 避免结果被特征中的大值所左右。


文本转换成向量
文本数据是海量的, 其中蕴含大量的知识,文本转换成向量是发现知识的第一步。

向量空间模型 Vector Space Model
word1 w2 w3
document1 1 2
d2 3
d3 10 11



TF-IDF 词频-逆文档频率
如果包含词语w的文档越少, IDF就越大, 说明w具有很好的类别区分能力。

问题
自带的贝叶斯只能针对20news, 如果自己新建一个简单的测试用例,就无法运行。


mahout
优点: 
和hadoop无缝集成 / 有现存的API,可以直接调用

缺点:
缺少对底层算法的理解 / 出了问题难以解决

python
优点: 对底层比较理解
缺点: 和hadoop集成, 算法都需要自己来写



----------- 聚类(无监督学习)-----------
--聚类有点像自动分类

场景:
新闻聚类
查看排名靠前的关键字
地图中的中心点   center hub

K-Means步骤
1, 寻找聚类中心
2, 计算每个点到聚类中心的距离, 并将每个点划分到离该点最近的中心(聚类)。
3, 计算聚类中所有点的坐标平均值,并将这个平均值设为新的聚类中心。
循环上述步骤, 直到聚类收敛 即本次迭代与上次迭代的结果相同。


运行reuters的实例, 可以看到Top Terms(每个聚类中的前10个词的排名)

Top Terms:
comp.graphics                           =>      68.00439453125
jpeg                                    =>   55.91266632080078
gif                                     =>   29.98711585998535
image                                   =>   28.28740692138672
jfif                                    =>  27.233814239501953
graphics                                =>   26.90915870666504
tiff                                    =>   26.35403060913086
phigs                                   =>    25.4221248626709
siggraph                                =>  24.714284896850586

3d                                      =>  23.99508666992187


------------- 脚本-----------------
--------------------------------
基于20news 的贝叶斯分类测试
mahout prepare20newsgroups -p 20news-bydate-train/ -o 20news-train/ -a org.apache.lucene.analysis.standard.StandardAnalyzer -c UTF-8 
mahout prepare20newsgroups -p 20news-bydate-test/ -o 20news-test/ -a org.apache.lucene.analysis.standard.StandardAnalyzer -c UTF-8 
mahout trainclassifier -i 20news-train -o 20news-model -type cbayes -ng 1
mahout testclassifier -d 20news-test -m 20news-model -type cbayes -ng 1 -method sequential
---------------------------------

-------------------------------
logistic分类 - donut.csv
mahout trainlogistic --input donut.csv \
--output ./model \
--target color --categories 2 \
--predictors x y --types numeric \
--features 20 --passes 100 --rate 50

mahout runlogistic --input donut.csv --model ./model \
--auc --confusion
------------------------------


--------------------------
查看mahout生成的文件内容
mahout seqdumper -s part-r-00000 -o part-0
--------------------------

------------------------------
基于20news-test 的聚类测试
mahout seqdirectory -c UTF-8 -i 20news-test/ -o 20news-seqfiles
mahout seq2sparse -i 20news-seqfiles/ -o 20news-vectors -ow
mahout kmeans -i 20news-vectors/tfidf-vectors/ -c 20news-initial-clusters -o 20news-kmeans-clusters -dm org.apache.mahout.common.distance.SquaredEuclideanDistanceMeasure -cd 1.0 -k 20 -x 20 -cl
#mahout clusterdump --seqFileDir 20news-kmeans-clusters/clusters-1   -d 20news-vectors/dictionary.file-0 -dt sequencefile -n 10 -o 2.txt
mahout clusterdump --seqFileDir 20news-kmeans-clusters/clusters-1 -p 20news-kmeans-clusters/clusteredPoints/   -d 20news-vectors/dictionary.file-0 -dt sequencefile -n 10 -o 3.txt
----------------------------





你可能感兴趣的:(Mahout)