Mahout 배우기(4)

4309 단어 Mahout

Mahout 학습(3)에서 나는 example 코드를 붙였는데 그 안에 벡터 파일을 생성하는 코드가 있었다.
InputDriver.runJob(input, directoryContainingConvertedInput, "org.apache.mahout.math.RandomAccessSparseVector");

Input Driver는 실제로는 Input Mapper라는 Map Reduce 프로그램을 시작합니다.java, 맵만 처리하고 출력은 벡터 파일, 코드
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);

그것은 경계를 넘지 않도록 아주 큰 값을 지정합니다.이렇게 하면 입력 데이터가 길이가 같지 않아도 통과할 수 있다.
해결책을 알고 나서.
저희는 Input Mapper만java 소스 코드를 찾아서 새 InputMapper Local을 모방합니다.java 파일, constructor 수정.newInstance(5000);
마찬가지로 InputDriver를 찾아보세요.java 원본, 새 InputDriverLocal을 모방합니다.java 파일, Job set Mapper Class의 위치에서 Input Mapper Local을 사용합니다.클라스면 돼.
물론 벡터 코드에서도 InputDriverLocal 방법을 사용해야 한다.
부록:
InputMapper.자바 대응 원본 경로: ${Mahout Source Home}/integration/src/main/java/org/apache/mahout/clustering/conversion/InputMapper.java
InputDriver.자바 대응 원본 경로: ${Mahout Source Home}/integration/src/main/java/org/apache/mahout/clustering/conversion/InputDriver.java
Mahout 버전: 0.9

좋은 웹페이지 즐겨찾기