推奨されるシステムでかなり一般的なアプリケーションモデルであるLFM(潜在因子モデル)隠された意味論的モデル。その異なるItemCFまたはUserCFを持つこのモデルは、その:
- UserCFのために、私たちが最初に同じような興味のユーザーとターゲットユーザーを算出し、再度算出されたターゲットユーザのお気に入り項目に基づいてユーザーにアイテムをお勧めします。
- そしてItemCFは、我々はこれらの項目と同様の項目を見つけるために、ユーザの好みのアイテムをターゲットして、ユーザに推薦することができます。
- 我々はまだ、ユーザーが商品の分類を推奨するユーザの興味に応じてソートと分類されたすべての項目を実行する方法を持って、LFMは、このアプローチを実装するために使用されます。
最後の方法は、以下の質問に対処する必要性を実現する場合:
- 商品分類へ
- どのような種類と関心のレベルユーザの関心が属するかを決定します
- クラスに興味を持ってユーザーの場合、ユーザーにアイテムを推奨する方法
分類は、それが記事人工ソートを考えるのは簡単ですが、それはユーザーが喜劇を見るかもしれないですので、人工的な分類は映画など、非常に主観的なものですが、彼は(チャウ・シンチー)主演見ていますので、それがあってもよいです、フィルムの西型の一部であるため、別の人が別の分類を得ることができることも可能です。
物品の分類および粒子サイズを制御することが困難であり、そのような線形代数として必要な程度まで物品は、数学に分類することができるかどうか、それはまた再び微細適用も線形代数の主要分野によれば、数学に分類することができますポイントが、非専門家の分野における人々のために、私たちは、このようなサイズのセグメントは間違いなく報われないものである小物を作りたいです。
そして、アイテムは、それが、このクラスに沿って、より多くのであるかどうか、クラスに属するが、この記事では他の項目に比べて?手動で決定しますすることは非常に困難です。この問題を解決するために、我々は暗黙のセマンティックモデルを必要としています。セマンティックモデルを隠れ、それが完全に制御可能な粒子サイズによって、すなわち、ユーザの行動自動クラスタリングに基づいて、クラスの数であってもよいです。
アイテムが完全にクラスを持つユーザの行動によって決定されているかどうか、我々は2つの記事は、多くのユーザーのようなものながら、これら2つの項目が同じクラスに所属する大きなチャンスを持っていることを前提としています。また、重量のクラスのシェアの項目の右側が、は計算から来ることができます。
次の式は、ユーザu I関心のある項目のためのセマンティックモデルの計算式を隠されています。
ここで、P U、k個の策ユーザーの関心との関係、uはk番目の隠しクラス、およびQ I、k個の策クラスとk番目の隠されたアイテムIとの関係
2つのパラメータpとqを計算する方法である、ここで使用されるこの線形モデルを計算する方法は、勾配降下法で質問をしました。おそらくアイデアは、ユーザーが好きで、商品アイテムを嫌い、pとqは、このデータセットに基づいて計算されるなど、データのセットを、使用することです。
負のサンプルが存在しない場合は、ユーザーのために、彼は負のサンプルとして、商品のいくつかの項目が、サンプルの振る舞いからサンプリングし、正と負のサンプルの数はかなりそのすべてのユーザーを確保するためにされていません。
下記の式は、正のサンプルについて、我々は、r = 1を設定し、負のサンプルは、0 =最適なパラメータとパラメータp qを見つけるために最適化されるべき次損失関数をrは
内部パラメータの損失関数Pの二組があり、英国およびQ IK、確率的勾配降下法は、それらが偏微分のために必要とされた取得することができます。
次いで、確率的勾配降下法によれば、パラメータは、最急降下方向にする必要がある、以下の漸化式を得ることができます。
αは学習率である場合、それは試行錯誤によって得られた選択する必要があります。
過剰適合正則化項を以下に示し防ぐために、ラムダの後ろにPythonのコード。
インポートプール、マネージャーマルチプロセッシングからの 数学のインポートEXPから インポートPANDAS AS PD NP ASインポートnumpyの インポート漬物 インポート時間 :DEFのgetResource(csvPath) 「」「 元のデータを取得する :PARAM csvPath:CSV生データパス :リターン:フレーム 」「」 フレームをpd.read_csv =(csvPath) リターンフレーム DEF getUserNegativeItem(フレーム、ユーザーID): '「」は、 トップが、ユーザが正のフィードバックの数に等しい全くスコアがありませんでした:ユーザーからのフィードバック項目マイナスを取得 :PARAMフレーム:評価データ :PARAMのユーザーID:ユーザーID :リターン:負帰還記事 '' ' userItemlist一覧=(SET(フレーム[フレーム['ユーザーID '] ==ユーザーID] [' MOVIEID "]))#ユーザがアイテムを評価しました otherItemList = [セット内のアイテムのアイテム #アイテムがuserItemlistでない場合(フレーム[ 'MOVIEID']値)] の項目ユーザが得点しない ITEMCOUNT個= LEN(フレーム[フレーム #1 otherItemList内のアイテムの[ 'MOVIEID'] ==アイテム] [ 'ユーザーID'])] 人気記事 シリーズ= pd.Series(ITEMCOUNT個、インデックス= otherItemList) シリーズseries.sort_values =(昇順=偽)[:LEN( userItemlist)]#は負帰還の記事記事の正のフィードバックの数を取得 negativeItemListを=リスト(series.index) を返すnegativeItemList DEF getUserPositiveItem(フレーム、ユーザーID): 「'」 ユーザー正帰還アイテムを取得する:評価項目以上 のparamフレーム:評価データ :PARAMのユーザーID:ユーザーID :リターン:正のフィードバックの記事 '' ' シリーズ=フレーム[フレーム['ユーザーID '] ==ユーザーID] [' MOVIEID「] positiveItemList =リスト(series.values ) 戻りpositiveItemList DEF initUserItem(フレーム、ユーザID = 1): 「」 ' 初期ユーザー記事、正と負のフィードバック、正帰還がラベルで、負のフィードバックは0である :PARAMフレーム:評価データ :のparamユーザーID:ユーザーID :リターン:正および負のフィードバック物品辞書 '' ' positiveItem getUserPositiveItem =(フレーム、ユーザID) negativeItem getUserNegativeItem =(フレーム、ユーザID) itemDict = {} 項目のpositiveItemで:itemDict [商品] = 1。 negativeItemにおける項目の:itemDict [アイテム] = 0 戻りitemDict DEF initPara(ユーザーID、アイテムID、classCount): '' ' 初期化パラメータQ、P行列、ランダム :PARAMのUSERCOUNT:ユーザーID :PARAM ITEMCOUNT個:アイテムID :PARAMのclassCount:隠されたクラスの数 :リターン:パラメータP、Qの ' '" arrayp np.random.rand =(LEN(ユーザID)、classCount) arrayq = np.random.rand(classCount、LEN(アイテムID)) P = pd.DataFrame(arrayp、カラム=範囲(0 、classCount)、ユーザID =指数) Q = pd.DataFrame(arrayq、アイテムID列=、レンジ指数=(0、classCount)) リターンP、Q DEFワーク(ID、キュー): '' ' 多機能スレーブプロセス :PARAM ID:ユーザーID :PARAMキュー:キュー '' ' プリント(ID) itemDict initUserItem =(フレーム、ユーザID = ID) queue.put({ID:itemDict}) DEF initUserItemPool(ユーザID): ' '' ターゲットユーザサンプルを初期化します 。 paramユーザーID:ターゲット・ユーザー :リターン: 「」 ' プール=プール() userItem = [] キュー=マネージャー()キュー()。 ユーザーIDのidのため:pool.apply_async(仕事、引数=(ID、キュー)) pool.close() pool.join() キューではないながら、 .empty():userItem.append(queue.get()) 戻りuserItem DEF initModel(フレーム、classCountは ):''」 模型を初始化:参数P、Q、样本数据 :PARAMフレーム:源数据 :PARAM classCount:隐类数量 :リターン :''」 USERID =リスト(セット(フレーム[ 'ユーザID']値)) アイテムID =リスト(セット(フレーム。[ 'MOVIEID']値)) P、Q = initPara(ユーザーID、アイテムID、classCount ) userItem = initUserItemPool(ユーザID) リターンP、Q、userItem DEF SIGMOD(X) : 「」 ' 、単位ステップ関数、関心度は、[0で定義されています範囲内1] :XのPARAM:興味 :リターン:興味 ''' Y = 1.0 /(1 + EXP(-X-)) リターンY DEF lfmPredict(P、Q、ユーザID、アイテムID): ' '' パラメータpを用い、ターゲット・オブジェクトのQ予測対象のユーザーの関心度 :のparam P:ユーザーの興味と暗黙のクラス関係 :のparam Q:関係隠されたクラスや記事 :のparamユーザーID:ターゲット・ユーザー :のparam ITEMID:対象項目 :リターン:の予測関心 '' ' P = np.mat(p.ix [ユーザID] .values) Q = np.mat(Q [アイテムID] .values).T R&LT =(P * Q).SUM() R&LT SIGMOD =(R&LT)は R&LT戻り DEF latenFactorModel(フレーム、classCount、iterCount、アルファ、ラムダ)を: '' ' 隠された意味論的モデル計算パラメータP、Q :PARAMフレーム:データ・ソースを :PARAM classCount:隐类数量 :PARAM iterCount:迭代次数 :PARAMアルファ:步长 :PARAMラムダ:正则化参数 :リターン:参数P、Q ''」 P、Q、userItem = initModel(フレーム、classCount) ステップの(0、iterCount)の範囲内: userItemにおけるユーザの: user.itemsでユーザーIDのために、サンプル(): アイテムIDのために、samples.itemsにRUI(): EUI = RUI - lfmPredict(P、Q、ユーザID、アイテムID) のために範囲内のF(0、classCount): プリント( 'ステップ%dのユーザ%のDクラス%D' %(ステップ、ユーザID、F)) P [F] [ユーザID] + =アルファ*(EUI * Q [アイテムID] [ F] -ラムダ* pを[F] [ユーザID]) Q [アイテムID] [F] + =アルファ*(EUIの*はP [f]を[ユーザーID] -ラムダ* Q [アイテムID] [F]) 、α* = 0.9 戻りP、Q DEF、(フレームを勧めユーザID、P、Q、上位N = 10):''」 推荐はTopN个物品给目标用户 :のparamフレーム:ソースデータ :のparamユーザーID:ターゲット・ユーザー :のparam P:ユーザーの興味と暗黙のクラス関係 :QのPARAM:関係隠されたクラスや記事 :PARAMのTopN:数推奨 :リターン:お勧めの記事 '' ' userItemlist一覧=(SET(フレーム[フレーム['ユーザーID '] ==ユーザID] [' MOVIEID '])) otherItemList = [商品アイテムのSET(フレーム[ための' MOVIEID「]。値)はアイテムIFでuserItemlist] predictList = [otherItemListにアイテムIDのためlfmPredict(P、Q、ユーザID、アイテムID)] シリーズ= pd.Series(predictList、インデックス= otherItemList) シリーズ= series.sort_values(昇順=偽):上位N] 戻り一連 なら__name__ == '__main__': フレーム=のgetResource( 'ratings.csv') P、Q = latenFactorModel(フレーム、5、10、0.02、0.01) L =(フレーム、1、P、Q)お勧め プリント(L)を