Mahout系列之核心功能实践
来源:互联网 发布:网络安全法的特点 编辑:程序博客网 时间:2024/06/11 01:06
上次已经说到了Mahout的计算项目模块mahout math。这里面包含了很多常用的数学计算或者统计方面的东西,有很多东西可能会用到,所以对这些基础的需要有很好的理解。Mahout提供了很多工具的命令行方式,下面列出所有的命令,当然这个是会变化的,而且每个都有不同的参数;这些命令也有很多相似之处,要每个都很熟悉还是要很多功力的。管中窥豹,可见一斑,这样可以知道Mahout到底可以做什么,提供了哪些直接使用的方式,可供参考:
当然上面的有些中文的翻译不是很准,也没有一一使用过,具体的使用还有很多细节。
Mahout提供了很多聚类,分类,推荐(协作过滤)方面的计算方法,对i数据分析提供了有意的帮助,目前用的比较成熟的应该就是推荐这块了,在很多系统里面得到了实际的应用,效果也不错;相对来说聚类分类还是使用的场合比较有限,有待进一步的研究。
前面几篇已经分析过了推荐方面的,从理论到实际操作,下面介绍一个逻辑回归(Logistic Regression)模型的例子。
1.数据准备
使用的是iris数据,iris数据是数据分析使用比较多的实验数据,不多说了。
打开R, 输入 iris,可以看到数据长什么样子,使用下面的命令导出数据
write.csv(iris,file="D:/work_doc/Doc/iris.csv")
数据是这样的:
"ID","Sepal.Length","Sepal.Width","Petal.Length","Petal.Width","Species"
"1",5.1,3.5,1.4,0.2,"setosa"
"2",4.9,3,1.4,0.2,"setosa"
"3",4.7,3.2,1.3,0.2,"setosa"
"4",4.6,3.1,1.5,0.2,"setosa"
2. 使用java代码来实际操作一番。
import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.List;
import java.util.Locale;
import org.apache.commons.io.FileUtils;
import org.apache.mahout.classifier.sgd.CsvRecordFactory;
import org.apache.mahout.classifier.sgd.LogisticModelParameters;
import org.apache.mahout.classifier.sgd.OnlineLogisticRegression;
import org.apache.mahout.math.RandomAccessSparseVector;
import org.apache.mahout.math.SequentialAccessSparseVector;
import org.apache.mahout.math.Vector;
import com.google.common.base.Charsets;
import com.google.common.collect.Lists;
public class IrisLRTest {
private static LogisticModelParameters lmp;
private static PrintWriter output;
public static void main(String[] args) throws IOException {
// 初始化
lmp = new LogisticModelParameters();
output = new PrintWriter(new OutputStreamWriter(System.out,
Charsets.UTF_8), true);
lmp.setLambda(0.001);
lmp.setLearningRate(50);
lmp.setMaxTargetCategories(3);
lmp.setNumFeatures(4);
List<String> targetCategories = Lists.newArrayList("setosa", "versicolor", "versicolor"); //对应Species属性三个类别
lmp.setTargetCategories(targetCategories);
lmp.setTargetVariable("Species"); // 需要进行预测的是Species属性
List<String> typeList = Lists.newArrayList("numeric", "numeric", "numeric", "numeric"); //每个属性的类型
List<String> predictorList = Lists.newArrayList("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width"); //属性的名称
lmp.setTypeMap(predictorList, typeList);
// 读取数据
List<String> raw = FileUtils.readLines(new File(
"D:\\work_doc\\Doc\\iris.csv"));
String header = raw.get(0);
List<String> content = raw.subList(1, raw.size());
CsvRecordFactory csv = lmp.getCsvRecordFactory();
csv.firstLine(header);
// 训练
OnlineLogisticRegression lr = lmp.createRegression();
for(int i = 0; i < 100; i++) { //训练次数
for (String line : content) {
Vector input = new RandomAccessSparseVector(lmp.getNumFeatures());
int targetValue = csv.processLine(line, input);
lr.train(targetValue, input);
}
}
// 评估分类结果
double correctRate = 0;
double sampleCount = content.size();
for (String line : content) {
Vector v = new SequentialAccessSparseVector(lmp.getNumFeatures());
int target = csv.processLine(line, v);
int score = lr.classifyFull(v).maxValueIndex();
//System.out.println("Target:" + target + "\tReal:" + score);
if(score == target) {
correctRate++;
}
}
output.printf(Locale.ENGLISH, "Rate = %.2f%n", correctRate / sampleCount);
}
}
代码里面给出了注释,过程比较容易理解。不仅是这个模型是这样的思路,很多其他的算法都是这样的过程,具体的训练方法,算法或者过程,有差别。
当然这里给出的是基于Mahout的代码,一样在R中也可以做很多模型,基本步骤类似。
- Mahout系列之核心功能实践
- Mahout系列之推荐引擎核心源码
- Mahout系列之推荐算法-基于物品协同过滤实践
- mahout系列之---谱聚类
- RxJava2系列实践之倒计时功能(三)
- Mahout 系列之----共轭梯度
- Mahout系列之----距离度量
- Mahout系列之-----相似度
- Mahout 系列之--canopy 算法
- Mahout系列之----kmeans 聚类
- Mahout系列之----kmeans 聚类
- Mahout系列之----共轭梯度预处理
- Mahout学习系列之推荐算法
- Mahout学习系列之推荐算法
- Mahout实践指南
- mahout部署实践
- mahout on hadoop2 实践
- mahout部署实践
- 自学成才篇:再谈字节流的Read方法
- poj 3411 Paid Roads(DFS)
- 并行计算之路<1>——Hello, CUDA.
- lua三目运算符问题
- 四大组件基本使用实践总结
- Mahout系列之核心功能实践
- 捕蛇者说
- 谈谈自己处理拍照剪裁的一些经验和遇到的问题
- poj1419 Graph Coloring
- Android快速开发(1)
- 母函数-以HDU-1398 Square Coins为例
- java学习心得——servlet的两种跳转方式
- codeforces626D . Jerry's Protest (概率)
- CSS基础研究(三)-CSS基本样式研究