【BIT云计算大作业】基于Spark的K近邻(KNN)查询以及K-mer计数
以下实验源码均使用Scala语言编写。
作业中使用的输入文件可以通过以下网盘地址下载:
https://pan.baidu.com/s/1J8miFmJ6RVZKZqe2O5gAwg
提取码:ethn
输入文件放置在项目根目录下的file文件夹(也可以根据实际情况进行调整)。
大作业一:基于Spark的K近邻(KNN)查询
问题描述:
在空间中共有N个点,每个点由R维向量表示其坐标,对于一个点,KNN指距离其最近的K个点的集合,距离为欧几里得距离。
参数:
K = 20(返回近邻的个数)
R = 4(每个点的坐标维度)
要查询KNN的坐标 (0,0,0,0)
输入文件: KNN-input.txt
i,a,b,c,d (共1000行,每行开始一个整数i,表示点的id,之后4个整数,表示坐标,数据之间以”,”分割)
输出结果:
- 问题1:输出K个整数,为查询的K近邻结果的id,按照距离升序排序(如果距离相等优先输出id靠前的)。
- 问题2:输出1个浮点数,为K近邻距离的平均值
- 问题3:输出1个浮点数,为K近邻距离的方差
题解:
import org.apache.spark.{SparkConf, SparkContext}object KNN {val parameter_K: Int = 20 //KNN中的参数Kval pivot: Array[Int] = Array(0,0,0,0) //要查询KNN的坐标def main(args: Array[String]): Unit = {//步骤1:启动spark并读入数据val sparConf = new SparkConf().setMaster("local").setAppName("KNN")val sc = new SparkContext(sparConf)val lines = sc.textFile("file\\KNN-input.txt")val array = lines.collect()//步骤2:定义相关函数//字符串处理,返回(Array[Int], Int)元组def String_Split(str : String) = {val arr = str.split(",").map(x_ => x_.toInt)(arr.slice(1,arr.length),arr(0))}//计算到数组中所有点到某个点的距离,并返回(Array[Int], Int, Double)元组def Calculate_Distance(t : (Array[Int], Int), p : Array[Int]) = {val arr = t._1var dist: Int = 0for(i <- arr.indices){val diff = arr(i) - p(i)dist += diff * diff}(arr,t._2,math.sqrt(dist))}//计算数组平均值def Calculate_Average(arr: Array[Double]) = {var sum: Double = 0arr.foreach(x => sum += x)sum/arr.length}//计算数组方差def Calculate_Variance(arr: Array[Double]) = {val avg = Calculate_Average(arr)var variance: Double = 0arr.foreach(x => {val diff = x - avg; variance += diff * diff})variance/arr.length}//步骤3:进行KNN算法//进行字符串处理val ret = array.map(String_Split)//对数组每个元素依次计算到pivot的距离.map(t => Calculate_Distance(t,pivot))//按照距离为第一优先级,id为第二优先级排序.sortWith((a,b) => if(a._3 == b._3) {a._2 < b._2} else {a._3 < b._3})//最后选取前K个元素.slice(0,parameter_K)//步骤4:提取ret的ID和距离,赋值给ids和distances数组val ids = ret.map(t => t._2)val distances = ret.map(t => t._3)//步骤5:输出数据ids.foreach(x => {print(x);print(" ")})println()println("%.4f".format(Calculate_Average(distances)))println("%.4f".format(Calculate_Variance(distances)))//步骤6:停止运行sc.stop()}
}
输出结果:
560 223 554 438 324 474 274 574 294 397 291 75 440 596 684 423 658 752 118 914
38.8574
34.3549
大作业二:基于Spark的K-mer计数
问题描述:
K-mer是一个长度为K ( K > 0 )的子串,K-mer计数是指整个序列中K-mer出现的频度,本题需要返回出现次数排在前N的子串和出现频率。
假如输入的字符串为ABCDA,K=2,那么子串包含 AB, BC, CD, DA
参数:
K = 2(子串长度)
N = 10(返回排在前N的子串和频率)
输入格式: KM-input.txt
S(长度任意的字符串)
输出结果:
- 问题1:共N组输出,每组输出为字符串和出现频率,按照出现次数降序排序,若出现次数相同,按照字符串的字典序降序排序。
- 问题2:输出一个浮点数,为所有字符串出现次数的平均值
题解:
import org.apache.spark.{SparkConf, SparkContext}
import scala.collection.mutable._object Kmer {val parameter_K: Int = 2 //子串长度val parameter_N: Int = 10 //返回排在前N的子串和频率def main(args: Array[String]): Unit = {//步骤1:启动spark并读入数据val sparConf = new SparkConf().setMaster("local").setAppName("Kmer")val sc = new SparkContext(sparConf)val lines = sc.textFile("file\\KM-input.txt")val array = lines.collect()//步骤2:定义枚举子串函数def Find_SubStrings(str : String, k : Int) = {val ret : ListBuffer[String] = ListBuffer()for(i <- 0 until str.length - k + 1){val substr = str.substring(i,i+k)ret += substr}ret.toList}//步骤3:定义字串排名函数def String_Count(str : String) = {Find_SubStrings(str,parameter_K).groupBy(str => str).map(t_ => (t_._1, t_._2.length)).toList.sortWith((a,b) => if(a._2 == b._2) {a._1 > b._1} else {a._2 > b._2})}//步骤4:定义输出与统计函数def Show_Infomation(l : List[(String, Int)], n : Int) = {l.slice(0,n).foreach(x_ => println(x_._1 + "," + x_._2))var avg: Double = 0l.foreach(x_ => avg += x_._2)val ret = avg/l.lengthprintln("%.4f".format(ret))}//步骤5:对array的每一行字符串均进行以上操作,并输出结果array.foreach(str => Show_Infomation(String_Count(str),parameter_N))//停止运行sc.stop()}
}
输出结果:
NM,16
XH,15
PN,15
IX,15
QX,14
FK,14
DL,14
XK,13
SK,13
RZ,13
7.3950
【BIT云计算大作业】基于Spark的K近邻(KNN)查询以及K-mer计数相关推荐
- 操作系统大作业 基于Linux的模拟进程调度算法 运用c++语言编程 在VMware虚拟机里 centos 亲自写亲自测试 代码 说明书
发布文章 博文管理我的博客退出 Trash Temp 操作系统大作业 基于Linux的模拟进程调度算法 运用c++语言编程 在VMware虚拟机里 centos 亲自写亲自测试 代码 说明书 @[TO ...
- matlab求解多自由度振动系统,【2017年整理】1-《机械振动基础》大作业,基于matlab的多自由度振动.doc...
[2017年整理]1-<机械振动基础>大作业,基于matlab的多自由度振动 <机械振动基础>大作业 (2016年春季学期) 题目多自由度振动系统的固有频率和固有阵型 姓 名学 ...
- 江南大学C语言大作业,TCPIP大作业基于TCP的网络通信编程C语言版(江南大学).doc...
TCPIP大作业基于TCP的网络通信编程C语言版(江南大学).doc TCP/IP协议编程大作业 课题名称 基于TCP的网络通信 专 业 计算机科学与技术 班 级 计算机1206 学 号 103041 ...
- 嵌入式系统大作业——基于QT的3D模型展示
嵌入式系统大作业--基于QT的3D模型展示 写在前面 实验设备 实现内容 实现过程 在win10上利用SolidWorks软件对模型进行预处理: 编写代码实现功能: 效果演示 参考资料 写在前面 该大 ...
- 【数字图像处理】大作业 基于模式匹配的车牌识别
大作业 基于模式匹配的车牌识别 1 课程设计任务 2 设计框图 3 准备工作 4 任务流程 4.1 图像预处理 4.2 图像分割 4.2.1 车牌定位 (1) 上下定界--水平扫描 (2) 左右定界- ...
- 数字信号处理大作业——基于matlab R2019a的男声变女声资料汇总与代码
@数字信号处理大作业--基于matlab R2019a的男声变女声资料汇总与代码 概述 参考了很多前人的资料,发现很多函数已经过时了,而且从我通过VIP下载的代码来看,代码的逻辑不是很清晰,废话也多, ...
- 数字图像处理——大作业 基于车道信息的违法车辆车牌识别
数字图像处理--大作业 基于车道信息的违法车辆车牌识别 一.车牌识别研究现状与分析 二.车牌识别算法原理 2.1 车牌定位 2.1.1 基于RGB阈值的车牌区域初定位 2.1.2 基于数学形态学的车牌 ...
- HTML期末大作业~基于HTML+CSS+JavaScript旅游网站设计与实现(6个页面)
HTML期末大作业~HTML+CSS+JavaScript旅游网站设计与实现->绿色古典的旅游度假景区(6个页面) 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大?HTML ...
- 用matlab实现女声变男声步骤,数字信号处理大作业——基于matlab R2019a的男声变女声资料汇总与代码...
@数字信号处理大作业--基于matlab R2019a的男声变女声资料汇总与代码 概述 参考了很多前人的资料,发现很多函数已经过时了,而且从我通过VIP下载的代码来看,代码的逻辑不是很清晰,废话也多, ...
- HTML期末大作业~基于HTML+CSS+JavaScript 牛排美食餐饮网站设计与实现(6个页面)
HTML期末大作业~基于HTML+CSS+JavaScript 牛排美食餐饮网站设计与实现 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大?HTML网页作业无从下手?网页要求的总 ...
最新文章
- Android 机型适配之gradient默认渐变方向
- python基础包括什么-python中f是什么
- async-validator 表单验证两种数据的解决方案
- 启动子级时出错_WHO I级脑膜瘤手术或放射外科治疗后的恶性转变
- html如何在本页路径上拼接参数,Html图片路径拼接参数实现打印导出
- 有些事,领导不直接找你,让同事联系你,这是什么套路?
- js关于子元素不触发父元素事件的若干方法
- Catalent康泰伦特上海外高桥临床供应中心扩建温控产能;富士胶片发布2021财年第三季度财报 | 医药健闻...
- 计算机网络通信同步异步效率,同步传输和异步传输的区别及优缺点
- 误操作导致系统进不去得重装,C盘资料没备份?!别慌,还有救!-200820
- 高数_第5章常微分方程_二阶微分方程
- PDF编辑_隐私条款
- VisualFreeBasic:VisualBasic6望尘莫及之短路逻辑
- Python爬虫采集抓取:Python3.x+Fiddler 采集抓取 APP 数据
- ISO27002新版标准变化解读
- 语法格式描述规范BNF、EBNF、ABNF
- 代码管理(git)及代码规范
- php 去重数组,php 数组 去重
- 滴滴出行2017校园春招内推面试(一)
- 上位机编程工控控件全览,漂亮工控控件
热门文章
- vue实现刷新页面,页面回到顶部
- Typora基本技巧
- Silverlig1.Silverlight读取外部XML加载配置-(使用WebClient读取XAP包同目录下的XML文件)...
- 【vscode简单入门(四)】vscode精美UI主题推荐 (~」还你一个花里胡哨的vscode「~)
- Apache Ranger:统一授权管理框架
- 学计算机发朋友圈文案,2020开学发朋友圈文案句子精选100句
- day-9 字符串笔记
- 在VT上搜索恶意软件
- 经典分子动力学势能模型拟合程序atomicrex介绍
- Sue的小球 [费用提前计算]