数据挖掘之_SVD的python实现和分析pin

本文介绍了如何在Python中实现奇异值分解(SVD),并结合‘机器学习实战’一书中的例子进行详细阐述,包括前言、SVD的简介、具体实现步骤以及案例讨论,旨在分享SVD在数据挖掘中的应用和理解。
摘要由CSDN通过智能技术生成

前言

今日实现第一个推荐算法,在”机器学习实战“一书中找到了SVD方法一章练习。这里总结下笔记经验,与大家分享 。

简介

对于一个简单的推荐系统,例如电影推荐,我们知道N个用户对M个电影的评分。这时候对于一个新的用户,我们应该如何给他推荐新的电影呢?一个最简单的方法,根据用户已看的电影,找出与他相似的用户,然后推荐其他未看的高得分的电影。SVD提供了一个更加准确的解决方案。其基本思想是,降维!
     对于电影,一般的推荐算法是将每个电影的评分作为一个维度,对于Xi用户,就有一个矩阵行  Xi = [xi1,xi2,xi3....xij]。 但是电影如此之多,每个人又不可能看过所有的电影,这将造成矩阵非常巨大,然后非常稀疏。SVD的具体思想是提取电影的参数Q1, ..., Qj。这个参数可以表达为电影的动作,搞笑,恐怖等程度的描述。因此后面的推荐算法中,我们不需要对每个电影的口味进行分析,当给定新用户的时候直接推荐适合他口味,即基于电影参数Qj的一个评分相符,的电影即可。

实现

实现SVD,只需要python中的numpy,其中有一个线性代数工具箱linalg。
import numpy as np
data  = [[1,2,3],[2,2,3],[3,3,3]]
U,S,V = np.linalg.svd(data)


>>> U
array([[-0.48273945,  0.76567677,  0.42509024],
       [-0.54696309,  0.11548497, -0.82915294],
       [-0.68395468, -0.63277351,  0.36304778]])
>>> S
array([ 7.51653849,  1.17761678,  0.33892171])
>>> V
array([[-0.48273945, -0.54696309, -0.68395468],
       [-0.76567677, -0.11548497,  0.63277351],
       [-0.42509024,  0.82915294, -0.36304778]])
其中S向量只存储了对角元素的成分,可以大大节省存储空间。接下来我们就需要保留部分奇异值,对于保留的数量,一个典型的方法就是保留矩阵中90%的能量信息。能量信息为奇异值的平和总和。

看到这里是否想起了PCA分析,同样的分解矩阵,同样的计算能量信息。下面讨论章节我会进行一些个人总结。

那么算法实现了,具体应用到推荐中该如何做呢?对于用户没有看过的电影,我们只需要计算与用户看过的电影中的高评分电影的相似度,然后推荐相似度高的电影即可。你或许听过协同过滤(collaborative filtering),没听过没关系,我们要做得就是协同过滤。也就是基于用户与其他用户的数据进行对比来实现精确推荐。另外还有可以基于内容的推荐,不在本文考虑范围。

计算相似度的集中方法,有:
欧式距离,数据差的的平方和
相关系数,一般为皮尔逊相关系数(Pearson correlation)
</
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值