当前位置:  开发笔记 > 编程语言 > 正文

ALS模型 - 预测full_u*v ^ t*v等级非常高

如何解决《ALS模型-预测full_u*v^t*v等级非常高》经验,为你挑选了1个好方法。

我正在预测批量训练模型的流程之间的评级.我正在使用此处概述的方法:ALS模型 - 如何生成full_u*v ^ t*v?

! rm -rf ml-1m.zip ml-1m
! wget --quiet http://files.grouplens.org/datasets/movielens/ml-1m.zip
! unzip ml-1m.zip
! mv ml-1m/ratings.dat .

from pyspark.mllib.recommendation import Rating

ratingsRDD = sc.textFile('ratings.dat') \
               .map(lambda l: l.split("::")) \
               .map(lambda p: Rating(
                                  user = int(p[0]), 
                                  product = int(p[1]),
                                  rating = float(p[2]), 
                                  )).cache()

from pyspark.mllib.recommendation import ALS

rank = 50
numIterations = 20
lambdaParam = 0.1
model = ALS.train(ratingsRDD, rank, numIterations, lambdaParam)

然后提取产品功能......

import json
import numpy as np

pf = model.productFeatures()

pf_vals = pf.sortByKey().values().collect()
pf_keys = pf.sortByKey().keys().collect()

Vt = np.matrix(np.asarray(pf_vals))

full_u = np.zeros(len(pf_keys))

def set_rating(pf_keys, full_u, key, val):
    try:
        idx = pf_keys.index(key)
        full_u.itemset(idx, val)
    except:
        pass

set_rating(pf_keys, full_u, 260, 9),   # Star Wars (1977)
set_rating(pf_keys, full_u, 1,   8),   # Toy Story (1995)
set_rating(pf_keys, full_u, 16,  7),   # Casino (1995)
set_rating(pf_keys, full_u, 25,  8),   # Leaving Las Vegas (1995)
set_rating(pf_keys, full_u, 32,  9),   # Twelve Monkeys (a.k.a. 12 Monkeys) (1995)
set_rating(pf_keys, full_u, 335, 4),   # Flintstones, The (1994)
set_rating(pf_keys, full_u, 379, 3),   # Timecop (1994)
set_rating(pf_keys, full_u, 296, 7),   # Pulp Fiction (1994)
set_rating(pf_keys, full_u, 858, 10),  # Godfather, The (1972)
set_rating(pf_keys, full_u, 50,  8)    # Usual Suspects, The (1995)

recommendations = full_u*Vt*Vt.T

top_ten_ratings = list(np.sort(recommendations)[:,-10:].flat)

print("predicted rating value", top_ten_ratings)

top_ten_recommended_product_ids = np.where(recommendations >= np.sort(recommendations)[:,-10:].min())[1]
top_ten_recommended_product_ids = list(np.array(top_ten_recommended_product_ids))

print("predict rating prod_id", top_ten_recommended_product_ids)

然而,预测的评级似乎太高了:

('predicted rating value', [313.67320347694897, 315.30874327316576, 317.1563289268388, 317.45475214423948, 318.19788673744563, 319.93044594688428, 323.92448427140653, 324.12553531632761, 325.41052886977582, 327.12199687047649])
('predict rating prod_id', [49, 287, 309, 558, 744, 802, 1839, 2117, 2698, 3111])

这似乎是不正确的.任何提示赞赏.



1> yoh.lej..:

我认为如果你只关心电影的排名,所提到的方法就会奏效.如果你想得到一个实际的评级,那么在尺寸/缩放方面似乎有些东西.

这里的想法是猜测新用户的潜在表现.通常,对于已经在分解中的用户i,用户i,你有他的潜在表示u_i(第i行model.userFeatures())并且你得到他对给定电影(电影j)的评级,使用model.predict它基本上乘以u_i产品的潜在表示v_j.如果你乘以整个v:,你可以立即获得所有预测的评级u_i*v.

对于新用户,你必须猜测什么是他的潜表示u_newfull_u_new.基本上,您需要50个系数来表示您对每个潜在产品因素的新用户亲和力.为了简单起见,因为它对我的隐式反馈用例来说足够了,我只是使用了点积,基本上将新用户投射到产品潜在因素上:full_u_new*V^t给你50系数,系数是你的新用户看起来像产品潜伏多少因素i.并且它与隐式反馈特别有效.所以,使用点积将会给你,但它不会被缩放,它会解释你所看到的高分.要获得可用的分数,你需要更精确地缩放u_new,我想你可以使用余弦相似性得到它,就像它们[在这里]https://github.com/apache/incubator-predictionio/blob/release/0.10.0/examples/scala-parallel-recommendation/custom-query/src/main/scala/ALSAlgorithm.scala

@ ScottEdwards2000在评论中提到的方法也很有趣,但却有所不同.您确实可以在训练集中寻找最相似的用户.如果有多个,你可以获得平均值.我不认为它会做得太糟糕,但它是一个非常不同的方法,你需要完整的评级矩阵(找到最相似的用户).获得一个亲密的用户肯定应该解决扩展问题.如果你设法使两种方法都有效,你可以比较结果!

推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有