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))
  }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值