美文网首页
Scala实现机器学习中常用的相识度和距离计算

Scala实现机器学习中常用的相识度和距离计算

作者: k_wzzc | 来源:发表于2019-07-13 16:04 被阅读0次

在机器学习和人工智能领域,距离(distance)、相似度(similarity)是经常出现的基本概念,关于距离和相似度度量的方法也多种多样,本文将总结一些常用的距离计算方法:

欧氏距离

d = \sqrt{(x_i-y_i)^2}
在二维平面即是两点间的直线距离,是最常用的距离度量的方法之一:

  /**
    *
    * @param p1
    * @param p2
    * @return Euclidean Distance
    */
 def euclidean(p1: Seq[Double], p2: Seq[Double]) = {
 
    require(p1.size == p2.size)

    val d = p1.zip(p2)
      .map(tp => pow(tp._1 - tp._2, 2))
      .sum

    sqrt(d)
  }

曼哈顿距离

d = \sum_{r=1}^n|x_i-y_i|
曼哈顿距离(Manhattan Distance)是由十九世纪的赫尔曼·闵可夫斯基所创词汇 ,是种使用在几何度量空间的几何学用语,用以标明两个点在标准坐标系上的绝对轴距总和。

  /**
    *
    * @param p1
    * @param p2
    * @return Manhattan Distance    
    */
  def manhattan(p1: Seq[Double], p2: Seq[Double]) = {
   
    require(p1.size == p2.size)

    p1.zip(p2).map(tp => abs(tp._1 - tp._2)).sum

  }

欧式距离和曼哈顿距离在二维平面空间的图示:


欧式距离与曼哈顿距离

切比雪夫距离

d= max(|x_i-y_i|)
是向量空间中的一种度量,二个点之间的距离定义是其各坐标数值差绝对值的最大值:

 /**
    *
    * @param p1
    * @param p2
    * @return Chebyshev Distance
    */
  def chebyshev(p1: Seq[Double], p2: Seq[Double]) = {

    require(p1.size == p2.size)

    p1.zip(p2).map(tp => abs(tp._1 - tp._2)).max

  }
国际象棋棋盘

闵氏距离

闵氏距离不是一种距离,而是一组距离的定义,上面提到的欧氏距离、曼哈顿距离、切比雪夫距离都是属于闵氏距离。
闵氏距离的定义如下:

d = \sqrt[p]{ \sum_{r=1}^n|x_i-y_i|^p }

/**
    *
    * @param p1
    * @param p2
    * @param p
    * @return Minkowski Distance
    */
  def minkowski(p1: Seq[Double], p2: Seq[Double], p: Int) = {
    require(p1.size == p2.size)
    val d = p1
      .zip(p2)
      .map(tp => pow(abs(tp._1 - tp._2), p))
      .sum

    pow(d, 1 / p)
  }

当 p=1 时,就是曼哈顿距离
当 p=2 时,就是欧式距离
当 p趋于无穷 时,就是闵氏距离


杰卡德距离

杰卡德距离(Jaccard Distance) 是用来衡量两个集合差异性的一种指标。


  /**
    *
    * @param p1
    * @param p2
    * @return Jaccard Distance  d(A,B) = 1-J(A,B) 表示Jaccard相似系数
    */
  
  def jaccard(p1: Seq[Any], p2: Seq[Any]) = {

    val anb = p1.intersect(p2).distinct
    val aub = p1.union(p2).distinct

    val jaccardcoefficient = anb.length.toDouble / aub.length

    1 - jaccardcoefficient

  }

Tanimoto 距离

Tanimoto系数是Jaccard系数的扩展

d = {X^TY\over ||x||^2+||y||^2+X^TY}

  /**
    *
    * @param p1
    * @param p2
    * @return Tanimoto Distance
    */
  def tanimoto(p1: Seq[Double], p2: Seq[Double]) = {
    require(p1.size == p2.size)

    val v1 = new DenseVector(p1.toArray)
    val v2 = new DenseVector(p2.toArray)

    val a: Double = p1.map(pow(_, 2)).sum
    val b: Double = p2.map(pow(_, 2)).sum
    val pq = v1.dot(v2)
 
    pq / (a + b - pq)
  }

余弦距离

余弦相似度是计算两个向量夹角的余弦值来度量两个向量的相似度,取值在0-1之间,越大则表示两个向量相似度越高:

d = {X^TY\over ||x|| \ ||y||}

 /**
    *
    * @param p1
    * @param p2
    */
  def cos(p1: Seq[Double], p2: Seq[Double]) = {
    require(p1.size == p2.size)

    val v1 = new DenseVector(p1.toArray)
    val v2 = new DenseVector(p2.toArray)

    val a = sqrt(p1.map(pow(_, 2)).sum)
    val b = sqrt(p2.map(pow(_, 2)).sum)

    val ab =  v1.t * v2

    ab / (a * b)
  }

余弦距离图示:


余弦距离 图片来源百度百科

参考资料:

1.百度百科
2.https://www.biaodianfu.com/jaccard-tanimoto.html

相关文章

  • Scala实现机器学习中常用的相识度和距离计算

    在机器学习和人工智能领域,距离(distance)、相似度(similarity)是经常出现的基本概念,关于距离和...

  • 机器学习技术博客集

    常见的距离算法和相似度(相关系数)计算方法 机器学习中的范数规则化之(一)L0、L1与L2范数 机器学习中的范数规...

  • ML-文本相似度

    局部敏感哈希(LSH) 文本相识度 计算文档文本相识度 主要方法 欧氏距离 编辑距离 余弦距离 Jaccard 距...

  • 0.课程介绍及教学说明

    机器学习基础概念和基础知识 机器学习常用算法,分类聚类 机器学习流程 阿里云PAI 云计算、大数据、人工智能的概念...

  • Flink DataSet 迭代

    机器学习和图计算应用,都会使用到迭代计算,Flink 通过在迭代算子中定义 Step 函数来实现迭代算法,迭代算法...

  • 机器学习-Scala实现(一)

    机器学习定义 机器学习完善了编程的思路,从通过编程的方式明确指定规则到从数据中通过一定算法自动学习提取规则,然后用...

  • JAVAEE与人工智能实战之-总结

    常用概念 机器学习实现人工智能的一种方法 深度学习是一种实现机器学习的技术 人工神经网络是深度学习领域常用的主要算...

  • 第一章 算法基础——距离计算

    1.4 距离计算 数值距离的计算是机器学习算法中对分析结果非常重要的衡量标准。数字计算主要集中的两个方面:一方面是...

  • 知识图谱学习笔记(二)——机器学习基础

    机器学习基础 1. 机器学习基础理论与概念 1.1 机器学习概要 机器学习专门研究计算机怎样模拟或实现人类的学习行...

  • 人工智能术语

    人工智能:一种计算机科学分支,旨在让计算机达到人类的智慧。实现这一目标有很多方式,包括机器学习和深度学习。 机器学...

网友评论

      本文标题:Scala实现机器学习中常用的相识度和距离计算

      本文链接:https://www.haomeiwen.com/subject/crlmkctx.html