矩阵分解中SVD与ALS区别

背景

为什么需要矩阵分解

矩阵分解在多个领域中都扮演着至关重要的角色,其必要性主要体现在以下几个方面:

  • 降维与特征提取

矩阵分解可以将原始数据矩阵分解为两个或多个低秩矩阵的乘积,从而实现对数据的降维。降维后的数据不仅减少了计算量和存储空间,而且往往能够保留原始数据的主要特征,这对于后续的数据分析、机器学习等任务非常有帮助。

  • 噪声去除

在数据采集过程中,由于误差、干扰等因素,数据中必然会包含噪声。矩阵分解可以通过将数据矩阵分解为信号和噪声的叠加,进而实现对噪声的去除或抑制,提高数据的信噪比,从而改善数据的质量。

  • 推荐系统

在推荐系统中,用户-物品交互(评分)矩阵通常是稀疏的,即大多数用户与大多数物品之间都没有直接的交互记录。矩阵分解可以填充这个稀疏矩阵中的缺失值,预测用户对未知物品的评分或偏好,从而为用户提供个性化的推荐。

  • 文本挖掘与主题建模

在文本挖掘和主题建模中,矩阵分解可以用于发现文本集合中的潜在主题或概念。通过将文档-词汇矩阵分解为文档-主题矩阵和主题-词汇矩阵,可以揭示文档与主题之间的关系以及主题与词汇之间的关系,进而实现文档的聚类、分类、摘要等任务

  • 图数据分析

在图数据分析中,矩阵分解可以用于发现图中的社区结构、节点聚类等。通过将图的邻接矩阵或拉普拉斯矩阵进行分解,可以得到节点之间的低维嵌入表示,这些表示能够反映节点在图中的位置、角色和关系,从而有助于后续的图数据挖掘和分析。

  • 信号处理

在信号处理领域,矩阵分解可以用于信号的滤波、去噪、压缩等。通过将信号矩阵分解为信号子空间和噪声子空间的叠加,可以实现信号的分离和重建,提高信号的信噪比和可理解性。

  • 机器学习

在机器学习中,矩阵分解可以用于初始化模型的参数、优化模型的性能等。例如,在深度学习中,可以通过矩阵分解来初始化网络的权重矩阵,加快网络的训练速度;在协同过滤等推荐算法中,可以通过矩阵分解来优化用户和物品的隐式特征表示,提高推荐的准确性和多样性。

ALS 与SVD

Alternating Least Squares (ALS)和Singular Value Decomposition
(SVD)都是用于推荐系统中的矩阵分解技术,但在实际应用中,它们各自有其特点和适用场景,并不意味着使用了ALS就不再需要SVD。

ALS 和 SVD 的区别

目的

  • ALS:主要用于协同过滤推荐系统,特别是当面对大规模稀疏矩阵时。
  • SVD:同样用于矩阵分解,但更广泛应用于降维、数据压缩等领域,也可用于推荐系统。

实现方式

  • ALS:通过交替最小化目标函数来求解矩阵分解问题,适用于处理大型稀疏矩阵。
  • SVD:通过求解矩阵的奇异值分解来找到最佳的低秩近似,适用于较小的矩阵或密集矩阵。

计算效率:

  • ALS:更适合大规模数据集,可以利用并行计算加速。
  • SVD:对于较小的数据集可能更快,但对于非常大的稀疏矩阵,计算成本较高。

应用场景

  • ALS:特别适合于处理用户-物品评分矩阵,可以有效地处理缺失值。
  • SVD:除了推荐系统外,还在图像压缩、文本分析等领域有广泛应用。

ALS 和 SVD联合使用

  • 首先使用奇异值分解(SVD)进行初步的特征提取,
  • 然后使用交替最小二乘法(ALS)进行进一步的模型调优
import numpy as np  
from scipy.sparse.linalg import svds  
from implicit.als import AlternatingLeastSquares  
from implicit.nearest_neighbours import bm25_weight  
from sklearn.model_selection import train_test_split  
from scipy.sparse import csr_matrix  
  
# 假设我们有一个用户-物品交互矩阵  
ratings = np.array([  
    [5, 3, 0, 1],  
    [4, 0, 0, 1],  
    [1, 1, 0, 5],  
    [1, 0, 0, 4],  
    [0, 1, 5, 4],  
], dtype=np.float32)  
  
# 转换为稀疏矩阵  
ratings_sparse = csr_matrix(ratings)  
  
# 使用SVD进行初步分解  
U, sigma, Vt = svds(ratings_sparse, k=2)  # 假设我们提取2个特征  
sigma = np.diag(sigma)  
V = Vt.T  
  
# 将SVD的结果转换为ALS可接受的格式  
# 注意:ALS 需要非负的用户和物品因子  
# 这里我们简单使用SVD的结果,但可能需要进一步处理以满足非负要求  
user_factors = np.abs(U)  # 取绝对值以保证非负  
item_factors = np.abs(V)  
  
# 创建一个空的ALS模型,用SVD的结果初始化  
als = AlternatingLeastSquares(factors=2, iterations=10, regularization=0.1, use_cg=True)  
  
# 这里不直接支持初始化,但我们可以使用类似warm_start的技巧,即先拟合一小部分数据  
# 这里为了简化,我们直接使用全部数据,但在实际应用中可能需要分批处理  
als.fit(ratings_sparse.T.tocsr())  # 注意转置,因为implicit的API是基于物品的  
  
# 注意:上述fit并没有真正使用SVD的初始化,因为我们直接fit了全部数据  
# 在实际应用中,你可能需要更复杂的逻辑来合并SVD和ALS,比如先SVD分解,然后用部分数据训练ALS,并评估性能  
  
# 使用训练好的模型进行预测  
user_ids = np.array([0, 1, 2])  
item_ids = np.array([0, 1, 2, 3])  
predictions = als.recommend(user_ids, item_ids, N=1, filter_already_liked_items=False)  
  
for uid, recs in zip(user_ids, predictions):  
    print(f"User {uid}: {recs}")  
  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值