日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

机器学习——欧式距离和余弦距离

發布時間:2024/6/21 综合教程 25 生活家
生活随笔 收集整理的這篇文章主要介紹了 机器学习——欧式距离和余弦距离 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在數據分析和挖掘的過程中,為了知道個體間差異的大小,我們需要去評價個體之間的相似性,數據的挖掘方法可以分為分類和聚類,如KNN和KMeans.

而衡量個體差異的方法主要分為兩種,距離度量——歐式距離,相似度度量——余弦距離。

1、歐式距離

  衡量個體在空間上存在的距離,距離越遠說明個體間的差異越大。

根據歐幾里得公式: 計算出每個點之間的絕對距離,對于歐式距離公式,求其倒數將范圍規定與(0,1),對于值越靠近與1的則相似度越高

2、余弦距離

  余弦距離也稱為余弦相似度,是用向量空間中兩個向量夾角的余弦值作為衡量兩個個體間差異的大小的度量,

當兩個向量的方向接近于一致,夾角趨于0則兩個向量就相近,也可以稱兩個個體之間相似。

將三角形的兩邊a,b當作向量:

求其夾角公式如下:

關于相似度和余弦距離的關系如下圖:角度越小則相似度越高

3、舉例分析

假設5個用戶對喜歡的水果進行打分如下形成一個DataFrame:

val spark = SparkSession.builder().appName("euclidean").master("local[*]").getOrCreate()
    val schema = StructType(Seq(
      StructField("userid",StringType,false),
      StructField("apple",DoubleType,false),
      StructField("banana",DoubleType,false),
      StructField("orange",DoubleType,false),
      StructField("watermelon",DoubleType,false),
      StructField("melon",DoubleType,false)
    ))
    val df = spark.createDataFrame(spark.sparkContext.parallelize(Seq(
      Row("nol",4.5,5.0,0.0,3.0,0.0),
      Row("no2",0.0,0.0,5.0,4.0,0.0),
      Row("no3",4.0,3.0,4.5,0.0,4.0),
      Row("no4",0.0,0.0,0.0,0.0,5.0),
      Row("no5",4.0,3.0,2.0,1.0,0.0)
    )),schema)

求歐式距離:

每一個用戶需要對每一個水果都要求解歐式距離,假設當前用戶:arr1,比較用戶:arr2

定義函數如下:

//歐氏距離公式
  def calcEuc(arr1:Array[Double],arr2:Array[Double])={
    val lst:ListBuffer[Double] = ListBuffer[Double]()
    for (num1<-0 until arr1.length;num2<-0 until arr2.length;if num1==num2){
      lst.append(math.pow(arr1(num1)-arr2(num2),2))
    }
    1/(1+math.sqrt(lst.sum)) //求出接近于1則用戶之間更相似
  }

//查相似度(每兩個用戶間相似度)
  def eucli(rdd:List[Array[Double]])={
    val lst:ListBuffer[ListBuffer[Double]] = ListBuffer[ListBuffer[Double]]()
    for (arr<-rdd){
      val sec:ListBuffer[Double]=ListBuffer[Double]()
      for(a1<-rdd){
        //計算歐式距離公式
        sec.append(calcEuc(arr,a1))
      }
      lst.append(sec)
    }
    lst
  }

求解如下:

val cls = df.columns.filter(x => x != "userid").map(x=>col(x))
    val rdd = df.select(concat_ws(",", cls: _*).alias("feature")).rdd.toLocalIterator.toList.map(r => {
      val arr = r(0).toString.split(",").map(x => x.toDouble)
      arr
    })
    val res =eucli(rdd)
    res.foreach(x=>x.foreach(println))

1.0 0.10592130260593688 0.12444584824196174 0.10098718092501505 0.2222222222222222 0.10592130260593688 1.0 0.1167355195593027 0.10960059084055324 0.13231996486433337 0.12444584824196174 0.1167355195593027 1.0 0.12819304429541925 0.17176743283130236 0.10098718092501505 0.10960059084055324 0.12819304429541925 1.0 0.11881849050177154 0.2222222222222222 0.13231996486433337 0.17176743283130236 0.11881849050177154 1.0

求余弦距離:

1#求點積

 //點積
  def dj(arr1:Array[Double],arr2:Array[Double])={
    val lst:ListBuffer[Double]=ListBuffer[Double]()
    for(num1<-0 until arr1.length;num2<- 0 until arr2.length;if num1==num2){
      lst.append(arr1(num1)*arr2(num2))
    }
    lst.sum
  }

2#求模

//向量求模
  def mod(vec:Array[Double])={
    math.sqrt(vec.map(math.pow(_,2)).sum)
  }

3#余弦相似度公式

