皮尔逊相似度是推荐算法中常见的 计算相似度的方法,其公式如下:
从公式可以看出 该算法有几个缺点:
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))
}
}