首页 文章 精选 留言 我的

精选列表

搜索[AI漏洞挖掘],共10000篇文章
优秀的个人博客,低调大师

Spark应用HanLP对中文语料进行文本挖掘--聚类详解教程

软件:IDEA2014、Maven、HanLP、JDK; 用到的知识:HanLP、Spark TF-IDF、Spark kmeans、Spark mapPartition; 用到的数据集:http://www.threedweb.cn/thread-1288-1-1.html(不需要下载,已经包含在工程里面); 工程下载:https://github.com/fansy1990/hanlp-test 。 1、问题描述 现在有一个中文文本数据集,这个数据集已经对其中的文本做了分类,如下: 其中每个文件夹中含有个数不等的文件,比如环境有200个,艺术有248个;同时,每个文件的内容基本上就是一些新闻报道或者中文描述,如下: 现在需要做的就是,把这些文档进行聚类,看其和原始给定的类别的重合度有多少,这样也可以反过来验证我们聚类算法的正确度。 2.、解决思路: 2.1 文本预处理: 1. 由于文件的编码是GBK的,读取到Spark中全部是乱码,所以先使用Java把代码转为UTF8编码; 2. 由于文本存在多个文件中(大概2k多),使用Spark的wholeTextFile读取速度太慢,所以考虑把这些文件全部合并为一个文件,这时又结合1.的转变编码,所以在转变编码的时候就直接把所有的数据存入同一个文件中; 其存储的格式为: 每行: 文件名.txt\t文件内容 如: 41.txt 【 日 期 】199601.... 这样子的话,就可以通过.txt\t 来对每行文本进行分割,得到其文件名以及文件内容,这里每行其实就是一个文件了。 2.2 分词 分词直接采用HanLP的分词来做,HanLP这里选择两种:Standard和NLP(还有一种就是HighSpeed,但是这个木有用户自定义词典,所以前期考虑先用两种),具体参考:https://github.com/hankcs/HanLP ; 2.3 词转换为词向量 在Kmeans算法中,一个样本需要使用数值类型,所以需要把文本转为数值向量形式,这里在Spark中有两种方式。其一,是使用TF-IDF;其二,使用Word2Vec。这里暂时使用了TF-IDF算法来进行,这个算法需要提供一个numFeatures,这个值越大其效果也越好,但是相应的计算时间也越长,后面也可以通过实验验证。 2.4 使用每个文档的词向量进行聚类建模 在进行聚类建模的时候,需要提供一个初始的聚类个数,这里面设置为10,因为我们的数据是有10个分组的。但是在实际的情况下,一般这个值是需要通过实验来验证得到的。 2.5 对聚类后的结果进行评估 这里面采用的思路是: 1. 得到聚类模型后,对原始数据进行分类,得到原始文件名和预测的分类id的二元组(fileName,predictId); 2. 针对(fileName,predictId),得到(fileNameFirstChar ,fileNameFirstChar.toInt - predictId)的值,这里需要注意的是fileNameFirstChar其实就是代表这个文件的原始所属类别了。 3. 这里有一个一般假设,就是使用kmeans模型预测得到的结果大多数是正确的,所以fileNameFirstChar.toInt-predictId得到的众数其实就是分类的正确的个数了(这里可能比较难以理解,后面会有个小李子来说明这个问题); 4. 得到每个实际类别的预测的正确率后就可以去平均预测率了。 5. 改变numFeatuers的值,看下是否numFeatures设置的比较大,其正确率也会比较大? 3、具体步骤: 3.1 开发环境--Maven 首先第一步,当然是开发环境了,因为用到了Spark和HanLP,所以需要在pom.xml中加入这两个依赖: 1. <!-- 中文分词框架 --> 2.<dependency> 3.<groupId>com.hankcs</groupId> 4.<artifactId>hanlp</artifactId> 5.<version>${hanlp.version}</version> 6.</dependency> 7.<!-- Spark dependencies --> 8.<dependency> 9.<groupId>org.apache.spark</groupId> 10.<artifactId>spark-core_2.10</artifactId> 11.<version>${spark.version}</version> 12.</dependency> 13.<dependency> 14.<groupId>org.apache.spark</groupId> 15.<artifactId>spark-mllib_2.10</artifactId> 16.<version>${spark.version}</version> 17.</dependency> 其版本为: <hanlp.version>portable-1.3.4</hanlp.version>、 <spark.version>1.6.0-cdh5.7.3</spark.version>。 3.2 文件转为UTF-8编码及存储到一个文件 这部分内容可以直接参考:src/main/java/demo02_transform_encoding.TransformEncodingToOne 这里的实现,因为是Java基本的操作,这里就不加以分析了。 3.3 Scala调用HanLP进行中文分词 Scala调用HanLP进行分词和Java的是一样的,同时,因为这里有些词语格式不正常,所以把这些特殊的词语添加到自定义词典中,其示例如下: 1.import com.hankcs.hanlp.dictionary.CustomDictionary 2.import com.hankcs.hanlp.dictionary.stopword.CoreStopWordDictionary 3.import com.hankcs.hanlp.tokenizer.StandardTokenizer 4.import scala.collection.JavaConversions._ 5./** 6.* Scala 分词测试 7.* Created by fansy on 2017/8/25. 8.*/ 9.object SegmentDemo { 10.def main(args: Array[String]) { 11.val sentense = "41,【 日 期 】19960104 【 版 号 】1 【 标 题 】合巢芜高速公路巢芜段竣工 【 作 者 】彭建中 【 正 文 】 安徽合(肥)巢(湖)芜(湖)高速公路巢芜段日前竣工通车并投入营运。合巢芜 高速公路是国家规划的京福综合运输网的重要干线路段,是交通部确定1995年建成 的全国10条重点公路之一。该条高速公路正线长88公里。(彭建中)" 12.CustomDictionary.add("日 期") 13.CustomDictionary.add("版 号") 14.CustomDictionary.add("标 题") 15.CustomDictionary.add("作 者") 16.CustomDictionary.add("正 文") 17.val list = StandardTokenizer.segment(sentense) 18.CoreStopWordDictionary.apply(list) 19.println(list.map(x => x.word.replaceAll(" ","")).mkString(",")) 20.} 21.} 运行完成后,即可得到分词的结果,如下: 考虑到使用方便,这里把分词封装成一个函数: 1./** 2.* String 分词 3.* @param sentense 4.* @return 5.*/ 6.def transform(sentense:String):List[String] ={ 7.val list = StandardTokenizer.segment(sentense) 8.CoreStopWordDictionary.apply(list) 9.list.map(x => x.word.replaceAll(" ","")).toList 10.} 11.} 输入即是一个中文的文本,输出就是分词的结果,同时去掉了一些常用的停用词。 3.4 求TF-IDF 在Spark里面求TF-IDF,可以直接调用Spark内置的算法模块即可,同时在Spark的该算法模块中还对求得的结果进行了维度变换(可以理解为特征选择或“降维”,当然这里的降维可能是提升维度)。代码如下: 1.val docs = sc.textFile(input_data).map{x => val t = x.split(".txt\t");(t(0),transform(t(1)))} 2..toDF("fileName", "sentence_words") 3. 4.// 3. 求TF 5.println("calculating TF ...") 6.val hashingTF = new HashingTF() 7..setInputCol("sentence_words").setOutputCol("rawFeatures").setNumFeatures(numFeatures) 8.val featurizedData = hashingTF.transform(docs) 9. 10.// 4. 求IDF 11.println("calculating IDF ...") 12.val idf = new IDF().setInputCol("rawFeatures").setOutputCol("features") 13.val idfModel = idf.fit(featurizedData) 14.val rescaledData = idfModel.transform(featurizedData).cache() 变量docs是一个DataFrame[fileName, sentence_words] ,经过HashingTF后,变成了变量 featurizedData ,同样是一个DataFrame[fileName,sentence_words, rawFeatures]。这里通过setInputCol以及SetOutputCol可以设置输入以及输出列名(列名是针对DataFrame来说的,不知道的可以看下DataFrame的API)。 接着,经过IDF模型,得到变量 rescaledData ,其DataFrame[fileName,sentence_words, rawFeatures, features] 。 执行结果为: 3.5 建立KMeans模型 直接参考官网给定例子即可: 1.println("creating kmeans model ...") 2.val kmeans = new KMeans().setK(k).setSeed(1L) 3.val model = kmeans.fit(rescaledData) 4.// Evaluate clustering by computing Within Set Sum of Squared Errors. 5.println("calculating wssse ...") 6.val WSSSE = model.computeCost(rescaledData) 7.println(s"Within Set Sum of Squared Errors = $WSSSE") 这里有计算cost值的,但是这个值评估不是很准确,比如我numFeature设置为2000的话,那么这个值就很大,但是其实其正确率会比较大的。 3.6 模型评估 这里的模型评估直接使用一个小李子来说明:比如,现在有这样的数据: 其中,1开头,2开头和4开头的属于同一类文档,后面的0,3,2,1等,代表这个文档被模型分类的结果,那么可以很容易的看出针对1开头的文档, 其分类正确的有4个,其中("123.txt",3)以及(“126.txt”,1)是分类错误的结果,这是因为,在这个类别中预测的结果中0是最多的,所以0是和1开头的文档对应起来的,这也就是前面的假设。 1. 把同一类文档分到同一个partition中; 1.val data = sc.parallelize(t) 2.val file_index = data.map(_._1.charAt(0)).distinct.zipWithIndex().collect().toMap 3.println(file_index) 4.val partitionData = data.partitionBy(MyPartitioner(file_index)) 这里的file_index,是对不同类的文档进行编号,这个编号就对应每个partition,看MyPartitioner的实现: 1.case class MyPartitioner(file_index:Map[Char,Long]) extends Partitioner 2.override def getPartition(key: Any): Int = key match { 3.case _ => file_index.getOrElse(key.toString.charAt(0),0L).toInt 4.} 5..override def numPartitions: Int = file_index.size 6.} 2. 针对每个partition进行整合操作: 在整合每个partition之前,我们先看下我们自定义的MyPartitioner是否在正常工作,可以打印下结果: 1.val tt = partitionData.mapPartitionsWithIndex((index: Int, it: Iterator[(String,Int)]) => it.toList.map(x => (index,x)).toIterator) 2.tt.collect().foreach(println(_)) 运行如下: 其中第一列代表每个partition的id,第二列是数据,发现其数据确实是按照预期进行处理的;接着可以针对每个partition进行数据整合: 1.// firstCharInFileName , firstCharInFileName - predictType 2.val combined = partitionData.map(x =>( (x._1.charAt(0), Integer.parseInt(x._1.charAt(0)+"") - x._2),1) ) 3..mapPartitions{f => var aMap = Map[(Char,Int),Int](); 4.for(t <- f){ 5.if (aMap.contains(t._1)){ 6.aMap = aMap.updated(t._1,aMap.getOrElse(t._1,0)+1) 7.}else{ 8.aMap = aMap + t 9.} 10.} 11.val aList = aMap.toList 12.val total= aList.map(_._2).sum 13.val total_right = aList.map(_._2).max 14.List((aList.head._1._1,total,total_right)).toIterator 15.// aMap.toIterator //打印各个partition的总结 16. } 在整合之前先执行一个map操作,把数据变成((fileNameFirstChar, fileNameFirstChar.toInt - predictId), 1),其中fileNameFirstChar代表文件的第一个字符,其实也就是文件的所属实际类别,后面的fileNameFirstChar.toInt-predictId 其实就是判断预测的结果是否对了,这个值的众数就是预测对的;最后一个值代码前面的这个键值对出现的次数,其实就是统计属于某个类别的实际文件个数以及预测对的文件个数,分别对应上面的total和total_right变量;输出结果为: (4,6,3) (1,6,4) (2,6,4) 发现其打印的结果是正确的,第一列代表文件名开头,第二个代表属于这个文件的个数,第三列代表预测正确的个数 这里需要注意的是,这里因为文本的实际类别和文件名是一致的,所以才可以这样处理,如果实际数据的话,那么mapPartitions函数需要更改。 3. 针对数据结果进行统计: 最后只需要进行简单的计算即可: 1.for(re <- result ){ 2.println("文档"+re._1+"开头的 文档总数:"+ re._2+",分类正确的有:"+re._3+",分类正确率是:"+(re._3*100.0/re._2)+"%") 3.} 4.val averageRate = result.map(_._3).sum *100.0 / result.map(_._2).sum 5.println("平均正确率为:"+averageRate+"%") 输出结果为: 4. 实验 设置不同的numFeature,比如使用200和2000,其对比结果为: 所以设置numFeatures值越大,其准确率也越高,不过计算也比较复杂。 5. 总结 1. HanLP的使用相对比较简单,这里只使用了分词及停用词,感谢开源; 2. Spark里面的TF-IDF以及Word2Vector使用比较简单,不过使用这个需要先分词; 3. 这里是在IDEA里面运行的,如果使用Spark-submit的提交方式,那么需要把hanpl的jar包加入,这个有待验证

