微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spark之K-近邻算法

Spark之K-近邻算法

关于K-近邻算法的详细描述可以看
MapReduce之KNN算法
简而言之,K近邻算法即根据已经分类好的数据,通过特定的方式进行对比,对为分类的数据进行分类,Spark程序如下所示

package KNN

import org.apache.spark.{SparkConf, SparkContext}

object KNN {
  def main(args: Array[String]):Unit={
    val sparkConf=new SparkConf().setAppName("KNN").setMaster("local")
    val sc=new SparkContext(sparkConf)

    val k=2  //KNN中的k
    val d=2  //向量唯独
    val inputDatasetR="input/R.txt"  //查询数据集文件路径
    val inputDatasetS="input/S.txt"  //训练数据集文件路径
    val output="output"
    //广播共享对象
    val broadcastK=sc.broadcast(k)
    val broadcastD=sc.broadcast(d)
    //创建RDD
    val R=sc.textFile(inputDatasetR)
    val S=sc.textFile(inputDatasetS)
    //计算向量之间的距离函数
    def calculatedistance(rAsstring: String, sAsstring: String,d: Int):Double={
      val r=rAsstring.split(",").map(_.todouble)
      val s=sAsstring.split(",").map(_.todouble)
      if(r.length!=d||s.length!=d) Double.NaN else{
        math.sqrt((r,s).zipped.take(d).map{
          case(ri,si)=>math.pow((ri-si),2)
        }.reduce(_+_))
      }
    }
    //R对S做笛卡尔积
    val cart=R cartesian S
    //找到R中的r与S中的s之间的距离
    val knnMapped = cart.map(cartRecord => {
      val rRecord = cartRecord._1
      val sRecord = cartRecord._2
      val rTokens = rRecord.split(";")
      val rRecordID = rTokens(0)
      val r = rTokens(1)
      val sTokens = sRecord.split(";")
      val sClassificationID = sTokens(1)
      val s = sTokens(2)
      val distance = calculatedistance(r, s, broadcastD.value)
      (rRecordID, (distance, sClassificationID))
    })
    //按照R中的r对距离进行分组
    val knnGrouped = knnMapped.groupByKey()
    //找到k个邻近并对r分类
    val knnOutput = knnGrouped.mapValues(itr => {
      val nearestK = itr.toList.sortBy(_._1).take(broadcastK.value)
      val majority = nearestK.map(f => (f._2, 1)).groupBy(_._1).mapValues(list => {
        val (stringList, intlist) = list.unzip
        intlist.sum
      })
      majority.maxBy(_._2)._1
    })
    //打印结果
    knnOutput.foreach(println)

    sc.stop()
  }
}

zhangdy12307 发布了115 篇原创文章 · 获赞 5 · 访问量 1万+ 私信 关注

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