spark计算列与列之间的余弦相似度

import org.apache.spark.mllib.linalg
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.linalg.distributed.{CoordinateMatrix, RowMatrix}
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.SparkSession

object Test {
  def main(args: Array[String]): Unit = {
    val spark: SparkSession = SparkSession.builder().master("local").getOrCreate()
    //创建稠密向量
    val dv1: linalg.Vector = Vectors.dense(1.0, 1.0, 3.0)
    val dv2: linalg.Vector = Vectors.dense(2.0, 2.0, 4.0)
    //使用两个本地向量创建一个RDD[Vector]
    val rows: RDD[linalg.Vector] = spark.sparkContext.parallelize(Array(dv1, dv2))
    //通过RDD[Vector]创建一个行矩阵
    val matrix = new RowMatrix(rows)
    //返回类型是CoordinateMatrix,一个矩阵,该矩阵下标为(x,y)的元素就是原矩阵第x列和第y列的相似度。
    //MatrixEntry(0,1,0.9999999999999999) 就是第0列和第一列的相似度是0.9999999999999999
    //MatrixEntry(1,2,0.9838699100999074)
    //MatrixEntry(0,2,0.9838699100999074)
    val matrix1: CoordinateMatrix = matrix.columnSimilarities()
    matrix1.entries.foreach(println)
  }
}

参考

怎样使用Spark计算一个集合各个元素(向量表示的)的两两之间的余弦相似度? - 知乎

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
余弦相似度是一种用于度量两个向量之间相似度的方法。在Spark中,可以使用MLlib库中的CosineSimilarity来计算两个向量之间余弦相似度。下面是一个使用Spark MLlib计算余弦相似度的示例代码: ```scala import org.apache.spark.ml.feature.{HashingTF, IDF, Tokenizer} import org.apache.spark.ml.linalg.Vector import org.apache.spark.ml.linalg.DenseVector import org.apache.spark.ml.feature.Normalizer import org.apache.spark.ml.feature.StandardScaler import org.apache.spark.ml.linalg.Vectors val data = Seq( (0, "hello world"), (1, "hello spark"), (2, "hello hadoop"), (3, "hello hadoop spark"), (4, "hello world hadoop") ).toDF("id", "text") val tokenizer = new Tokenizer() .setInputCol("text") .setOutputCol("words") val wordsData = tokenizer.transform(data) val hashingTF = new HashingTF() .setInputCol("words") .setOutputCol("rawFeatures") .setNumFeatures(20) val featurizedData = hashingTF.transform(wordsData) val idf = new IDF().setInputCol("rawFeatures").setOutputCol("features") val idfModel = idf.fit(featurizedData) val rescaledData = idfModel.transform(featurizedData) val vectors = rescaledData.select("features").rdd.map(r => r(0).asInstanceOf[Vector]).collect() val denseVectors = vectors.map(v => new DenseVector(v.toArray)) val normalize = new Normalizer() .setInputCol("features") .setOutputCol("normFeatures") .setP(2.0) val normalizedData = normalize.transform(rescaledData) val scaler = new StandardScaler() .setInputCol("features") .setOutputCol("scaledFeatures") .setWithStd(true) .setWithMean(false) val scaledData = scaler.fit(normalizedData).transform(normalizedData) val bVectors = spark.sparkContext.broadcast(denseVectors) val cosineSimilarity = scaledData.map { row => val vector = row.getAs[Vector]("scaledFeatures") val bDenseVectors = bVectors.value val similarities = bDenseVectors.map(dv => (dv, dv.dot(vector))).sortBy(-_._2) (row.getAs[Int]("id"), similarities) } cosineSimilarity.collect().foreach(println) ``` 该示例代码使用Tokenizer将文本数据分词,并使用HashingTF将词汇转换为特征向量。然后,使用IDF对特征向量进行加权,最后使用Normalizer和StandardScaler对特征向量进行标准化和缩放。最后,使用Spark的广播变量,将所有特征向量存储在内存中,并使用map函数计算每个向量与所有其他向量之间余弦相似度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值