优秀的个人博客,低调大师

意法半导体挖掘中国市场 物联网成重头戏

近日,意法半导体在北京召开新闻发布会,其CEO与亚太区总裁等一众高层亲临发布会现场,向中国市场推出其最新的物联网和智能驾驶技术进展,在连续三年营收出现负增长的情况下,深挖中国市场的潜力成为意法半导体的重中之重。 成立于1988年的意法半导体从事数字消费电子、微控制器、汽车产品、智能功率、MEMS和传感器的研发,其业务范围覆盖欧洲区和亚太区,虽然说半导体是目前工业的核心部件,但是受到欧洲经济衰退和行业不景气的影响,意法半导体的营收连续三年出现下滑。 意法半导体的亚太区总裁和CEO 在发布会上意法半导体的CEO表示,目前公司确定了新的战略架构,未来会将业务重点放在物联网和智能驾驶业务上,而鉴于近几年中国物联网和车联网技术的高速发展,中国区的业务将会成为重中之重。 据他介绍,意法半导体的智能驾驶业务将涵盖ADAS、V2X以及新能源汽车、绿色出行等领域,安全驾驶技术领域是在未来占据越来越重要的地位;而智慧工业、智慧家庭与智慧城市,以及智能硬件部分在未来对于半导体的需求也是非常庞大,这些业务依然是未来意法半导体的发展方向。 意法半导体的亚太区总裁柯世盟先生重点介绍了智能驾驶技术。意法半导体所推出的智能驾驶技术并不等同于自动驾驶,他们的产品更加强调的是智能驾驶的主动安全性,比如ADAS的产品。 他表示,到2020年,中国汽车产量占比全球的数字将来到29%,相比于2010年将多出7个百分点;创新增速在中国不断加快,特别是每一辆车的半导体成本年复合增长率将在2020年来到4.2%,这个市场是在不断深化的。 ADAS系统方面,目前ST拥有适用于这些系统的传感器和处理器,同时这家公司还与Mobileye有5年的合作历史,共同研发相关系统芯片。第五代系统芯片——EyeQ5的消息在今年5月已经曝光,这块系统芯片将成为全自动驾驶汽车的核心芯片。 而在车联网业务上,ST正在准备大规模部署V2X,与Autotalks合作的芯片组计划在2017年量产,目前在全球多地进行自动驾驶试验。另外,ST针对电动车电池所开发的碳化硅技术可提升电动汽车续航能力,同时还能缩减电池尺寸以及节省成本。 有两个细节足以显示他们对于中国市场的决心和渴望,他将会转战香港指挥亚太区的业务因为这里距离中国市场更近,并且这位精通日语的亚太区总裁表示将会好好学习汉语。 本文转自d1net(转载)

