1,原理解释
(1)原始数据集合列表按照一定的规则进行排序,初始距离阈值设置为T1, T2, T1> T2。
(2)在列表中随机挑选一个数据向量,使用一个粗糙距离计算方式计算与列表中其它样本数据向量之间的距离d。
(3)根据2中的距离,把d小于T1的样本数据向量划到一个树冠中,同时把d小于T2的样本数据向量从列表中移除。
(4)重复2,3,直至列表为空
2,下载测试数据
cd/tmp
hadoop dfs mkdir/输入
wget http://archive.ics.uci.edu/ml/databases/synthetic_control/synthetic_control.data
hadoop dfs -copyFromLocal/tmp/synthetic_control。数据/输入/synthetic_control。数据
3格式转换(文本→向量)
编辑文件Text2VectorWritable。jar
包mahout.fansy.utils.transform;
进口java.io.IOException;
进口org.apache.hadoop.conf.Configuration;
进口org.apache.hadoop.fs.Path;
进口org.apache.hadoop.io.LongWritable;
进口org.apache.hadoop.io.Text;
进口org.apache.hadoop.mapreduce.Job;
进口org.apache.hadoop.mapreduce.Mapper;
进口org.apache.hadoop.mapreduce.Reducer;
进口org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
进口org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat;
进口org.apache.hadoop.util.ToolRunner;
进口org.apache.mahout.common.AbstractJob;
进口org.apache.mahout.math.RandomAccessSparseVector;
进口org.apache.mahout.math.Vector;
进口org.apache.mahout.math.VectorWritable;
/* *
, *, *,文本数据转换为vectorWritable数据
, *,——* @author凡喜
, *,,——*
, *,,——*/
公共类Text2VectorWritable延伸AbstractJob {
,公共静态void main (String [] args)抛出异常{
,,,,ToolRunner.run(新Text2VectorWritable新配置(),(),args);
,}
,@Override
,公共int运行(String [] arg0)抛出异常{
,,,,addInputOption ();
,,,,addOutputOption ();
,,,,如果(parseArguments (arg0)==null) {
,,,,,返回1;
,,,,}
,,,,路径输入=getInputPath ();
,,,,路径输出=getOutputPath ();
,,,,配置设计=getConf ();
,,,,//设置工作信息
,,,,工作工作=新工作(参看“text2vectorWritableCopy输入:”+ input.getName ());
,,,,job.setOutputFormatClass (SequenceFileOutputFormat.class);
,,,,job.setMapperClass (Text2VectorWritableMapper.class);
,,,,job.setMapOutputKeyClass (LongWritable.class);
,,,,job.setMapOutputValueClass (VectorWritable.class);
,,,,job.setReducerClass (Text2VectorWritableReducer.class);
,,,,job.setOutputKeyClass (LongWritable.class);
,,,,job.setOutputValueClass (VectorWritable.class);
job.setJarByClass (Text2VectorWritable.class);
,,,FileInputFormat。addInputPath(工作,输入),
,,,SequenceFileOutputFormat。setOutputPath(工作,输出);
,,,,如果(! job.waitForCompletion(真)){//等待任务完成
,,,,,,把新InterruptedException(“树冠的工作失败的处理”+输入),
,,,,}
,,,,返回0;
,,}
,,/* *
,,*
映射器的主要过程,,* @author凡喜
,,*
,,——*/
,,公共静态类Text2VectorWritableMapper Mapper<延伸;LongWritable,文本,LongWritable VectorWritable> {
,,,,公共空间映射(LongWritable关键文本值,上下文语境)抛出IOException, InterruptedException {
,,,,,,String [] str=value.toString () .split (“\ \ {1,}”);
,,,,,,//拆分数据使用一个或多个空格
,,,,,,向量向量=new RandomAccessSparseVector (str.length);
,,,,,,for (int i=0; i ,,,,,,,,向量。集(我Double.parseDouble (str[我])); ,,,,,,} ,,,,,,VectorWritable va=new VectorWritable(向量); ,,,,,,上下文。写(键,va); ,,,,} ,,} ,,/* * ,,*减速器:什么都不做但输出 ,null数据挖掘-Mahout-Canopy聚类实践