spark 机器学习 knn 代码实现(二)
通过knn 算法规则,计算出s2表中的员工所属的类别
原始数据:
某公司工资表 s1(训练数据)
格式:员工ID,员工类别,工作年限,月薪(K为单位)
101 a类 8年 30k
[hadoop@h201 sss]$ cat s1.txt
101,a,8,30
102,a,6,35
103,a,12,42
104,b,1,6
105,b,1,5
106,a,3,50
没有分类的 员工工资表 s2(测试数据)
格式:员工ID, 工作年限, 月薪
108 1年 3.5k
[hadoop@h201 sss]$ cat s2.txt
108,1,3.5
109,6,22
以下代码为了方便初学者学习和理解,我把代码分开步骤展示,如果有spark开发经验可以把代码合并为spark脚本,或方法重写,能够减少上面代码中的冗余。
1.初始数据
1.1
scala> val train1=sc.textFile("hdfs://h201:9000/s1.txt")
//样本数据
scala> val test1=sc.textFile("hdfs://h201:9000/s2.txt")
//测试数据
1.2
scala> val cart1=test1 cartesian train1
//笛卡尔积
scala> cart1.collect
Array[(String, String)] = Array((108,1,3.5,101,a,8,30), (108,1,3.5,102,a,6,35), (108,1,3.5,103,a,12,42).....
1.3
val c1=cart1.map(_.toString()).map(a=>{
val a1=a.split(",")
val aa1=a1(0).replaceAll("\\(","")
val aa2=a1(1)
val aa3=a1(2)
val aa4=a1(3)
val aa5=a1(4)
val aa6=a1(5)
val aa7=a1(6).replaceAll("\\)","")
(aa1,(aa2,aa3,aa4,aa5,aa6,aa7))
})
//转换为key,value结构数据
2.1 欧式距离
def eur(x1: Double,y1: Double,x2: Double,y2: Double): Double = {
val d1=Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2))
return d1
}
//math.pow 算数.平方 ,math.sqrt 算数.开根
eur(1,3.5,8,30,102)
val c2 =c1.groupByKey.flatMap(line =>{
val h1 = line._2.toArray.map{case(x1,y1,bid,fenlei,x2,y2)=>(line._1,Math.floor(eur(x1.toDouble,y1.toDouble,x2.toDouble,y2.toDouble)),fenlei,bid)}
(h1)
})
//每个新加入的数据 距离训练数据的距离
//Math.floor 作用去除小数位
2.2确定k值(k=3)
val c3=c2.map(a=>{
val a11=a._1
val a22=(a._2,a._3,a._4)
(a11,a22)
}).groupByKey().map(b=>{
val b1=b._1
val b2=b._2.toArray.sortBy(x=>x._1).take(3)
(b1,b2)
})
//sortBy reverse参数 为scala语言中,array排序方法的降序表达,不加为升序表达
//spark RDD中 sortBy(x=>x._1,false,1) :false 为降序排列,1为分区数
3.K点中出现次数最多的分类(确定分类)
val c4=c3.map(a=>{
val a1=a._1
val a2=a._2.map(b=>b._2)
(a1,a2)
})
val c5=c4.flatMap(line=>{
val u1=line._2.map(a=>((line._1+"@"+a).toString,1))
(u1)
}).reduceByKey(_+_)
c5.sortBy(a=>a._2,false).take(2)
结果:
员工ID:108 属于b类
员工ID:109 属于a类
spark 机器学习 knn 代码实现(二)的更多相关文章
- spark 机器学习 随机森林 实现(二)
通过天气,温度,风速3个特征,建立随机森林,判断特征的优先级结果 天气 温度 风速结果(0否,1是)天气(0晴天,1阴天,2下雨)温度(0热,1舒适,2冷)风速(0没风,1微风,2大风)1 1:0 2 ...
- spark 机器学习 knn原理(一)
1.knnK最近邻(k-Nearest Neighbor,KNN)分类算法,在给定一个已经做好分类的数据集之后,k近邻可以学习其中的分类信息,并可以自动地给未来没有分类的数据分好类.我们可以把用户分 ...
- Spark机器学习API之特征处理(二)
Spark机器学习库中包含了两种实现方式,一种是spark.mllib,这种是基础的API,基于RDDs之上构建,另一种是spark.ml,这种是higher-level API,基于DataFram ...
- Spark机器学习之协同过滤算法
Spark机器学习之协同过滤算法 一).协同过滤 1.1 概念 协同过滤是一种借助"集体计算"的途径.它利用大量已有的用户偏好来估计用户对其未接触过的物品的喜好程度.其内在思想是相 ...
- 深入浅出KNN算法(二) sklearn KNN实践
姊妹篇: 深入浅出KNN算法(一) 原理介绍 上次介绍了KNN的基本原理,以及KNN的几个窍门,这次就来用sklearn实践一下KNN算法. 一.Skelarn KNN参数概述 要使用sklearnK ...
- spark机器学习从0到1介绍入门之(一)
一.什么是机器学习 机器学习(Machine Learning, ML)是一门多领域交叉学科,涉及概率论.统计学.逼近论.凸分析.算法复杂度理论等多门学科.专门研究计算机怎样模拟或实现人类的学习行 ...
- 机器学习——kNN(1)基本原理
=================================版权声明================================= 版权声明:原创文章 禁止转载 请通过右侧公告中的“联系邮 ...
- 机器学习之支持向量机(二):SMO算法
注:关于支持向量机系列文章是借鉴大神的神作,加以自己的理解写成的:若对原作者有损请告知,我会及时处理.转载请标明来源. 序: 我在支持向量机系列中主要讲支持向量机的公式推导,第一部分讲到推出拉格朗日对 ...
- Spark机器学习解析下集
上次我们讲过<Spark机器学习(上)>,本文是Spark机器学习的下部分,请点击回顾上部分,再更好地理解本文. 1.机器学习的常见算法 常见的机器学习算法有:l 构造条件概率:回归分 ...
随机推荐
- php 微信公众平台OAuth2.0网页授权,获取用户信息代码类封装demo
get_wx_data.php <?php /** * 获取微信用户信息 * @author: Lucky hypo */ class GetWxData{ private $appid = ' ...
- Linux系统调优——磁盘I/O(三)
(1).查看I/O运行状态相关工具 1)查看文件系统块大小 对于ext4文件系统,查看文件系统块大小 [root@CentOS6 ~]# tune2fs -l /dev/sda1 | grep siz ...
- 一个容器多个进程,一个pod多个容器
一个容器多个进程:在Docker的镜像编译脚本Dockerfile中带起多个进程,如下可以在contivNet.sh中启动多个进程 FROM 10.37.210.125:5001/suning/cen ...
- Mysql sqlyog 错误1045
首先打开运行窗口输入cmd进入DOS界面或者打开MySQL Workbench Step1: cd C:\Program Files\MySQL\MySQL Server 5.6\bin Step2: ...
- Go资源被墙最快解决方案
原文链接:https://juejin.im/post/5cd945946fb9a032060c47a3,补充,最新的1.13版本go里默认就是用go module,直接设置代理即可: 注:如果没法升 ...
- jenkins【目录】:目录
jenkins[目录]:目录 GitLab 自动触发 Jenkins 构建 返回
- 哈希--Hash,“散列”/“哈希”
哈希 Hash,翻译“散列”,音译为“哈希”,把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是散列值的空间通常远小于输入的空间,不同的输入可能会散 ...
- DateTimeFormatter 的操作与使用 -- 通俗易懂
在上一章我们讲解了LocalDate.LocalTime.LocalDateTime.Instant的操作与使用,下面讲解它们之间是如何进行格式化 DateTimeFormatter这个类它只提供了时 ...
- Nio学习笔记(大部分网上摘抄)
Nio与IO的区别 原有的 IO 是面向流的.阻塞的,NIO 则是面向块的.非阻塞的. 1.IO流每次从流中读一个或多个字节,直至读完所有字节,他们没有被缓存在其他地方,并且,IO流不能移动流中的数据 ...
- 2019ICPC南昌现场赛总结
非常可惜的一场比赛,多了60分钟罚时与银牌无缘.今年6场ICPC网络赛里面打的最差的就是南昌站,冥冥之中自有天意吧,最后被安排去了南昌. 开场被队友叫去先看的L,说是足球,发现就是简单模拟,就直接上机 ...