以下是一个只用scala语言开发的推荐系统,可以参考一下,这个能运行一些小数据集,当然可以改造成多线程,实践中表明,百M级别多线程和分布式的相同配置的机器在运算上并没有很大的时间上的差别。这个要研究scala源码的线程池对象(和java的很类似)。
SimilarityMetrics.scala:
package com.glad.ml
object SimilarityMetrics {
/**
* Calculate Pearson Correlation
* @param u
* @param v
* @return
*/
def pearsonCorrelation(u: Map[Int, Double], v: Map[Int, Double]): Double = {
val xMean = u.values.sum / u.values.size
val yMean = v.values.sum / v.values.size
val diffValues = (u.keys ++ v.keys).map { key =>
// what to do with missing values?
val x = u.getOrElse(key, 0.0)
val y = v.getOrElse(key, 0.0)
(x - xMean, y - yMean)
}
val (cov, sx, sy) = diffValues.foldLeft((0.0, 0.0, 0.0)) { (a, b) =>
val (x, y) = b
(a._1 + (x * y), a._2 + (x * x), a._3 + (y * y))
}
// pearson correlation
cov / (Math.sqrt(sx) * M