Python使用矩阵分解法找到类似的音乐

简介: Python使用矩阵分解法找到类似的音乐

这篇文章是如何使用几种不同的矩阵分解算法计算相关艺术家。代码用Python编写,以交互方式可视化结果。

 

加载数据

这可以使用Pandas加载到稀疏矩阵中:


# 读取数据

usecols=[0, 2, 3],


names=['user', 'artist', 'plays'])

data['user'] = data['user'].astype("category")
data['artist'] = data['artist'].astype("category")
# 建立稀疏矩阵
triplesplays = coo_matrix((data['plays'].astype(float),


(data['artist'].cat.codes,


data['user'].cat.codes)))
 
 

这里返回的矩阵有300,000名艺术家和360,000名用户,总共有大约1700万条目。每个条目都是用户播放艺术家的次数,其中的数据是从2008年的Last.fm API收集的。

 

矩阵分解

 

通常用于此问题的一种技术是将用户 - 艺术家 - 戏剧的矩阵投影到低等级近似中,然后计算该空间中的距离。

我们的想法是采用原始的播放计数矩阵,然后将其减少到两个小得多的矩阵,这些矩阵在乘以时接近原始矩阵:

Artist/User/Play CountsArtist FactorsUser Factors=×

代替将每个艺术家表示为所有360,000个可能用户的游戏计数的稀疏向量,在对矩阵进行因式分解之后,每个艺术家将由50维密集向量表示。

通过减少这样的数据的维数,我们实际上将输入矩阵压缩为两个小得多的矩阵。

 

潜在语义分析

 

出于本文的目的,我们只需要知道SVD生成输入矩阵的低秩近似。

像这样使用SVD称为潜在语义分析(LSA)。所有真正涉及的是在这个分解空间中通过余弦距离获得最相关的艺术家:

class TopRelated(object): def __init__(self, artist_factors): 
# 标准化
norms = numpy.linalg.norm(artist_factors, axis=-1) 
self.factors = artist_factors / norms[:, numpy.newaxis] 
def get_related(self, artistid, N=10): 
scores = self.factors.dot(self.factors[artistid]) 
best = numpy.argpartition(scores, -N)[-N:] 
return sorted(zip(best, scores[best]), key=lambda x: -x[1])

潜在语义分析之所以得名,是因为在对矩阵进行分解之后,可以输入数据中潜在的隐藏结构 - 这可以被认为是揭示输入数据的语义。

LSA

类似于LSA的'Arcade Fire':

 

虽然LSA成功地概括了我们数据的某些方面,但这里的结果并不是那么好。

 

 

隐含的交替最小二乘法

已发现这些模型在推荐项目时效果很好,并且可以很容易地重复用于计算相关艺术家。

推荐系统中使用的许多MF模型都采用了明确的数据,用户使用类似5星级评定标准评估了他们喜欢和不喜欢的内容。

第一个挑战是有效地进行这种因式分解:通过将未知数视为负数,天真的实现将查看输入矩阵中的每个条目。由于此处的维度大约为360K乘300K - 总共有超过1000亿条目要考虑,而只有1700万非零条目。

第二个问题是我们不能确定没有听艺术家的用户实际上意味着他们不喜欢它。可能还有其他原因导致艺术家没有被收听,特别是考虑到我们在数据集中每个用户只有最多50位艺术家。

使用二元偏好的不同置信水平来学习分解矩阵表示:看不见的项目被视为负面且置信度低,其中当前项目被视为正面更高的信心。

那么目标是通过最小化平方误差损失函数的置信加权和来学习用户因子X u和艺术家因子Y i:


def alternating_least_squares(Cui, factors, regularization, iterations=20): 
users, items = Cui.shape
X = np.random.rand(users, factors) * 0.01    
Y = np.random.rand(items, factors) * 0.01    
Ciu = Cui.T.tocsr()    
for iteration in range(iterations):        
least_squares(Cui, X, Y, regularization)       
least_squares(Ciu, Y, X, regularization)    
return X, Y
def least_squares(Cui, X, Y, regularization):    
users, factors = X.shape


