類似度をベースにお勧めのアイテムを計算する。
相変わらずデータセットは http://white-azalea.hatenablog.jp/entry/2013/10/08/000419
計算は http://white-azalea.hatenablog.jp/entry/2013/10/08/231209
やってることは、
- 他人との類似値を計算する
- 本人評価 x 類似値 = そのアイテムのおすすめ度
あと、ここでは計算してないけど、アイテムごとにおすすめ度を平均すれば、複数のユーザを鑑みたおすすめ度が計算できる筈。
コードは下記のみ
def findCommonKey(left:Map[String, Int], right:Map[String, Int]):Iterable[String] = { left.filter(kv => { val (key, _) = kv right.contains(key) }).map(kv => { kv._1 }) } def allExec(from:String) { val others = source.filterNot(kv => kv._1 == from) val fromSet = source(from) others.map(other => { val (userName, data) = other val commonKeys = findCommonKey(fromSet, data).toList // 共通キー val otherKeys = data.map(_._1).filterNot(commonKeys.contains) // お勧めの為のキーセット val point = EuclideanDistance.exec(fromSet, data) // 近似値 println("---------------------------------------") println("%s - %s : %f".format(from, userName, point)) println("commonKeys : " + commonKeys) println("otherKeys : " + otherKeys) println("---------------------------------------") otherKeys.map(key => { val osusumePoint = data(key) * point println("%s(%s):%f".format(key, userName, osusumePoint)) }) }) } allExec("delick")