优秀的个人博客,低调大师

2015-03-22 网易笔试(数据挖掘方向)——邮件事业部

答案正在更新,有想法的也可以留言............ 一:单选题 1:下列程序的输出结果为() #include <iostream.h> void main() { int n[][] = {10,20,30,40,50,60}; int (*p)[3]; p = n; cout<<[0][0] << "," <<*( p[0] + 1) << "," <<(*p)[2]<<endl; } A: 10,30,50 B: 10,20,30 C: 20,40,60 D: 10,30,60 解析: n[2][3] = { 10,20,30, 40,50,60 }; *( p[0] + 1) = p[i][j] (与此类似的形式还有 *( *( p+i ) + j )) 故等于20 (*p)[2]:*p指的是首行 2代表第三列 所以为 30 答案选B 2:存储以下数据,占用字节最多的是() A: 0 B: '0' C: " 0 " D: 0.0 解:int 在不同位数的计算机上表现出的长度不一样,其长度至少为2字节(在16位的计算机上),在32位的计算机上其长度为4字节,64位的计算机上长度为8字节 char 字段字节长度为8 “0”的长度为2 0.0的长度为8 3: 栈和队列共同的特点是 A: 只允许在端点处插入和删除 B: 都是先进后出 C: 都是先进先出 D: 没有共同点 解:栈和队列都是数据结构中的一种,栈是先进后出,其删除和插入数据只能在端点处进行,对列是先进先出型,插入和删除数据也只能在端点处进行,另外一个比较混淆的点是 栈通常用于深度遍历, 而队列用于广度遍历。 4: 任何一颗二叉树的叶节点在前序,中序,后序遍历序列中的相对次序 A: A和B 右方 B: A 和B祖先 C: A 和B左方 D: A 是B子孙 解:这道题题目的意思给的太迷乱了,所以我的理解也不一定正确,我的理解是A和B是两个叶子节点,共有一个父结点,所以无论是前序,中序还是后序遍历中,A总是在B的左边,所以选择C 5:下列关于MapReduce的说法正确的是? A: MapReduce有多个输入路径时,文件类型必须保持一致 B: 可以使用Counter观察MR Job运行的各种细节数据 C; 使用TextInputFormat时,Mapper的key类型为Text,value类型为LongWritable D: 以上都正确 解:MapReduce有多个输入路径时不需要保证文件类型一致,可以使用MultipleInouts类来指定多个Mapper函数,只要一个Map函数来处理一种类型的文件即可。 MapReduce Counter为提供我们一个窗口:观察MapReduce job运行期的各种细节数据 使用InputFormat时Mapper的key为LongWritable,表示偏移量,Text表示一行的文本 故选择 B 6:PCA降维中用到的算法是: A: 牛顿法 B: sgd C: svd D: Cutting-Plane 解:牛顿法:迭代算法 sgd:梯度下降算法 svd:推荐算法(Singular Value Decomposition) Cutting-Plane:列生成算法 其实小编对这几个算法并不大懂,所以具体的还望大神指导,具体答案小编目测是选B 7: A: 0.59 0.514 B: 1.14 1.02 C: 0.59 1.02 D; 0.514 0.59 解:B 8:请选出用于无监督学习问题的方法 A: SGD B: 反向传播 C: BFGS D: 幂迭代 解:D SGD:梯度下降算法 反向传播:Backpropagation algorithm,简称:BP算法,是一种监督学习算法,常被用来训练多层感知机 BFGS拟牛顿法,详情参考 幂迭代:聚类算法 9:Python中的浅拷贝会创建一个新的对象,但他包含的是对原始对象中包含项的引用,下列哪个操作不涉及浅拷贝 A: copy() B: list() C: 完全切片方法 D: 赋值(=) 解:答案选D 推荐一篇便于理解浅拷贝和深拷贝的文章:点击阅读 思路一:利用切片操作和工厂方法list方法拷贝就叫浅拷贝,只是拷贝最外围的对象本身,内部的元素都只是拷贝了一个引用而已。 思路二:利用copy中的deepcopy方法进行拷贝就叫做深拷贝,外围和内部元素都进行了拷贝对象本身,而不是引用。 但是对于数字,字符串和其他原子类型对象等,没有被拷贝的说法,即便是用深拷贝,查看id的话也是一样的,如果对其重新赋值,也只是新创建一个对象,替换掉旧的而已。 10:有一个文件ip.txt ,每行一条ip记录,共若干行,下列哪个命令可以实现统计出现次数最多的前三个ip及其次数 A: uniq -c ip.txt | sort -rn | head -n 3 B: sort ip.txt | uniq -c | sort -rn | head -n 3 C: cat ip.txt | count -n | sort -rn | head -n 3 D: cat ip.txt | sort | uniq -c | sort -rn | top -n 3 解:B linux基本命令具体自行百度 二:多选题 11:ls -l 显示如下 -rwxrw-r-- 1 aaa bbb 0 3月 4 11:21 ccc 下列那些说法是正确的/ A: 该文件是个目录 B: 该文件拥有者所在的组用户有权限修改文件 C: 该文件的权限数字表示为764 D: 该文件的拥有者是bbb 解:BC 参考 12:下列属于线性分类器的是 A: 决策树 B; 带和核函数的SVM C: logistics回归 D: 感知器 解:BCD 线性分类器:单层感知器网络、贝叶斯 非线性分类器:多层感知器网络、决策树 SVM本身是线性分类器,带核函数之后相当于把低维空间的数据映射到高维空间,之后就可以用线性分类器进行分类了 13: 下列常用的机器学习模型中那些属于生成模型 A: 朴素贝叶斯 B: 隐马尔可夫 C: 感知机 D: 决策树 解:B 朴素贝叶斯和隐马尔可夫是生成模型 感知机,决策树是判别模型 关于生成模型和判别模型结束 14:下列说法正确的是 A:StringBuilder是线程不安全的 B: java类可以同时用abstract 和 final声明 C: HasnMap中,使用get(key)==null 可以判断这个hashmap是否包含这个key D: volatike关键字不保证对变量操作的原子性 解:A,C,D abstract类是抽象类,必须做父类 15:Python中怎样替换一个字符串 A: String模块的sub函数 B: re模块的replace()函数 C: re模块的subn()函数 D: re模块的sub()函数 解:B,C,D A中string模块meiyousub方法,有replace函数 16:Spark中的RDD的持久化操作,下面说法正确的是? A: 调用persist()之后不需要主打unpersist() B: MEMORY_ONLY_SEP模式比MEMORY_ONLY模式快 C: OFF_HEAP模式不需要序列化数据 D: MEMORY_ADD_DISK模式当内存放马不下数据时会将部分数据存储到磁盘中 解:B,C,D 楼主不懂Spark,是百度之后的答案,仅供参考 17:对154个元素组成的有序表进行二分法查找,可能的比较次数为: A: 10 B: 8 C: 4 D: 1 解:画一个二叉树共八层,所以小于等于8即可 B,C,D 18:有一棵二叉树的前序遍历和后序遍历分别是1,2,3,4和4,3,2,1,则该二叉树的中序遍历可能是 A: 1,2,3,4 B: 2,3,4,1 C: 3,2,4,1 D: 4,3,2,1 解:C,D 19:已知logistic回归分类器的分类阀值是0.5,训练集中正负类比例为3:1,预测性能中正类的precision为0.88 recall为0.81 ,以下那些处理手段可能提高预测结果中正类的recall A: 降低分类判断的阀值为0.3 B: 训练集中正负类的训练比例调整为6:1 C: 加大logistic回归的正则项的权重值 D: 降低logistic回归的正则项的权重值 解: 20:以下随机变量的概率图模型,那些图是满足p( c,b | a) = p(c | a)p(b |a ) A: B: C: D: 解:A,C(楼主不太懂的路过,,,,,) 三:主观题 21: 解: 22: 解: 23:请描述Java的Thread类中的start()和run()两个方法的区别? 解: 24:(1)在SVM模型中,核函数的作用是什么?存在哪几种核函数 (2)对于SVM模型来说,松弛变量有何作用? 25:现在有两种类型的文字新闻:体育新闻和财经新闻各10000条(已分好类),想以此作为训练样本实现一个这两种新闻的自动分类器,请描述如何实现(从如何将一条新闻转化为一条用于训练的特征向量) 解:

