python - 如何将购买 DataFrame 转换为 Spark DistributedMatrix 类型以计算项目之间的相似性?
问题描述
我想将 a 转换Spark DataFrame
为 a CoordinateMatrix
,然后再RowMatrix
计算列之间的余弦相似度。
Dataframe 是用户的购买: 数据样本:
arr = np.array([
['b5ad805c-f295-4852-82fc-961a88',12732936],
['0FD6955D-484C-4FC8-8C3F-DA7D28','Gklb38'],
['0E3D17EA-BEEF-4931-8104',12909841],
['CC2877D0-A15C-4C0A-AD65-762A35C1','12645715'],
['CC2877D0-A15C-4C0A-AD65-762A35C1',12909837],
['6AC9C45D-A891-4BEA-92B1-04224E9C65ED', '12894376'],
['CFF7BAB7-C5E1-490D-B257-AE58CA071362', 'Gklb38' ]])
df_purchases = pd.DataFrame(arr, columns = ['user_id','basket'])
其中user_id是在字段篮中购买产品 ID(项目)的用户 ID
最初,我使用 Pandas DataFrame 和crosstab
:
df_cross = pd.crosstab(df_purchases.user_id, df_purchases.basket).astype('bool').astype('int')
将每个用户购买的行和 product_id(s) 作为列,如果用户购买了 ID1,则1 = 已购买,否则 = 0:
|----------|-------------|---------|----------|
| user_id | item_id1 | item_id2| item_id3 |
---------------------------------------------
| user_1 | 0 | 1 | 0 |
-----------------------------------------------
| user_2 | 1 | 0 | 0 |
-----------------------------------------------
| user_3 | 0 | 1 | 1 |
-----------------------------------------------
在获得该格式的数据后,我计算相似度。但由于我有一个包含 50000 多个项目和 20000 个用户的大型数据集,我需要将使用交叉表的原始方法替换为使用 Spark DistributedMatrix(CoordinateMatrix或RowMatrix)来利用分布式计算。
# Create a Spark DataFrame from Pandas
spark_df = spark.createDataFrame(df_cross)
我对如何做到这一点感到困惑,因为我是使用 spark 的新手,即使我从这个问题的答案中找到了一些见解,但我无法弄清楚如何构建CoordinateMatrix
和索引这些字段,因为它们的类型是 String,而CoordinateMatrix与int Type一起使用。
所以我的问题是:
- 如何构建
CoordinateMatrix
? - 如何索引字段并在相似度计算后映射回它们的真实 ID?(例如,如果产品 ID 是
GK38LB
并且假设其映射索引为 1。在相似性矩阵中,我会将其表示为1
。如何将该值映射到原始值?)。这个问题与我的类似,但在 Scala 中。
解决方案
推荐阅读
- c# - 在 Newtonsoft 中使用 JsonProperty 自动修复命名规则违规
- powerbi - 计算同一行中的数字之间的差异 - 不同的列
- c# - 如果行/行不是以 c# 中已建立的字符开头,则跳过或删除 CSV 文件中的行/行
- devstack - 使用终端创建图像时,Devstack 中的 auth 插件密码缺少值 auth-url
- html - 为查看、编辑和删除按钮创建关系,并在 laravel 应用程序中显示相应货件的特定视图/页面
- python - 张量流 2+。使用替代激活函数和 custom_gradient
- http - 具有多个套接字连接的 HTTP2 和 TLS
- powershell - Powershell 执行 Test-NetConnection 异常处理?
- pdf - Aspose.Word 转换为 PDF 时断字错误
- emacs - 使用 .dir-locals.el 为特定文件设置模式