技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

おすすめアイテムの計算

類似度をベースにお勧めのアイテムを計算する。

相変わらずデータセット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")