mahout 定制ClusterDumper之只输出中心点

hadoop1.0.4,mahout0.5。

mahout里面有实现读取聚类算法中的方法,叫做ClusterDumper,这个类输出的格式一般如下:

VL-2{n=6 c=[1.833, 2.417] r=[0.687, 0.344]}
    Weight:  Point:
    1.0: [1.000, 3.000]
...
    1.0: [3.000, 2.500]
VL-11{n=7 c=[2.857, 4.714] r=[0.990, 0.364]}
    Weight:  Point:
    1.0: [1.000, 5.000]
...
    1.0: [4.000, 4.500]
VL-14{n=8 c=[4.750, 3.438] r=[0.433, 0.682]}
    Weight:  Point:
    1.0: [4.000, 3.000]
    ...
    1.0: [5.000, 4.000]

不过,如果我只想实现输出聚类中心的文件的话,那么就不行了。本来想继承ClusterDumper,结果ClusterDumper是一个final的,算了,还是自己写吧。

返回栏目页:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/extra/

参考ClusterDumper中的源码,如下:

for (Cluster value :
           new SequenceFileDirValueIterable<Cluster>(new Path(seqFileDir, "part-*"), PathType.GLOB, conf)) {
        String fmtStr = value.asFormatString(dictionary);
        if (subString > 0 && fmtStr.length() > subString) {
          writer.write(':');
          writer.write(fmtStr, 0, Math.min(subString, fmtStr.length()));
        } else {
          writer.write(fmtStr);
        }

或者参考lz之前的一篇文章:mahout源码KMeansDriver分析之二中心点文件分析(无语篇),里面也有关于聚类中心的读取;

可以写一个ClusterCenterDump的类,如下:

package com.caic.cloud.util;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Writer;  

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.mahout.clustering.Cluster;
import org.apache.mahout.common.iterator.sequencefile.PathType;
import org.apache.mahout.common.iterator.sequencefile.SequenceFileDirValueIterable;  

import com.google.common.base.Charsets;
import com.google.common.io.Files;  

/**
 * just output the center vector to a given file
 * @author fansy
 *
 */
public class ClusterCenterDump {
    private Log log=LogFactory.getLog(ClusterCenterDump.class);
    private Configuration conf;
    private Path centerPathDir;
    private String outputPath;  

    /*public ClusterCenterDump(){}
    public ClusterCenterDump(Configuration conf){
        this.conf=conf;
    }*/  

    public ClusterCenterDump(Configuration conf,String centerPathDir,String outputPath){
        this.conf=conf;
        this.centerPathDir=new Path(centerPathDir);
        this.setOutputPath(outputPath);
    }  

    /**
     * write the given cluster center to the given file
     * @return
     * @throws FileNotFoundException
     */
    public boolean writeCenterToLocal() throws FileNotFoundException{
        if(this.conf==null||this.outputPath==null||this.centerPathDir==null){
            log.info("error:\nshould initial the configuration ,outputPath and centerPath");
            return false;
        }
        Writer writer=null;
        try {
            File outputFile=new File(outputPath);
            writer = Files.newWriter(outputFile, Charsets.UTF_8);
            this.writeTxtCenter(writer,   

                    new SequenceFileDirValueIterable<Cluster>(new Path(centerPathDir, "part-*"), PathType.GLOB, conf));
    //              new SequenceFileDirValueIterable<Writable>(new Path(centerPathDir, "part-r-00000"), PathType.LIST,
                    //      PathFilters.partFilter(),conf));
                    writer.flush();
        } catch (IOException e) {
            log.info("write error:\n"+e.getMessage());
            return false;
        }finally{
            try {
                if(writer!=null){
                    writer.close();
                }
            } catch (IOException e) {
                log.info("close writer error:\n"+e.getMessage());
            }
        }
        return true;
    }  

    /**
     * write the cluster to writer
     * @param writer
     * @param cluster
     * @return
     * @throws IOException
     */
    private boolean writeTxtCenter(Writer writer,Iterable<Cluster> clusters) throws IOException{  

        for(Cluster cluster:clusters){
            String fmtStr = cluster.asFormatString(null);
            System.out.println("fmtStr:"+fmtStr);
            writer.write(fmtStr);
            writer.write("\n");
        }
        return true;
    }  

    public Configuration getConf() {
        return conf;
    }
    public void setConf(Configuration conf) {
        this.conf = conf;
    }
    public Path getCenterPathDir() {
        return centerPathDir;
    }
    public void setCenterPathDir(Path centerPathDir) {
        this.centerPathDir = centerPathDir;
    }
    /**
     * @return the outputPath
     */
    public String getOutputPath() {
        return outputPath;
    }
    /**
     * @param outputPath the outputPath to set
     */
    public void setOutputPath(String outputPath) {
        this.outputPath = outputPath;
    }  

}

下面是一个测试类:

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索mahout
, conf
, return
, import
, configuration
, 无语 ios
, public
SequenceFile
mahout seqdumper、mahout clusterdump、kettle错误输出定制、xp3dumper、data dumper 安装,以便于您获取更多的相关知识。

时间: 2024-10-31 21:23:06

mahout 定制ClusterDumper之只输出中心点的相关文章

怎么取得整型数组中连续相同的数字并输出打印,用java实现,也就是输出副本,只输出那些连续相同的数字

问题描述 怎么取得整型数组中连续相同的数字并输出打印,用java实现,也就是输出副本,只输出那些连续相同的数字 怎么取得整型数组中连续相同的数字并输出打印,用java实现,也就是输出副本,只输出那些连续相同的数字 解决方案 判断一下一个数字前后是否有相同的,有相同的话就输出,比如下面这样: int array [] = { 2,1,3,4,4,4,9,9,1,0,1,1,2 }; //只输出连续的数字 System.out.print("连续数字:"); for (int i=0;i&

class-实在想不明白,为何这段代码只输出128

问题描述 实在想不明白,为何这段代码只输出128 import java.util.*; public class TheLuckyNumbersLevelTwo { ArrayList al = new ArrayList(); public static void find(int[] numbers) { int t=128; int i; for(i=0;i<t;i++); { System.out.println(i); /* System.out.print('['); int j=

raw ext-MFC DrawText 只输出纯色矩形无法输出文字

问题描述 MFC DrawText 只输出纯色矩形无法输出文字 想用drawtext 输出文字 但是只输出了一个纯色矩形 rectText.bottom= 300; rectText.top=200; rectText.left=0; rectText.right=100; Text = _T("A"); pDC->DrawText(Text,rectText,DT_LEFT); 不知道什么原因 解决方案 废话不多说直接贴代码 ``` TCHAR ch[] = L"fr

java- 输入十个数,只输出不一样的数(用JAVA)(多种方法)(已解决)

问题描述 输入十个数,只输出不一样的数(用JAVA)(多种方法)(已解决) 输入十个数,只输出不一样的数(用JAVA)(多种方法)(大一新生,简单点..) 解决方案 方法一:创建一个hashset把数字放到hashset里面就去重复了 方法二 :创建一个int数组存放数字.在存入数字前遍历数组,如果有和这个数字相等的这个数字就不存进去,进行下一个数字的判断. 其他的基本和方法二类似 解决方案二: 建立数组a,a0-a9依次取数,做循环对比,n为当前数据,if每个n++都与当前值不匹配,则retu

新手 求解答-为什么写的东西VS只输出一行?

问题描述 为什么写的东西VS只输出一行? 解决方案 去掉你的scanf_s中的n 解决方案二: 贴出你的输出看看.什么叫输出一行. 解决方案三: 解决方案四: 输入后按enter只换行不输出 解决方案五: 楼主输完数字后是否有按回车?另外,全角不是数字来的. 解决方案六: 是不是在输出的时候一闪而过?

为什么断点调式时可循环,F5直接运行,只输出一次

问题描述 代码中在发布内容做了一个循环发布,在设置断点调试的时候每一次循环都可以执行输出,但直接运行的时候却只输出了一次结果,不知道是哪方面的原因 解决方案 解决方案二:代码都不贴,让谁给你分析,输出每个循环的信息,看看问题到哪解决方案三:一般这个时候都会用到F10和F11解决方案四:引用1楼bdmh的回复: 代码都不贴,让谁给你分析,输出每个循环的信息,看看问题到哪 up解决方案五:你不贴代码怎么给你分析啊,肯定是循环条件不对了才没有循环呗主要看看这方面解决方案六:该回复于2011-12-20

如何让DAO的异常显示到页面上?我这个只输出到tomcat后台,页面却显示DAO执行成功,该怎么改才能让异常输出到页面?

问题描述 如图.问题很初级,希望各位高手别见笑.用的webwork+spring+hibernate,我把其中几个关键文件的代码贴出来吧用户列表的jsp文件:userlist.jsp:<%@pagecontentType="text/html;charset=gb2312"%><%@taglibprefix="ww"uri="/webwork"%><jsp:includeflush="true"p

求源码,用java定义形状类,随机产生圆,椭圆、矩形,并输出中心点、面积、周长

问题描述 急求源码啊!谢谢1.定义一个形状类,Point,Shape2.派生出矩形(Rectangle).圆(Circle).椭圆(Ellipse)3.完成其中可能存在的多态方法4.需要有每种形状的输出,包括中心点.面积.周长的输出这是我的作业哦.我不理解什么叫多态啊! 解决方案 解决方案二:建议你找java图形编程的书来看.解决方案三:引用1楼ylz2007的回复: 建议你找java图形编程的书来看. 有这必要吗?我看楼主的意思是应用面向对象的啊!解决方案四:多态就是父类引用指向子类对象,运行

用sqlplus只输出数据到文本文件的实例

数据 把以下内容存成文件(如:create_csv.sql),然后在sqlplus中执行,就输出数据到指定的文件了.--每行的字符数目,max value is 999set linesize 800--该参数设置每页输出的行数,包括TTITLE(头标题).BTITLE(底标题).COLUMN(列标题)和空行.n=0表示不产生新页set pagesize 0--列的设置--col username format a4 --col a format 999,999,999--各列的标题(包括文字和