在Mahout 学习(三)中,我贴了example的代码,里面生成向量文件的代码:

InputDriver.runJob(input, directoryContainingConvertedInput, "org.apache.mahout.math.RandomAccessSparseVector");

InputDriver实际上就是启动一个MapReduce程序,文件名叫InputMapper.java,只有Map处理,输出就是向量文件,代码

protected void map(LongWritable key, Text values, Context context) throws IOException, InterruptedException {

    String[] numbers = SPACE.split(values.toString());
// sometimes there are multiple separator spaces
Collection<Double> doubles = Lists.newArrayList();
for (String value : numbers) {
if (!value.isEmpty()) {
doubles.add(Double.valueOf(value));
}
}
// ignore empty lines in data file
if (!doubles.isEmpty()) {
try {
Vector result = (Vector) constructor.newInstance(doubles.size());
int index = 0;
for (Double d : doubles) {
result.set(index++, d);
}
VectorWritable vectorWritable = new VectorWritable(result);
context.write(new Text(String.valueOf(index)), vectorWritable); } catch (InstantiationException e) {
throw new IllegalStateException(e);
} catch (IllegalAccessException e) {
throw new IllegalStateException(e);
} catch (InvocationTargetException e) {
throw new IllegalStateException(e);
}
}
}

红色标注的代码,会有使得生成向量时,有一个强制要求,例如有数据

1 2 3
4 5 6 7

这样的数据作为输入,不能通过,必须数据为

1 2 3 0
4 5 6 7

这样才通过。

但是如果维度太多,缺少的维度需要自己手工填补,这样也不免太傻。

但是Mahout自带的seq2encoded 方法可以忽略缺少部分,同样缺少维度的数据也能成功生成向量文件。分析了一下,原来它在代码里写死了

Vector result = (Vector) constructor.newInstance(5000);

它指定时指定一个超大的值,保证它不会越界。这样即使输入数据长短不一,也能通过。

知道解决方法后

我们只要将InputMapper.java源代码找出来,仿造新建一个InputMapperLocal.java的文件,修改constructor.newInstance(5000);

同样的,找出InputDriver.java 源码,仿造新建 InputDriverLocal.java 文件,将Job set Mapper Class 的地方,使用InputMapperLocal.class即可。

当然,向量的代码里,也要使用InputDriverLocal方法。

附:

InputMapper.java 对应源码路径:${Mahout_Source_Home}/integration/src/main/java/org/apache/mahout/clustering/conversion/InputMapper.java

InputDriver.java 对应源码路径:${Mahout_Source_Home}/integration/src/main/java/org/apache/mahout/clustering/conversion/InputDriver.java

Mahout 版本:0.9

学习Mahout (四)的更多相关文章

  1. 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式

    本系列文章导航 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式 一.摘要 本篇文章讲解如何使用jQuery获取和操作元素的属性和CSS样式. 其中DOM属性和元素属性的区分值得 ...

  2. 前端学习 第四弹: HTML(一)

    前端学习 第四弹: HTML(一) 元素分类:块元素 内联元素 块级元素在浏览器显示时,通常会以新行来开始(和结束). 例子:<h1>, <p>, <ul>, &l ...

  3. C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻

    前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...

  4. Android Animation学习(四) ApiDemos解析:多属性动画

    Android Animation学习(四) ApiDemos解析:多属性动画 如果想同时改变多个属性,根据前面所学的,比较显而易见的一种思路是构造多个对象Animator , ( Animator可 ...

  5. 五、Android学习第四天补充——Android的常用控件(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 五.Android学习第四天补充——Android的常用控件 熟悉常用的A ...

  6. 四、Android学习第四天——JAVA基础回顾(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 四.Android学习第四天——JAVA基础回顾 这才学习Android的 ...

  7. MVC学习(四)几种分页的实现(3)

    在这篇MVC学习(四)几种分页的实现(2)博文中,根据URL中传入的两个参数(页码数,首页.上一页.下一页.末页的标记符)来获得对应的分页数据, 只是传入的参数太多,调用起来不太方便(标记符不能够写错 ...

  8. MyBatis学习 之 四、MyBatis配置文件

    目录(?)[-] 四MyBatis主配置文件 properties属性 settings设置 typeAliases类型别名 typeHandlers类型句柄 ObjectFactory对象工厂 pl ...

  9. 【转】MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突

    [转]MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体 ...

随机推荐

  1. ALTER USER USER() IDENTIFIED BY 'password';

    [root@test mysql]# bin/mysqld 2018-08-04T14:09:33.831318Z 0 [Warning] [MY-011070] [Server] 'Disablin ...

  2. [数据挖掘课程笔记]关联规则挖掘 - Apriori算法

    两种度量: 支持度(support)  support(A→B) = count(AUB)/N (N是数据库中记录的条数) 自信度(confidence)confidence(A→B) = count ...

  3. vim实现代码缩进和可视区域的字符串替换

    今天2014年9月12号,实现了vim下的代码自动缩进和替换可视区域的字符串,之前一直在用vim这个强大的编辑器,它的强大只有用了的人才知道,现在把这两个很强大的功能展示出来,有个这两个功能,即使你写 ...

  4. const位置上的不同代表哪些不同的意义

    const位置上的不同代表哪些不同的意义 exern的用法 这个可以引用在程序编译过程中编译进去的常量数据.换句话说正能在.h文件的声明赋值的常量才可以.并且常量的名字不能相同,如果相同会报错. 全局 ...

  5. 关于node.js的安装与删除

    安装node.js 先切换到root用户安装 openssl-devel su - yum install openssl-devel 下载源代码自己编译以下代码中的tar.gz包根据node.js官 ...

  6. android——实现多语言支持

    我们知道,建好一个android 的项目后,默认的res下面 有layout.values.drawable等目录.这些都是程序默认的资源文件目录,如果要实现多语言版本的话,我们就要添加要实现语言的对 ...

  7. xmlToEntity or entityToXML 工作笔记

    最近工作中调用接口,返回报文是String,取值不方便,需要转换为实体,回来自己简单写了个demo,基本上可以满足工作需求. 除了下面代码外,还要创建对应的实体. package yh.test.t1 ...

  8. 人生苦短之Python文件的IO操作

    在Python中也有涉及到文件的相关操作,从最简单的文件读取说起 文件读取 file = open('/Users/macbookpro/Desktop/使用教程.txt', 'r', encodin ...

  9. shell动态变量

    面对变量中嵌套变量,可以这么做 other_devops_ip="......." options='_ip' tennat_name='other_devops' tennat_ ...

  10. uva 10881 Piotr's Ants 解题报告

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=20&pa ...