2012-03-24 8 views
-1

推奨エンジンを構築し、新しいユーザーの問題を解決しようとしています。新しいユーザーに選択した数のアイテムの評価を依頼し、最も類似している他のユーザーを見つけてください。次に、同様のユーザーからのデータを使用して、初期の推奨事項を生成します。評価に基づくユーザー類似度アルゴリズムの例

以前はアイテム間の推奨事項に取り組んでいたので、これを行う方法はわかりません。誰かがこれの例を持っていますか?いくつかの擬似コードまたは任意の言語(好ましくは関数言語ではない)の実装。

私はユーザベースの最近傍アルゴリズムを探していますが、わかりません。予め

答えて

3

おかげコールドスタート問題は、ユーザがユーザの類似性に基づいて、実装に指定されていません。あなたのアイテムアイテムの類似性ベースの実装でこれをどのように解決しましたか?

すでに1つのアプローチを提案しています。ユーザーがデータを提供するようにします。それが実現可能なら、それはすばらしい答えです。理想的には、多様性のあるアイテムを選択します。

データを取得する前に、シンプルなトップ10リストを推奨事項として表示してから、データポイントが1つある瞬間から最高の状態に推薦してください。それは私にとって「普通の」方法です。

+0

を与えたすべての人に

おかげで、問題をコールドスタート。現在、多くの推奨事項は、ユーザが任意の2つのアイテムを好んでいた回数のカウンタを有するすべてのアイテムのマトリックスを使用して行われる。たとえば、userAがitem1、item2、item3を好きでuserBがitem1とitem3を好む場合、行列は(item1、item2)1、(item1、item3)2などのように見えます。新しいユーザーの推奨事項では、私はその提言がより適切であると思う。彼らは私が何か新しいことを学んでいない場合:) – TrueWheel

+0

OK。あなたの共起数は、あなたがユーザーの類似点を計算するのに役立つものではありません。そのためには、本当にユーザーとユーザーの共同作業が必要です。しかし、それは正接です。私はあなたのための最善の答えは、あなたが持っている最初の評価からの推奨を計算し、評価がないときにトップ10リストを表示することだと思います。 –

+0

アドバイスをいただきありがとうございます。私は、ユーザーが最初にサイトにサインアップしたときに製品を評価するよう求めてきました。次に、共起カウントを使用できるようになるまで、初期の推奨事項について同様のユーザーを特定します。私は以下のコードを貼り付けます。 – TrueWheel

1

これはアクティブな学習の問題として枠を付けることができます。 Karimi, Freudenthaler, Nanopoulos, and Schmidt-Thieme (2011)は、行列分解の設定でそれを処理する一方の方法を示していますが、IMOでは、そのアプローチには多大な問題があります(もっと良い方法で作業していますが、今は使えないほど遅いです)。

基本的な質問は次のとおりです。この新しいユーザーの嗜好について、どの項目が最もわかりやすく伝えられますか?おすすめエンジンの詳細を知らなくても、さまざまなジャンルの人気映画など、ユーザーが意見を持つ可能性の高い比較的多様なアイテムを選ぶだけでは不十分です。

+0

アドバイスありがとうございます。私は最初の勧告のために類似したユーザーを識別するためにさまざまな項目の数を評価する最初のサインアップ時にユーザーに尋ねるつもりです。私は以下のコードを貼り付けます。 – TrueWheel

0

ここに私の最初の試みはこの問題を解決することです。新しいユーザーには、さまざまな商品の評価をお願いします。次に、これらの評価に基づいて最も類似している既存の3人のユーザーを特定します。その後、私はこれら3人のユーザーの情報を使用して、初めてサイトを訪れる際にアイテムを推薦することができます。私はアイテムのアイテムを解決していない私にアドバイス:)

/** 

    * Select all of the customer ratings 
    */ 

$rows = getRows("SELECT * FROM customer_ratings;", 'NUM'); 

if(isset($_POST['submit'])){ 

    //Fill distanse array to zero for all items 
    $distance = array_fill(0, count($rows), 0); 

    $instance = $_POST['instance']; 


    //Loop over each of the exisiting ratings rows 
    for($i = 0; $i < count($rows); $i++) { 
     //Loop over the 5 items (The first two are id and name we only need 2-6) 
     for($j = 2; $j < 7; $j++) { 
       $distance[$i] += abs(($rows[$i][$j] - $instance[$j])); 
     } 
    } 

    //Sort distances by ascending order 
    asort($distance); 

    $distanceCopy = $distance; 

    $stringBuff = ""; 

    //Select the three most similar 
    for($i = 0; $i < 3; $i++){ 
     $maxs = array_keys($distanceCopy, min($distanceCopy)); 
     $stringBuff = $stringBuff . " ". ($maxs[0]+1) .","; 
     unset($distanceCopy[$maxs[0]]); 
    } 

    $stringBuff = substr_replace($stringBuff,"", -1); 

    echo "String buff: ".$stringBuff; 

    $mostSimilar = getRows("SELECT name FROM customer_ratings WHERE id IN ($stringBuff);", 'NUM'); 

} 
関連する問題