参考:http://www.cnblogs.com/pinard/p/6364932.html
参考:http://blog.csdn.net/u013719780/article/details/51775047
1、导入数据
rawData = sc.textFile("/Users/youwei.tan/ml-100k/u.data")
2、拆成字段
rawRatings = rawData.map(lambda x: x.split('\t'))
3、导包及提取用户、物品、评分特征
Rating类比较简单,仅仅只是为了封装用户,物品与评分这3个值。导入Rating、ALS模块,用于后面建模
from pyspark.mllib.recommendation import Rating, ALS
ratings = rawRatings.map(lambda x: Rating(int(x[0]),int(x[1]),float(x[2])))
4、推荐系统模型
现在可以开始训练模型了,所需的其他参数有以下几个。
rank:对应ALS模型中的因子个数,也就是在低阶近似矩阵中的隐含特征个数。因子个数一般越多越好。但它也会直接影响模型训练和保存时所需的内存开销,尤其是在用户和物品很多的时候。因此实践中该参数常作为训练效果与系统开销之间的调节参数。通常,其合理取值为10到200。
iterations:对应运行时的迭代次数。ALS能确保每次迭代都能降低评级矩阵的重建误差,但一般经少数次迭代后ALS模型便已能收敛为一个比较合理的好模型。这样,大部分情况下都没必要迭代太多次(10次左右一般就挺好)。
这里我们再对ALS训练模型时的重要参数做一个总结。
ratings : 评分矩阵对应的RDD。需要我们输入。如果是隐式反馈,则是评分矩阵对应的隐式反馈矩阵。
rank : 矩阵分解时对应的低维的维数。这个值会影响矩阵分解的性能,越大则算法运行的时间和占用的内存可能会越多。通常需要进行调参,一般可以取10-200之间的数。
iterations :在矩阵分解用交替最小二乘法求解时,进行迭代的最大次数。这个值取决于评分矩阵的维度,以及评分矩阵的系数程度。一般来说,不需要太大,比如5-20次即可。默认值是5。
lambda: 在 python接口中使用的是lambda_,原因是lambda是Python的保留字。这个值即为FunkSVD分解时对应的正则化系数。主要用于控制模型的拟合程度,增强模型泛化能力。取值越大,则正则化惩罚越强。大型推荐系统一般需要调参得到合适的值。
alpha : 这个参数仅仅在使用隐式反馈trainImplicit时有用。指定了隐式反馈信心阈值,这个值越大则越认为用户和他没有评分的物品之间没有关联。一般需要调参得到合适值。
作为示例,这里将使用的rank、iterations和lambda参数的值分别为50、10和0.01:
model = ALS.train(ratings, 50, 10, 0.01)