优秀的个人博客,低调大师

mahout运行测试与数据挖掘算法之聚类分析(一)kmeans算法解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq1010885678/article/details/44984327 在使用mahout之前要安装并启动hadoop集群 将mahout的包上传至linux中并解压即可 mahout下载地址: 点击打开链接 mahout中的算法大致可以分为三大类: 聚类,协同过滤和分类 其中 常用聚类算法有:canopy聚类,k均值算法(kmeans),模糊k均值,层次聚类,LDA聚类等 常用分类算法有:贝叶斯,逻辑回归,支持向量机,感知器,神经网络等 下面将运行mahout中自带的example例子jar包来查看mahou是否能正确运行 练习数据下载地址: 点击打开链接 上面的练习数据是用来检测kmeans聚类算法的数据 使用hadoop命令运行mahout的例子程序(确保hadoop集群已开启) 在例子代码中写死了输入的路径是/user/hadoop/testdata 将练习数据上传到hdfs中对应的testdata目录下即可 写死的输出路径是/user/hadoop/output 执行命令: hadoop jar ~/mahout/mahout-examples-0.9-job.jar org.apache.mahout.clustering.syntheticcontrol.kmeans.Job 开始执行任务 由于聚类算法是一种迭代的过程(之后会讲解) 所欲他会一直重复的执行mr任务到符合要求(这其中的过程可能有点久。。。) 运行结果如下: mahout无异常 执行完这个kmeans算法之后产生的文件按普通方式是查看不了的,看到的只是一堆莫名其妙的数据 需要用mahout的seqdumper命令来下载到本地linux上才能查看正常结果 查看聚类分析的结果: ./mahout seqdumper -s /user/hadoop/output/data/part-m-0000 /home/hadoop/res 之后使用cat命令即可查看 cat res | more 现在来说说什么是kmeans聚类算法 所谓聚类算法就是将一份数据,按照我们想要的或者这份数据中的规律来将数据分类的算法 例如: 现有一份杂乱的样本数据,我们希望数据最后按照某些类别来划分(红豆分为红豆,绿豆分为绿豆等意思) 聚类算法会从n个类的初始中心开始(如果没有人为设置,其会按照随机的初始中心开始) 什么意思呢?来看一张图 上图中,左一的圆圈表示原始数据在随机的初始中心划分后的的分布 但是可以看出很明显cluster1中有很多是靠近cluster2的数据点 所以kmeans会根据规则再次计算出更加合适的中心点来进行划分 这个规则就是: 计算每个数据点,到原始中心cluster1和cluster2的距离 离谁比较近就划分到谁那边去(形如中间的圆圈) 然后将cluster1和cluster2中的数据分别求平均值,得到的两个平均值成为新的cluster1和cluster2中心点 但是很明显这样划分还是不够合理 所以kmeans会继续迭代计算每个数据到新的中心点的距离 离谁比较近就划分给谁 然后在分别求平均值得到新的中心点 直到cluster1和cluster2中的数据平均值不在发生变化时认为此时是最理想的划分方式(也可以进行人工的干预) 该算法的最大优势在于简介快速。算法的关键在于初始中心的选择和计算距离的公式 最后在调用一个mahout的一个算法来测试mahout 调用fpg算法(实现计数频繁项集的算法) 测试数据下载(电商购物车数据) 点击打开链接 在mahout的bin目录下 ./mahout fpg -i /user/hadoop/testdata/tail.txt -o /user/hadoop/output -method mapreduce -s 1000 -regex '[]' 各个参数的意义: -i:指定输入数据的路径 -o:指定输出结果的路径 -method:指定使用mapreduce方法 -s:最小支持度 -regex:使用指定的正则来匹配过滤数据 同样的,运行结果的数据要通过seqdumper来查看

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册