【BIT云计算大作业】基于Spark的K近邻(KNN)查询以及K-mer计数

这篇具有很好参考价值的文章主要介绍了【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中的参数K
  val 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._1
      var dist: Int = 0
      for(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 = 0
      arr.foreach(x => sum += x)
      sum/arr.length
    }

    //计算数组方差
    def Calculate_Variance(arr: Array[Double]) = {
      val avg = Calculate_Average(arr)
      var variance: Double = 0
      arr.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(长度任意的字符串)
输出结果:文章来源地址https://www.toymoban.com/news/detail-429799.html

  • 问题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 = 0
      l.foreach(x_ => avg += x_._2)
      val ret = avg/l.length
      println("%.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计数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机器学习之KNN(K近邻)算法

    KNN算法又叫做K近邻算法,是众多机器学习算法里面最基础入门的算法。KNN算法是最简单的分类算法之一,同时,它也是最常用的分类算法之一。KNN算法是有监督学习中的分类算法,它看起来和Kmeans相似(Kmeans是无监督学习算法),但却是有本质区别的。 KNN算法基于实例之间

    2024年02月08日
    浏览(24)
  • 机器学习——K最近邻算法(KNN)

    机器学习——K最近邻算法(KNN) 在传统机器学习中,KNN算法是一种基于实例的学习算法,能解决分类和回归问题,而本文将介绍一下KNN即K最近邻算法。 K最近邻(KNN)算法是一种基于实例的学习算法,用于分类和回归问题。它的原理是 根据样本之间的距离来进行预测 。 核

    2024年02月09日
    浏览(30)
  • 四、分类算法 - KNN算法(K-近邻算法)

    目录 1、K-近邻算法 1.1 K-近邻算法原理 1.2 K - 近邻算法API 1.3 案例1:鸢尾花种类预测 1.3.1 数据集介绍 1.3.2 步骤 1.4 KNN 算法总结 sklearn转换器和估算器 KNN算法 模型选择和调优 朴素贝叶斯算法 决策树 随机森林 1.3.1 数据集介绍 1.3.2 步骤 获取数据 数据集划分 特征工程   - 标准

    2024年02月22日
    浏览(35)
  • 【机器学习实战】K- 近邻算法(KNN算法)

    K-近邻算法 ,又称为  KNN 算法 ,是数据挖掘技术中原理最简单的算法。 KNN  的工作原理:给定一个已知类别标签的数据训练集,输入没有标签的新数据后,在训练数据集中找到与新数据最临近的 K 个实例。如果这 K 个实例的多数属于某个类别,那么新数据就属于这个类别。

    2023年04月20日
    浏览(42)
  • 8_分类算法-k近邻算法(KNN)

    定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。 来源:KNN算法最早是由Cover和Hart提出的一种分类算法 K近邻(K-nearst neighbors,KNN)是一种基本的机器学习算法,所谓k近邻,就是k个最近的邻居

    2024年02月11日
    浏览(28)
  • PyTorch中的K最近邻(KNN)算法

    欢迎来到这篇博客!今天我们将深入探讨PyTorch中的K最近邻(KNN)算法,这是一种简单但非常有用的机器学习算法。无论你是机器学习初学者还是有一些经验,我们将从头开始,逐步解释KNN算法的工作原理和如何在PyTorch中实现它。 K最近邻算法是一种监督学习算法,用于分类

    2024年01月21日
    浏览(28)
  • 机器学习与模式识别2:KNN(k近邻)

    首先,随机选择K个对象,而且所选择的每个对象都代表一个组的初始均值或初始的组中心值,对剩余的每个对象,根据其与各个组初始均值的距离,将他们分配各最近的(最相似)小组,然后重新计算每个小组新的均值,这个过程不断重复,直到所有的对象在K组分布中都找

    2024年02月12日
    浏览(27)
  • 【Python机器学习】实验06 KNN最近邻算法

    1. k k k 近邻法是基本且简单的分类与回归方法。 k k k 近邻法的基本做法是:对给定的训练实例点和输入实例点,首先确定输入实例点的 k k k 个最近邻训练实例点,然后利用这 k k k 个训练实例点的类的多数来预测输入实例点的类。 2. k k k 近邻模型对应于基于训练数据集对

    2024年02月15日
    浏览(34)
  • 机器学习 | Python实现KNN(K近邻)模型实践

    基本介绍 一句话就可以概括出KNN(K最近邻算法)的算法原理:综合k个“邻居”的标签值作为新样本的预测值。更具体来讲KNN分类过程,给定一个训练数据集,对新的样本Xu,在训练数据集中找到与该样本距离最邻近的K(下图k=5)个样本,以这K个样本的最多数所属类别(标签

    2024年02月13日
    浏览(46)
  • 【机器学习】分类算法 - KNN算法(K-近邻算法)KNeighborsClassifier

    「作者主页」: 士别三日wyx 「作者简介」: CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」: 对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 is_array() 可以 「检测」 变量是不是 「数组」 类型。 语法 参数 $var :需要检

    2024年02月16日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包