はじめに:
簡単に言うと、共通の推薦アルゴリズムを説明します。
アルゴリズム | 説明 |
---|---|
推奨ベースのリレーショナルルール (相関ルール) |
•購入製品Aへの消費者、彼はB品を買うために少しのチャンスだったので )、ビールとおむつの•ショッピングカート分析を |
推奨内容に基づいて (コンテンツベース) |
Webコンテンツ自動分類、自動分類して、ユーザーを分析• •推奨新関心のあるユーザーにページを分類しました |
推薦の人口統計タイプ (人口統計) |
•ユーザーの分類指標としての個人の属性(性別、年齢、学歴、居住地、言語) •このような塩基への勧告など |
協調フィルタリング推薦 (協調フィルタリング) |
•製品のすべてのユーザー評価観察することによって、ユーザの嗜好を推測すること もおそらく同様に、彼らは、現在のユーザーの製品のように、•製品のレビューや記事の他のユーザーを検索します |
推奨達成するために、協調フィルタリングアルゴリズムを使用しています。このブログ
主な欠点は以下の通りです協調フィルタリングアルゴリズムを:
利点 | 短所 |
---|---|
•あなたはパーソナライズされた勧告を達成することができ ませんコンテンツ分析• •ユーザーが興味の新しいポイントを発見することができます •自動化度の高いです |
•コールドスタートの問題:何の履歴データができ、分析もないではないでしょうがある場合 •新しいユーザーの問題:新しいユーザーを評価していない、彼の好みを知っていません |
実際の開発ではプロセス・モデルはとても良いの進角環境を構築するために、アルゴリズムを実装するために、ここで使用される正確な勧告、ブロガーやスパークのpythonの目的を達成するように、相補性を達成するように、推薦アルゴリズムの調整プロセスのさまざまな基づいています、参照がメインのブログの前に行うことができる記事の環境に加えて、設定されているだけでなく、準備するMovieLensオープンソースのデータを、ブロガーここで100kのデータセットで、私たちは自分のマシンに応じた構成を選択し、以下の質問に来ます:
まず、必要なライブラリをインポート
import pyspark
# 这个类的导入是次要的,可要可不要,主要是一个Rating类用于方便表示rating
from pyspark.mllib.recommendation import Rating
# 这个就是导入推荐算法中的交替最小二乘法库
from pyspark.mllib.recommendation import ALS
インスタンス化オブジェクトを求めての火花とダウン
sc = pyspark.SparkContext(master='local[*]',appName="test1")
データを準備します
ローカルからデータをインポート
raw_user_data = sc.textFile("file:/home/zh123/.jupyter/workspace/ml-100k/u.data")
インポートしたデータ形式を見ます
raw_user_data.take(5)
['196\t242\t3\t881250949',
'186\t302\t3\t891717742',
'22\t377\t1\t878887116',
'244\t51\t2\t880606923',
'166\t346\t1\t886397596']
前のデータの各行「「\ T」フラグメンテーション処理のために(フェッチのみ正面3つのユーザ、製品、評価)
raw_ratings = raw_user_data.map(lambda line:line.split("\t")[:3])
スライス後のデータ・フォーマットを見てください
raw_ratings.take(5)
[['196', '242', '3'],
['186', '302', '3'],
['22', '377', '1'],
['244', '51', '2'],
['166', '346', '1']]
データの各行は、オブジェクト評価の評価(ユーザ、製品、評価)が行われます
ratings_rdd = raw_ratings.map(lambda x:Rating(*x))
データ形式の完全な建設を見ます
ratings_rdd.take(5)
[Rating(user=196, product=242, rating=3.0),
Rating(user=186, product=302, rating=3.0),
Rating(user=22, product=377, rating=1.0),
Rating(user=244, product=51, rating=2.0),
Rating(user=166, product=346, rating=1.0)]
ユーザーが開始したトレーニングセットの数
# 流程:投影出用户字段 -> 然后对用户字段去重 -> 统计用户的个数
user_count = ratings_rdd.map(lambda x:x.user).distinct().count()
user_count
943
製品の数は、トレーニングセットを初期化します
# 流程:投影出产品字段 -> 对产品进行去重 -> 统计产品数量
product_count = ratings_rdd.map(lambda x:x.product).distinct().count()
product_count
1682
スタートのトレーニングモデル
model = ALS.train(ratings_rdd,rank=10,iterations=10,lambda_=0.01)
ユーザーが製品を推奨するためのモデル
# recommendProducts参数含义 (user:用户id,num:需要为该用户推荐的产品数量)
model.recommendProducts(user=100,num=10)
[Rating(user=100, product=464, rating=6.328077627837865),
Rating(user=100, product=1114, rating=6.0246494675621864),
Rating(user=100, product=888, rating=5.957080472811217),
Rating(user=100, product=776, rating=5.94518524812436),
Rating(user=100, product=1456, rating=5.570928201780987),
Rating(user=100, product=1153, rating=5.276014679950186),
Rating(user=100, product=745, rating=5.273830915853978),
Rating(user=100, product=309, rating=5.2226922589528755),
Rating(user=100, product=1159, rating=5.214222938082385),
Rating(user=100, product=967, rating=5.191467123059153)]
モデルは、製品のユーザーによって推奨しました
# recommendUsers 参数含义 (product:产品id,num:需要推荐的用户数量)
model.recommendUsers(product=101,num=10)
[Rating(user=575, product=101, rating=7.786829895272848),
Rating(user=842, product=101, rating=7.385093317833681),
Rating(user=777, product=101, rating=6.815955510387151),
Rating(user=310, product=101, rating=6.749508509094776),
Rating(user=752, product=101, rating=6.4059841032560945),
Rating(user=745, product=101, rating=6.303744522941349),
Rating(user=281, product=101, rating=6.268866937046303),
Rating(user=51, product=101, rating=6.250170924530637),
Rating(user=695, product=101, rating=6.158916996903442),
Rating(user=649, product=101, rating=5.951955147976774)]
輸入製品情報データ
product_data = sc.textFile("file:/home/zh123/.jupyter/workspace/ml-100k/u.item")
ビューのデータサンプル
product_data.take(5)
['1|Toy Story (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Toy%20Story%20(1995)|0|0|0|1|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0',
'2|GoldenEye (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?GoldenEye%20(1995)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0',
'3|Four Rooms (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Four%20Rooms%20(1995)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0',
'4|Get Shorty (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Get%20Shorty%20(1995)|0|1|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0',
'5|Copycat (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Copycat%20(1995)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|1|0|0']
製品データの各行|スプリットは、その後、「最初の2を取ります」
# 产品数据格式(product_id,product_name)
product_rdd = product_data.map(lambda line:line.split("|")).map(lambda x:(int(x[0]),x[1]))
product_rdd.take(5)
[(1, 'Toy Story (1995)'),
(2, 'GoldenEye (1995)'),
(3, 'Four Rooms (1995)'),
(4, 'Get Shorty (1995)'),
(5, 'Copycat (1995)')]
IDを使用して生成された製品の展示 - >名前マッピング辞書
product_id_to_name = product_rdd.collectAsMap()
list(product_id_to_name.items())[:5]
[(1, 'Toy Story (1995)'),
(2, 'GoldenEye (1995)'),
(3, 'Four Rooms (1995)'),
(4, 'Get Shorty (1995)'),
(5, 'Copycat (1995)')]
推奨ディスプレイ製品名
for item in model.recommendProducts(user=100,num=10):
print("为用户 {} 推荐 {} 推荐指数: {}".format(item.user,
product_id_to_name[item.product],
item.rating))
为用户 100 推荐 Vanya on 42nd Street (1994) 推荐指数: 6.328077627837865
为用户 100 推荐 Faithful (1996) 推荐指数: 6.0246494675621864
为用户 100 推荐 One Night Stand (1997) 推荐指数: 5.957080472811217
为用户 100 推荐 Three Wishes (1995) 推荐指数: 5.94518524812436
为用户 100 推荐 Beat the Devil (1954) 推荐指数: 5.570928201780987
为用户 100 推荐 Backbeat (1993) 推荐指数: 5.276014679950186
为用户 100 推荐 Ruling Class, The (1972) 推荐指数: 5.273830915853978
为用户 100 推荐 Deceiver (1997) 推荐指数: 5.2226922589528755
为用户 100 推荐 Stalker (1979) 推荐指数: 5.214222938082385
为用户 100 推荐 Little Lord Fauntleroy (1936) 推荐指数: 5.191467123059153