def calcCos(arr1:Array[Double],arr2:Array[Double])={
    dj(arr1,arr2)/(mod(arr1)*mod(arr2))
  }

4#相似度計算

  //查相似度(每兩個用戶間相似度)
  def eucli(rdd:List[Array[Double]])={
    val lst:ListBuffer[ListBuffer[Double]] = ListBuffer[ListBuffer[Double]]()
    for (arr<-rdd){
      val sec:ListBuffer[Double]=ListBuffer[Double]()
      for(a1<-rdd){
        //計算余弦相似度
       sec.append(calcCos(arr,a1))
      }
      lst.append(sec)
    }
    lst
  }

求解如下:

val cls = df.columns.filter(x => x != "userid").map(x=>col(x))
    val rdd = df.select(concat_ws(",", cls: _*).alias("feature")).rdd.toLocalIterator.toList.map(r => {
      val arr = r(0).toString.split(",").map(x => x.toDouble)
      arr
    })
    val res =eucli(rdd)
    res.foreach(x=>x.foreach(println))

1.0000000000000002
0.25444237836283273
0.5724809269635496
0.0
0.892363919068504
0.25444237836283273
1.0
0.44899090442330025
0.0
0.39918616395854073
0.5724809269635496
0.44899090442330025
0.9999999999999999
0.5111012519999519
0.7931681071869339
0.0
0.0
0.5111012519999519
1.0
0.0
0.892363919068504
0.39918616395854073
0.7931681071869339
0.0
1.0

總結

以上是生活随笔為你收集整理的机器学习——欧式距离和余弦距离的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 熟妇人妻精品一区二区三区视频 | 三上悠亚人妻中文字幕在线 | 麻豆视频在线观看免费网站 | 告诉我真相俄剧在线观看 | 中文字幕在线观看三区 | 亚洲一区高清 | 一区二区久久久 | 国产欧美日韩亚洲 | 国产精品美女久久久久久久久 | 国产精品久久久久久久久久辛辛 | 欧美裸体xxxx极品少妇 | 久久综合中文 | 欧美三级欧美成人高清 | 91桃色在线观看 | 精品国产黄色 | 蜜桃精品视频在线 | 性xxxxx大片免费视频 | 国产女人18毛片水真多1 | 国产又粗又黄又爽又硬的视频 | 日本一品道 | 成人黄色激情 | 中国精品一区二区 | 欧美精品免费播放 | 国产日韩欧美另类 | 不卡二区| 一个人看的www日本高清视频 | 国产精久久一区二区三区 | 日韩国产成人 | 午夜精品久久久久久99热 | 色噜噜亚洲 | 久久亚洲无码视频 | mm131丰满少妇人体欣赏图 | 狐狸视频污 | 国产精品视频不卡 | 中文字幕一区二区三区免费 | 亚洲a一区二区 | 91啦中文 | 国产精品久久久久久三级 | 日韩网站免费 | 中文字幕一区二区三区四区欧美 | www久久久| 2019亚洲天堂| 久草视频在线观 | 欧美激情视频一区二区三区在线播放 | 亚洲午夜在线视频 | www.国产精品视频 | 少妇高潮露脸国语对白 | 日韩欧美久久久 | 国产精品久久久久久免费播放 | 亚洲三级a | 中文精品在线 | 视频在线免费观看 | 老司机一区 | av新天堂| 狠狠躁夜夜躁av无码中文幕 | 精品伦精品一区二区三区视频密桃 | 欧美日韩成人在线观看 | 一二三不卡视频 | 日本欧美在线 | 无码人妻aⅴ一区二区三区69岛 | 国产成年人网站 | 黄色国产一区二区 | 一级成人免费 | 懂色aⅴ国产一区二区三区 亚洲欧美国产另类 | 高潮白浆女日韩av免费看 | 污污视频在线免费看 | 色999在线观看 | japanese强行粗暴 | 欧美熟妇另类久久久久久多毛 | 亚洲天堂黄 | 一区二区三区四区在线观看视频 | www.youjizz.com在线观看 | 日韩a在线播放 | 91视频第一页| 老司机伊人 | 国产理论片 | 深夜免费在线视频 | 激情久久av一区av二区av三区 | 一区二区三区成人 | 精品久久9999 | 免费看a | 久久视频这里只有精品 | av久色| av三级在线播放 | 二级黄色片 | 交专区videossex非洲 | 亚洲三级伦理 | 亚洲国产视频在线观看 | 国内自拍网站 | 日本少妇作爱视频 | 另类综合在线 | 色女人在线| 中日韩av电影 | 老汉av网站 | 欧美亚洲精品一区二区 | 天天躁日日躁狠狠躁 | 伊人精品视频在线观看 | 日本人妻丰满熟妇久久久久久 | 日韩精品一区三区 |