---------------------
运行
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
----------------------------