ALS模型 - 如何生成full_u * V ^ T * V?ALS模型 - 如何生成full_u

2019-05-12 03:37发布

我想弄清楚这之间被批处理更新的ALS模型如何预测新的用户价值。 在我的搜索,我碰到这个计算器的答案 。 我已经复制下面方便读者的答案:

您可以使用训练模型(不更新的话)获取新用户的预测:

要获得用户的预测模型中,你使用它的潜表示(F尺寸的向量u(许多因素)),这是由产品的潜在因子矩阵(基质制成的所有产品的潜在交涉,一堆乘以尺寸F的载体)和为您提供每个产品的得分。 对于新用户来说,问题是,你没有访问他们的潜在表现(你只有大小M的全表示(许多不同的产品),但你可以做的是使用相似函数来计算类似的潜表示用于通过由产品矩阵的转置相乘,该新用户。

也就是说,如果你的用户潜在的矩阵是U和你的产品的潜在矩阵为V,用户在我的模型,你做得到的分数:u_i * V为新用户,你没有一个潜在的代表性,所以要充分表示full_u做:full_u * v ^ T * v这将接近潜在因素,对新用户,应该给予合理的建议(如果模型已经给出了现有用户的合理建议)

要回答的培训问题,这可以让你计算为新用户的预测,而无需做模型,你现在可以在一段时间做一次的重计算。 所以,你有你的批处理在夜间仍然可以在白天为新用户的预测。

注:MLLIB,您可以访问矩阵u和v

以上引用的文字是一个很好的答案,但是,我努力理解如何通过编程实现此解决方案。 例如,矩阵U和V可以与获得:

# pyspark example

# ommitted for brevity ... loading movielens 1M ratings

model = ALS.train(ratings, rank, numIterations, lambdaParam)

matrix_u = model.userFeatures()

print(matrix_u.take(2)) # take a look at the dataset

这将返回:

[
  (2, array('d', [0.26341307163238525, 0.1650490164756775, 0.118405282497406, -0.5976635217666626, -0.3913084864616394, -0.1379186064004898, -0.3866392970085144, -0.1768060326576233, -0.38342711329460144, 0.48550787568092346, -0.18867433071136475, -0.02757863700389862, 0.1410026103258133, 0.11498363316059113, 0.03958914801478386, 0.034536730498075485, 0.08427099883556366, 0.46969038248062134, -0.8230801224708557, -0.15124185383319855, 0.2566414773464203, 0.04326820373535156, 0.19077207148075104, 0.025207923725247383, -0.02030213735997677, 0.1696728765964508, 0.5714617967605591, -0.03885050490498543, -0.09797532111406326, 0.29186877608299255, -0.12768596410751343, -0.1582849770784378, 0.01933656632900238, -0.09131495654582977, 0.26577943563461304, -0.4543033838272095, -0.11789630353450775, 0.05775507912039757, 0.2891307771205902, -0.2147761881351471, -0.011787488125264645, 0.49508437514305115, 0.5610293745994568, 0.228189617395401, 0.624510645866394, -0.009683617390692234, -0.050237834453582764, -0.07940001785755157, 0.4686132073402405, -0.02288617007434368])), 
  (4, array('d', [-0.001666820957325399, -0.12487432360649109, 0.1252429485321045, -0.794727087020874, -0.3804478347301483, -0.04577340930700302, -0.42346617579460144, -0.27448347210884094, -0.25846347212791443, 0.5107921957969666, 0.04229479655623436, -0.10212298482656479, -0.13407345116138458, -0.2059325873851776, 0.12777331471443176, -0.318756639957428, 0.129398375749588, 0.4351944327354431, -0.9031049013137817, -0.29211774468421936, -0.02933369390666485, 0.023618215695023537, 0.10542935132980347, -0.22032295167446136, -0.1861676126718521, 0.13154461979866028, 0.6130356192588806, -0.10089754313230515, 0.13624103367328644, 0.22037173807621002, -0.2966669499874115, -0.34058427810668945, 0.37738317251205444, -0.3755438029766083, -0.2408779263496399, -0.35355791449546814, 0.05752146989107132, -0.15478627383708954, 0.3418906629085541, -0.6939512491226196, 0.4279302656650543, 0.4875738322734833, 0.5659542083740234, 0.1479463279247284, 0.5280753970146179, -0.24357643723487854, 0.14329688251018524, -0.2137598991394043, 0.011986476369202137, -0.015219110995531082]))
]

我也可以做类似的让V矩阵:

matrix_v = model.productFeatures()

print(matrix_v.take(2)) # take a look at the dataset

这导致:

[
  (2, array('d', [0.019985994324088097, 0.0673416256904602, -0.05697149783372879, -0.5434763431549072, -0.40705952048301697, -0.18632276356220245, -0.30776089429855347, -0.13178342580795288, -0.27466219663619995, 0.4183739423751831, -0.24422742426395416, -0.24130797386169434, 0.24116989970207214, 0.06833088397979736, -0.01750543899834156, 0.03404173627495766, 0.04333991929888725, 0.3577033281326294, -0.7044714689254761, 0.1438472419977188, 0.06652364134788513, -0.029888223856687546, -0.16717877984046936, 0.1027146726846695, -0.12836599349975586, 0.10197233408689499, 0.5053384900093079, 0.019304445013403893, -0.21254844963550568, 0.2705852687358856, -0.04169371724128723, -0.24098040163516998, -0.0683765709400177, -0.09532768279314041, 0.1006036177277565, -0.08682398498058319, -0.13584329187870026, -0.001340558985248208, 0.20587041974067688, -0.14007550477981567, -0.1831497997045517, 0.5021498203277588, 0.3049483597278595, 0.11236990243196487, 0.15783801674842834, -0.044139936566352844, -0.14372406899929047, 0.058535050600767136, 0.3777201473712921, -0.045475270599126816])), 
  (4, array('d', [0.10334215313196182, 0.1881643384695053, 0.09297363460063934, -0.457258403301239, -0.5272660255432129, -0.0989445373415947, -0.2053477019071579, -0.1644461452960968, -0.3771175146102905, 0.21405018866062164, -0.18553146719932556, 0.011830524541437626, 0.29562288522720337, 0.07959598302841187, -0.035378433763980865, -0.11786794662475586, -0.11603366583585739, 0.3776192367076874, -0.5124108791351318, 0.03971947357058525, -0.03365595266222954, 0.023278912529349327, 0.17436474561691284, -0.06317273527383804, 0.05118614062666893, 0.4375131130218506, 0.3281322419643402, 0.036590900272130966, -0.3759073317050934, 0.22429685294628143, -0.0728025734424591, -0.10945595055818558, 0.0728464275598526, 0.014129920862615108, -0.10701996833086014, -0.2496117204427719, -0.09409723430871964, -0.11898282915353775, 0.18940524756908417, -0.3211393356323242, -0.035668935626745224, 0.41765937209129333, 0.2636736035346985, -0.01290816068649292, 0.2824321389198303, 0.021533429622650146, -0.08053319901227951, 0.11117415875196457, 0.22975310683250427, 0.06993964314460754]))
]

但是,我不知道如何从这一进展到full_u * v^t * v

Answer 1:

这个新的用户不是矩阵U,所以你不必在“K”因素的潜在表现,你只知道它的全部表现,即其所有的评级。 full_u这里指所有在密集的格式 (不是稀疏格式的新的用户评级的ratings是),例如:

[0 2 0 0 0 1 0]如果用户U具有额定项目2与2,并用1个项目6。

那么你可以得到v很像你没有和它转向矩阵在numpy的,例如:

pf = model.productFeatures()
Vt = np.matrix(np.asarray(pf.values().collect()))

然后是只是一个相乘的事情: full_u*Vt*Vt.T

VtV相比,对方的回答是换位但是这只是一个约定的事情。

需要注意的是Vt*Vt.T产品是固定的,所以如果你打算用这个多新用户,将在计算更高效的预先计算它。 其实对一个以上的用户倒不如把他们在辟谷所有评级(在相同的格式作为我的一个新的用户为例),只是做矩阵乘积: bigU*Vt*Vt.T得到所有人的所有收视率新用户。 可能仍然是值得一试的产品以最有效的方式操作的数量方面进行。



Answer 2:

警告只是一个字。 人们谈论的用户和产品矩阵像他们左,右奇异向量。 但据我了解,所用的方法找到U和V是直误差平方成本函数,这使得没有SVD的正交性担保的优化。

换句话说,认为代数什么上面的回答索赔。 我们有一个完整的评级矩阵R,由n个用户在p系列产品评级的P矩阵的n。 我们有k个潜在因子分解,来近似R = UV,其中U的行,用k矩阵的n,是潜用户的表示,和V的列,AK用p矩阵,是潜产物表示。 为了寻找全新的用户组成的矩阵R潜在用户表示,而没有重新安装模式,我们需要:

       R = U V  
R V^{-1} = U V V^{-1}  
R V^{-1} = U I_{k}  
R V^{-1} = U  

其中I_ {K}是第k维单位矩阵和V ^ { - 1}是通过V. k个权逆所述p上述尖端假定V ^ {T】= V ^ { - 1}。 这不能保证。 而在一般情况是没有保证,假设这是真的会给你什么,但废话答案。

让我知道如果我错过了在背后MLLib的CF实现优化方法的东西。 有没有在确保我失踪正交性ALS模型一招?



文章来源: ALS model - how to generate full_u * v^t * v?