Scala實現Pearson皮爾遜相似度計算
阿新 • • 發佈:2019-02-16
皮爾遜相似度是推薦演算法中常見的 計算相似度的方法,其公式如下:
從公式可以看出 該演算法有幾個缺點:
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)) } }