package com.lj.als import org.apache.spark.mllib.recommendation.{ALS, Rating} import org.apache.spark.{SparkConf, SparkContext} object Driver { def main(args: Array[String]): Unit = { val conf = new SparkConf().setMaster("local").setAppName("als") val sc = new SparkContext(conf) val data = sc.textFile("e://data/als.txt") //--为了满足Spark建模要求: //--RDD[String]->RDD[Rating(userId[Int],itemId[Int],score[Double])] val r1 = data.map { line => val info = line.split(" ") val userId = info(0).toInt val itemId = info(1).toInt val score = info(2).toDouble Rating(userId, itemId, score) } // r1.foreach(println) //--①参:数据集 ②参:隐藏因子数 K,根据实际情况来定 ③参:最大的迭代次数 ④参:λ 正则化参数,防止模型过拟合 val model = ALS.train(r1, 3, 10, 0.01) val u5Result = model.recommendProducts(5, 2) //--下面表示为5号用户,推荐两个商品 val item12Result = model.recommendUsers(12, 1) //--下面表示为12号商品,推荐1个用户 val u3Predict = model.predict(3, 14) //--下面表示预测3号用户对14号商品的评分 u5Result.foreach {println} item12Result.foreach {println} println(u3Predict) } }
时间: 2024-03-18 10:44:56 浏览: 138
这是一个使用 Apache Spark 中的 ALS(Alternating Least Squares)算法进行推荐的例子,包含以下步骤:
1. 导入需要使用的包,其中包括 ALS 算法和 Rating 类。
2. 创建 SparkConf 和 SparkContext 对象。
3. 使用 SparkContext 的 textFile 方法读取数据集文件,该文件中每行包含一个用户 ID、一个物品 ID 和一个评分,用空格分隔。
4. 将数据集 RDD[String] 转换为 RDD[Rating],其中每个 Rating 对象包含一个用户 ID、一个物品 ID 和一个评分。
5. 调用 ALS.train 方法,传入 RDD[Rating]、隐藏因子数 K、最大的迭代次数和正则化参数 λ,训练 ALS 模型。
6. 调用 ALS 模型的 recommendProducts 方法,传入一个用户 ID 和要推荐的物品数,得到该用户可能喜欢的物品列表。
7. 调用 ALS 模型的 recommendUsers 方法,传入一个物品 ID 和要推荐的用户数,得到可能喜欢该物品的用户列表。
8. 调用 ALS 模型的 predict 方法,传入一个用户 ID 和一个物品 ID,得到该用户对该物品的评分预测值。
9. 输出结果。
希望对你有所帮助!
相关问题
用ALS算法代码对my.csv中的数据进行推荐,并计算RMSE
首先,我们需要读取 `my.csv` 文件并将数据转换为用户-物品评分矩阵 `R`,其中 `R[i, j]` 表示用户 `i` 对物品 `j` 的评分。假设文件中包含 `n_users` 个用户和 `n_items` 个物品,则可以使用以下代码:
```python
import numpy as np
# Load data from CSV file.
data = np.loadtxt('my.csv', delimiter=',')
user_ids = data[:, 0].astype(int) - 1
item_ids = data[:, 1].astype(int) - 1
ratings = data[:, 2]
# Create user-item rating matrix.
n_users = np.max(user_ids) + 1
n_items = np.max(item_ids) + 1
R = np.zeros((n_users, n_items))
for i in range(len(user_ids)):
R[user_ids[i], item_ids[i]] = ratings[i]
```
接下来,我们可以使用上面的 `als` 函数来训练模型并计算RMSE:
```python
# Split data into training and test sets.
np.random.seed(123)
mask = np.random.rand(len(ratings)) < 0.8
R_train = np.zeros((n_users, n_items))
R_test = np.zeros((n_users, n_items))
R_train[user_ids[mask], item_ids[mask]] = ratings[mask]
R_test[user_ids[~mask], item_ids[~mask]] = ratings[~mask]
# Train model using ALS algorithm.
K = 10
max_iter = 10
lambda_ = 0.1
U, V = als(R_train, K, max_iter, lambda_)
# Predict ratings for test set.
R_pred = np.dot(U, V.T)
R_pred[R_train > 0] = 0
# Compute RMSE.
mse = np.sum((R_pred - R_test) ** 2) / np.sum(R_test > 0)
rmse = np.sqrt(mse)
print('RMSE:', rmse)
```
上面的代码将数据集分成了训练集和测试集,使用训练集训练了模型,然后使用测试集计算了 RMSE。你可以根据需要调整参数 `K`、`max_iter` 和 `lambda_`,以获得更好的结果。
安装 sklearn.externals
als是scikit-learn旧版本中的一个模块,用于支持一些旧版本的功能。在新版本的scikit-learn中,这个模块已经被移除了。如果你需要使用旧版本的功能,可以考虑安装旧版本的scikit-learn。
安装旧版本的scikit-learn可以使用pip命令,例如安装0.19.1版本的scikit-learn可以使用以下命令:
```
pip install scikit-learn==0.19.1
```
阅读全文