`
ghost_face
  • 浏览: 54282 次
社区版块
存档分类
最新评论

mahout之Kmeans使用及结果分析

阅读更多

Mahout-Kmeans

1,两个输入路径:一个是数据的点;一个是初始集群。

     点的输入文件是SequenceFile(Key, VectorWritable)格式;

      而初始集群的输入文件格式是SequenceFiles(Text, Cluster | Canopy)

2,每次迭代会产生一个输出目录“cluster-N”,输出文件格式为SequenceFile(Text, Cluster),表示第N次迭代后产生的clusters。

3,输出目录“clusteredPoints”,表示最终的集群结果,即每个集群中所包含的Points。

4,解压安装Mahout0.7版本。

5,Running k-Means Clustering

 

 

bin/mahout kmeans \
    -i <input vectors directory> \
    -c <input clusters directory> \
    -o <output working directory> \
    -k <optional number of initial clusters to sample from input vectors> \
//如果指定-k参数,-c参数指定的目录将被overwitten随机的k个点。
    -dm <DistanceMeasure> \
    -x <maximum number of iterations> \
    -cd <optional convergence delta. Default is 0.5> \
    -ow <overwrite output directory if present>
    -cl <run input vector clustering after computing Canopies> 
 //很重要,很重要,如果没有指定这个参数,只能得到最后的集群信息,不能得到集群中的Points
    -xm <execution method: sequential or mapreduce>

 

执行命令如下:

 

./mahout kmeans -i archer/kmeans_in -c archer/kmeans_clusters -o archer/kmeans_out -k 50 -x 10 -ow –cl

 

6,执行结果,会在输出目录下,生成一个clusterPoints目录,读取SequenceFile,发现cluster中的点是以向量表示的,这样不太直观,因此对输入文件做了以下处理。

7,点的输入文件是SequenceFile(Key, VectorWritable)格式,因此,将VectorWritable中的Vector,使用NamedVector类型,这样每个点可以有一个名称,便于表示。(例如:每个user的特征向量,可以将userID作为向量名称,这样可以方便地对K-means的结果进行分析表示,得到每个cluster下有哪些user。)

处理输入文件格式的代码如下(注:本程序中,输入向量是0,1组成的):

 

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.SequenceFile;
import org.apache.hadoop.io.SequenceFile.CompressionType;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.util.ReflectionUtils;
import org.apache.mahout.math.NamedVector;
import org.apache.mahout.math.SequentialAccessSparseVector;
import org.apache.mahout.math.Vector;
import org.apache.mahout.math.VectorWritable;
 
import java.io.IOException;
import java.net.URI;
import java.util.StringTokenizer;
 
public class Convert2Kmeans {
 
//表示向量的维数
    public static int Cardinality = 6000;
 
    public static void main(String[] args) throws IOException {
 
        String uri = "/tmp/snsVec2.seq";
        Configuration conf = new Configuration();
        conf.set("fs.default.name", "namenode文件系统");
        FileSystem fs = FileSystem.get(URI.create(uri), conf);
 
        SequenceFile.Reader reader = null;
//读取原来的SequenceFile,将向量封装成具有Name属性的向量
        reader = new SequenceFile.Reader(fs, new Path("/kmeans_in_seq/snsVec.seq"), conf);
        Writable key = (Writable) ReflectionUtils.newInstance(reader.getKeyClass(), conf);
        Writable val = (Writable) ReflectionUtils.newInstance(reader.getValueClass(), conf);
        try {
 
            writer = SequenceFile.createWriter(fs,
                    conf, new Path(uri), IntWritable.class,
                    VectorWritable.class, CompressionType.BLOCK);
 
            final IntWritable key1 = new IntWritable();
            final VectorWritable value = new VectorWritable();
 
            int lineNum = 0;
            Vector vector = null;
            while (reader.next(key, val)) {
                int index = 0;
                StringTokenizer st = new StringTokenizer(val.toString());
// 将SequentialAccessSparseVector进一步封装成NamedVector类型
                vector = new NamedVector(new SequentialAccessSparseVector(Cardinality), lineNum + "");
                while (st.hasMoreTokens()) {
                    if (Integer.parseInt(st.nextToken()) == 1) {
                        vector.set(index, 1);
                    }
                    index++;
                }
                key1.set(lineNum++);
                value.set(vector);
                writer.append(key, value);
            }
        } finally {
            writer.close();
            reader.close();
        }
    }
}

 

 

8,分析clusterPoints目录结果

clusterPoints目录输出格式是:SequenceFile(IntWritable, WeightedVectorWritable),读取该文件,获取Vectorname即可。代码如下:

 

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.SequenceFile;
import org.apache.mahout.clustering.classify.WeightedVectorWritable;
import org.apache.mahout.math.NamedVector;
 
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Set;
 
public class ClusterOutput {
    public static void main(String[] args) {
        try {
            BufferedWriter bw;
            Configuration conf = new Configuration();
            conf.set("fs.default.name", "namenode文件系统");
            FileSystem fs = FileSystem.get(conf);
 
            SequenceFile.Reader reader = null;
            reader = new SequenceFile.Reader(fs, new Path("/kmeans_out/clusteredPoints/part-m-00000"), conf);
 
            //将分组信息写到文件uidOfgrp.txt,每行格式为 uid \t groupID
            bw = new BufferedWriter(new FileWriter(new File("D:\\uidOfgrp.txt")));
            HashMap<String, Integer> clusterIds;
            clusterIds = new HashMap<String, Integer>(120);
            IntWritable key = new IntWritable();
            WeightedVectorWritable value = new WeightedVectorWritable();
            while (reader.next(key, value)) {
                NamedVector vector = (NamedVector) value.getVector();
               //得到Vector的Name标识
                String vectorName = vector.getName();
                bw.write(vectorName + "\t" + key.toString() + "\n");
               //更新每个group的大小
                if (clusterIds.containsKey(key.toString())) {
                    clusterIds.put(key.toString(), clusterIds.get(key.toString()) + 1);
                } else
                    clusterIds.put(key.toString(), 1);
            }
            bw.flush();
            reader.close();
            //将每个group的大小,写入grpSize文件中
            bw = new BufferedWriter(new FileWriter(new File("D:\\grpSize.txt")));
            Set<String> keys = clusterIds.keySet();
            for (String k : keys) {
                bw.write(k + " " + clusterIds.get(k) + "\n");
            }
            bw.flush();
            bw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
} 

 

 

0
0
分享到:
评论

相关推荐

    mahout canopy+kmeans测试数据

    在IT领域,尤其是数据分析与机器学习方向,Apache Mahout是一个广受好评的开源项目,它提供了许多用于构建智能应用程序的算法。Mahout的核心是它的聚类、分类、推荐系统和频繁项挖掘等算法,其中Canopy和K-means是其...

    mahout聚类算法

    Mahout 聚类算法是数据挖掘和机器学习领域中的一种重要算法,它可以将相似的数据点聚集在一起,以便更好地理解和分析数据。Mahout 聚类算法可以分为多种类型,如 Canopy、KMeans、Fuzzy-KMeans、Spectral Clustering...

    mahout学习

    在“Kmeans.txt”文件中,你可以找到关于如何在Mahout中使用KMeans的代码示例,包括数据预处理、模型训练、预测以及评估等步骤。通过实际操作,你可以更深入地理解KMeans的实现细节和效果。 总结,Mahout的KMeans...

    mahout所需jar包

    **马哈多(Mahout)库的概述** 马哈多(Mahout)是Apache软件基金会的一个开源项目,专注于提供可扩展的机器学习库。...了解并掌握如何正确使用Mahout,对于提升数据分析和挖掘的效率具有重要意义。

    mahout KMeansDriver测试相关jar包

    mahout KMeansDriver测试相关jar包,有需要的同学可以下载来试试。把这个包放入hadoop/lib下面然后就可以在eclipse里面运行调试了。

    java 利用Kmeans的jar包进行聚类---代码

    这个标题"java 利用Kmeans的jar包进行聚类---代码"表明我们将探讨如何使用Java通过预编译的KMeans库(通常是一个jar包)来执行聚类任务。描述中的"java可以直接调用kmeans进行聚类!"进一步确认了Java程序员可以借助...

    mahout0.9测试详细傻瓜说明

    为了更详细地分析结果,可以使用 `clusterdump` 命令: ```bash # 输出详细结果 mahout clusterdump --input /user/root/output/clusters-10-final --pointsDir /user/root/output/clusteredPoints --output /usr/...

    kmeans聚类java实现附测试数据及结果

    在Java中实现KMeans聚类,可以使用多种库,如Weka、Apache Mahout或自行编写代码。下面我们将深入探讨KMeans聚类的基本原理、Java实现的关键步骤以及如何进行测试和分析结果。 KMeans算法的核心思想是通过迭代过程...

    maven_mahout_template-mahout-0.6

    kmeans聚类算法 基于划分的方法单机版基于学习

    synthetic_control.data

    Mahout的kmeans聚类测试数据

    大数据技术 Hadoop开发者第二期 MapReduce HDFS Hive Mahout HBase 共64页.pdf

    - **Kmeans 算法概述**:Mahout 中 Kmeans 算法的基本原理及应用场景。 - **技术细节**: - Kmeans 算法的工作流程。 - 如何使用 Mahout 实现 Kmeans 算法。 - Kmeans 在推荐系统、聚类分析等领域的应用实例。 ...

    Kmeans文本聚类java实现

    在Java实现中,可以使用Apache Mahout、Weka等机器学习库,它们提供了现成的KMeans实现。如果从零开始编写,可以使用`ArrayList`或`HashSet`存储样本,`Matrix`库(如Apache Commons Math)处理向量计算,以及`...

    mahout 0.4版本

    总结来说,Apache Mahout 0.4版本是一个强大的工具,为开发者和数据分析师提供了实现机器学习任务的高效途径,特别是KMeans聚类、FPM挖掘和协同过滤。通过这个开源项目,即使是对机器学习不熟悉的用户也能处理大数据...

    mahout-distribution-0.5-src.tar.gz )

    1. **聚类算法**:KMeans是Mahout中最常见的聚类算法之一。在Hadoop上运行KMeans,可以处理海量数据,对大量用户行为、网站访问记录或者地理定位数据进行分组,发现潜在的模式或群体。此外,Mahout还支持其他聚类...

    kmeans算法文本聚类java源码(分词,TF/IDF等)

    在Java环境中,我们可以使用开源库如Apache Mahout或自己编写代码实现KMeans算法。首先,构建TF-IDF矩阵,然后用Java编程实现KMeans算法的迭代过程。注意优化内存管理和并行计算以提高效率。 8. 整个工程运行 提供...

    Kmeans数据挖掘算法的实现(Java)

    KMeans是一种常用的数据挖掘算法,...在实际项目中,可能会使用Apache Mahout、Weka或Spark MLlib等库来实现KMeans,因为它们提供了更高级的功能和优化。不过,自己动手实现KMeans有助于深入理解其工作原理和优化技巧。

    mahout-demo:mahout 演示展示了它是如何工作的

    Mahout 演示欢迎来到驯象师演示。 开发这个项目是为了展示 mahout 是如何工作的。... 模糊 KMeans 聚类使用 Maven 构建mvn 全新安装执行java -jar mahout-demo-0.0.1-SNAPSHOT-jar-with-dependencies.jar

    mapreduce-kmeans:使用MapReduce的朴素K均值聚类

    如果您要进行正式生产和正常工作的群集,请使用Mahout,Hama或Spark。 建造 您将需要Java 8来构建该库。 您可以简单地使用以下命令进行构建: mvn clean软件包安装 创建的jar包含可调试代码+源+ javadocs。 要...

    Neural-Network:KNN、Kmeans、感知器和遗传算法算法的实现

    在Java中,Apache Mahout库提供了KMeans的实现,也可以通过实现迭代过程和质心更新逻辑来自行编写。 3. 感知器算法: 感知器是最早的人工神经网络模型之一,主要用于二分类问题。它通过迭代更新权重来逐步优化决策...

Global site tag (gtag.js) - Google Analytics