1. 程式人生 > >Scala實現Pearson皮爾遜相似度計算

Scala實現Pearson皮爾遜相似度計算


皮爾遜相似度是推薦演算法中常見的 計算相似度的方法,其公式如下:


從公式可以看出 該演算法有幾個缺點:

1,如果使用者A對所有item的評分都一樣,那麼將無法計算別人跟A的相似度(分母為0);所以該演算法不適用於 boolean preference型別的推薦

2,如果使用者A只對1個item進行了評分,那麼也無法計算別人跟A的相似度(分母為0);所以對於資料量較小,或者矩陣非常之稀疏的資料都不太好用

object SimilarityAlg {

  def PearsonCorrelationSimilarity(vec1 : Vector[Double], vec2 : Vector[Double]): Double = {
    val sum_vec1 = vec1.sum
    val sum_vec2 = vec2.sum

    val square_sum_vec1 = vec1.map(x => x * x).sum
    val square_sum_vec2 = vec2.map(x => x * x).sum

    val zipVec = vec1.zip(vec2)

    val product = zipVec.map(x => x._1 * x._2).sum
    val numerator = product - (sum_vec1 * sum_vec2 / vec1.length)

    val dominator = pow((square_sum_vec1 - pow(sum_vec1, 2) / vec1.length) * (square_sum_vec2 - pow(sum_vec2, 2) / vec2.length), 0.5)


    if(dominator == 0)
      0
    else
      numerator / (dominator * 1.0)
  }

  def main(args: Array[String]): Unit = {
    val vec1 = Vector(5.0, 3.0, 2.5)
    val vec2 = Vector(4.0, 2.5, 2.0)

    print(PearsonCorrelationSimilarity(vec1, vec2))
  }
}