YtY = Y.T.dot(Y)    
for u in range(users):        
# 
YtCuY + regularization * I in A        
A = YtY + regularization * np.eye(factors)       
 #     
 b = np.zeros(factors)        
 for i, confidence in nonzeros(Cui, u):            
 factor = Y[i]            
 A += (confidence - 1) * np.outer(factor, factor)            
 b += confidence * factor



# Xu = (YtCuY + regularization * I)^-1 (YtCuPu)        
X[u] = np.linalg.solve(A, b)

为了调用它,我使用与LSA中使用的置信矩阵相同的权重,然后以相同的方式计算相关的艺术家:

artist_factors ,user_factors = alternating_least_squares (bm25_weight (plays ),50 )

与仅使用LSA相比,该方法可以产生明显更好的结果。

相关文章
|
14天前
|
机器学习/深度学习 TensorFlow 算法框架/工具
PYTHON TENSORFLOW 2二维卷积神经网络CNN对图像物体识别混淆矩阵评估|数据分享
PYTHON TENSORFLOW 2二维卷积神经网络CNN对图像物体识别混淆矩阵评估|数据分享
|
1月前
|
人工智能 机器人 测试技术
【python】python求解矩阵的转置(详细讲解)
【python】python求解矩阵的转置(详细讲解)
|
3天前
|
前端开发 Python
python制作七夕音乐贺卡
本篇博文是一个关于制作音乐贺卡的教程。自己在去年的在七夕节期间创作了一个代码项目,允许用户自定义背景、音乐和祝福语,生成一个包含音乐的HTML贺卡。教程分为三个部分:前言、制作流程和具体代码。前言提到,由于找不到现成的音乐贺卡模板,我决定自己动手,制作的贺卡适用于各种节日。制作流程包括两个步骤,一是通过提供的Python代码工具选择背景图片、音乐文件和输入祝福语,生成HTML贺卡;二是提供了一个预打包的exe文件,用户可以直接运行并按照提示操作。最后,文章分享了生成贺卡的具体Python代码,并以一句鼓励的话语结尾,强调了努力和选择的重要性。
24 4
|
6天前
|
机器学习/深度学习 Python
【Python 机器学习专栏】混淆矩阵与 ROC 曲线分析
【4月更文挑战第30天】本文介绍了机器学习中评估模型性能的两种工具——混淆矩阵和ROC曲线。混淆矩阵显示了模型在不同类别上的预测情况,包括真正例、假正例、真反例和假反例,帮助评估模型错误类型和数量。ROC曲线则通过假正率和真正率展示了模型的二分类性能,曲线越接近左上角,性能越好。文章还提供了Python中计算混淆矩阵和ROC曲线的代码示例,强调它们在模型选择、参数调整和理解模型行为中的应用价值。
|
10天前
|
人工智能 Python
beets,一个有趣的 Python 音乐信息管理工具!
beets,一个有趣的 Python 音乐信息管理工具!
27 4
|
18天前
|
存储 搜索推荐 算法
python推荐系统实现(矩阵分解来协同过滤)
python推荐系统实现(矩阵分解来协同过滤)
|
20天前
|
机器学习/深度学习 搜索推荐 算法
python机器学习:推荐系统实现(以矩阵分解来协同过滤)
python机器学习:推荐系统实现(以矩阵分解来协同过滤)
|
25天前
|
JavaScript 搜索推荐 前端开发
音乐发现平台:借助Python和Vue构建个性化音乐推荐系统
【4月更文挑战第11天】本文介绍了如何使用Python和Vue.js构建个性化音乐推荐系统。首先确保安装Python、Node.js、数据库系统和Git。后端可选择Flask或Django搭建RESTful API,处理歌曲数据。前端利用Vue.js创建用户界面,结合Vue CLI、Vuex和Vue Router实现功能丰富的SPA。通过Vuex管理状态,Axios与后端通信。这种前后端分离的架构利于协作和系统扩展,助力打造定制化音乐体验。
|
29天前
|
数据采集 XML 存储
【Python】Python音乐网站数据+音频文件数据抓取(代码+报告)【独一无二】
【Python】Python音乐网站数据+音频文件数据抓取(代码+报告)【独一无二】
|
1月前
|
数据采集 XML 存储
【Python】Python音乐网站数据+音频文件数据抓取(代码+报告)【独一无二】
【Python】Python音乐网站数据+音频文件数据抓取(代码+报告)【独一无二】