20707
例を挙げて説明します。  
たとえば、A,B,Cという3ユーザがいて、それぞれじゃんけんでグーチョキパーを出す確率が、

> A: 20 30 50  
>  B: 60 20 20  
>  C: 20 40 40

だとします。(数字は%で、トータルは100%固定)

この場合、AとBよりAとCのほうが似た手を出すといえると思うので、  
Cというユーザをレコメンドしたいです。

これを毎回計算すると、計算量が多く速度が出ないのではと懸念しています。  
ユーザごとの類似度を事前に計算しておき、別テーブルに格納するなどは思いつくのですが、  
他によい手法等ありましたら教えて頂きたいです。

ポイントとしては、

  1. トータルの値は固定で、カラム数も決まっている(今回でいうと、グーチョキパーを集計すると100%)
  2. 機能としては類似ユーザをレコメンドするのみ
  3. ユーザ数は1万人ほど

という感じです。

動作サーバはまだ決めていないので、スペックは出せません。  
言語としてはPythonかRubyで、Webサービスを考えています。  
よろしくお願いします。
CC BY-SA 3.0
2016-01-06T03:05:06.467
20643
2016-01-07T07:25:04.043
12840
question
ruby python
類似ユーザをレコメンドする際のシステム設計について
webサービスの場合は、REDISのようなキャッシュを使うといいと思います。  
DJANGOのようなWEBフレームワークを使った場合、そのための関数デコレータがすでに用意されていますが、自分で作るのは難しくないですね。

redisを使った例：

```

    import redis
    
    cache = redis.StrictRedis(host='localhost', port=6379, db=0)
    
    def redis_cache_decorator(f):
        """Redis Cache Decorator"""
        def cache_func(*args):
            key = '-'.join(repr(arg) for arg in args)
            result = cache.get(key)
            if result is None:
                result = f(*args)
                cache.set(key, result)
            else:  
                result = int(result)  # redisの場合、bytesとした返されるので、変換が必要
                print('cache hit!') # for demo only!
            return result
        return cache_func
    
    @redis_cache_decorator
    def process_heavy_func(v1, v2):
        # 処理行う
        return v1 - v2
    
    process_heavy_func(9, 2)  # 結果が計算されて、キャッシュされる
    process_heavy_func(9, 2)  # 同じargsを渡すとキャッシュされた値が返される　（cache hit!が表示）
    
```

関数デコレータについて  
<http://www.lifewithpython.com/2014/12/python-decorator-syntax.html>
CC BY-SA 3.0
2016-01-07T07:25:04.043
20707
2016-01-07T07:25:04.043
2314
20643
answer