Andrew Ng机器学习课程笔记--week9(下)(推荐系统&协同过滤)
本周内容较多,故分为上下两篇文章。 本文为下篇。
一、内容概要
1. Anomaly Detection
-
Density Estimation
- Problem Motivation
- Gaussian Distribution
- Algorithm
-
Building an Anomaly Detection System(创建异常检测系统)
- Developing and Evaluating an Anomaly Detection System
- Anomaly Detection vs. Supervised Learning
- Choosing What Features to Use
-
Multivariate Gaussion Distribution(多元高斯分布)
- Multivariate Gaussion Distribution
- Anomaly Detection using the Multivariate Gaussion Distribution 2. Recommender System
-
Predicting Movie
- Problem Formulation
- Content Based Recommendations
-
Collaborative Filtering(协同过滤)
- Collaborative Filtering
- Collaborative Filtering Algorithm
-
Low Rank Matrix Factorization(低秩矩阵分解)
- Vectorization(向量化): Low Rank Matrix Factorization
- Implementational Detail:Mean Normalization
- 二、重点&难点
Recommender System(推荐系统)
1.Predicting Movie
1)Problem Formulation
下面将以推荐电影为例来介绍推荐系统的实现。
movie |
Alice |
Bob |
Carol |
Dave |
---|---|---|---|---|
Love at last |
5 |
5 |
0 |
0 |
Romance forever |
5 |
? |
? |
0 |
Cute Puppies of love |
? |
4 |
0 |
? |
nonstop car chases |
0 |
0 |
5 |
4 |
swords & karate |
0 |
0 |
5 |
? |
上面的分数表示用户对该电影的评分(0~5分,?表示未获得评分数据) 为方便下面叙述,对如下符号进行说明:
- (n_u):表示用户数量
- (n_m):表示电影数量
- r(i,j):如果等于1则表示用户j对电影i进行了评分
- (y^{(i,j)}):表示用户j对电影i的评分
上面例子中可以知道 (n_u=4 quad n_m=5 quad y^{(1,1)}=5)
2)Content Based Recommendations(基于内容的推荐)
- 1.获取特征向量 为了实现推荐,我们为每部电影提取出了两个特征值,即x1(浪漫指数)和x2(动作指数)
movie |
Alice |
Bob |
Carol |
Dave |
x1 |
x2 |
---|---|---|---|---|---|---|
Love at last |
5 |
5 |
0 |
0 |
0.9 |
0.1 |
Romance forever |
5 |
? |
? |
0 |
1.0 |
0 |
Cute Puppies of love |
? |
4 |
0 |
? |
0.99 |
0.01 |
nonstop car chases |
0 |
0 |
5 |
4 |
0.1 |
0.9 |
swords & karate |
0 |
0 |
5 |
? |
0 |
1.0 |
由上表可知每部电影都可以用一组特征向量表示:
- 每一步电影都加上一个额外的特征,即 (x_0=1)
- 每部电影都有一个(3,1)的特征向量,例如第一部电影(Love at last):(x^{(1)}=[1,0.9,0.1]^T)
- 对于所有数据我们有数据特征向量组为({x^{(1)},x^{(2)},x^{(3)},x^{(4)},x^{(5)}})
- 2.特征权重θ 用户j对电影i的评分预测可以表示为((θ^j)^Tx^i=stars)
- 3. 线性回归预测
和线性回归一样,可以得到如下优化目标函数:
- 对单个用户而言
[min_{θ^{(j)}}frac{1}{2}sum_{i;r(i,j)=1}((θ^{(j)})^Tx^{(i)}-y^{(i,j)})^2 + frac{λ}{2}sum_{k=1}^n (θ_k^{(j)})^2 ]
- 对所有用户而言
[min_{θ^{(1)},...,θ^{(n_u)}}frac{1}{2}sum_{j=1}^{n_u}sum_{i:r(i,j)=1}((θ^{(j)})^Tx^{(i)}-y^{(i,j)})^2 + frac{λ}{2}sum_{j=1}^{n_u}sum_{k=1}^n (θ_k^{(j)})^2 ]
应用梯度下降:
[当k=0,θ_k^{(j)}:=θ_k^{(j)}-αsum_{i:r(i,j)=1}( (θ^{(j)})^Tx^{(i)}-y^{(i,j)} )x_k^{(i)}] [当k≠0,θ_k^{(j)}:=θ_k^{(j)}-αsum_{i:r(i,j)=1}( (θ^{(j)})^Tx^{(i)}-y^{(i,j)} )x_k^{(i)}+λθ_k^{(j)}]
2.Collaborative Filtering(协同过滤)
1)Collaborative Filtering
在之前的基于内容的推荐系统中,对于每一部电影,我们都掌握了可用的特征,使用这些特征训练出了每一个用户的参数。相反地,如果我们拥有用户的参数,我们可以学习得出电影的特征。即由θ求出x。
[min_{θ^{(1)},...,θ^{(n_m)}}frac{1}{2}sum_{j=1}^{n_u}sum_{i:r(i,j)=1}((θ^{(j)})^Tx^{(i)}-y^{(i,j)})^2 + frac{λ}{2}sum_{j=1}^{n_m}sum_{k=1}^n (θ_k^{(j)})^2 ]
注意累计符号的上限由(n_u)变成了(n_m)
但是如果我们既没有用户的参数也没有电影的特征该怎么办?这时协同过滤就可以起作用了,只需要对优化目标函数进行改进,如下:
[J(x^{(1)},...,x^{(n_m)},θ^{(1)},...,θ^{(n_u)}) = frac{1}{2}sum_{(i,j):r(i,j)=1}((θ^{(j)})^Tx^{(i)}-y^{(i,j)})^2 \ quadquadquadquadquadquadquad +frac{λ}{2}sum_{j=1}^{n_u}sum_{k=1}^n (θ_k^{(j)})^2 \ quadquadquadquadquadquadquad+ frac{λ}{2}sum_{i=1}^{n_m}sum_{k=1}^n (x_k^{(i)})^2]
对代价函数求偏导结果如下: [x_k^{(i)} := x_k^{(i)} - α(sum_{j:r(i,j)=1}( (θ^{(j)})^Tx^{(i)}-y^{(i,j)} )θ_k^{(j)} +λx_k^{(i)} ) ] [θ_k^{(j)} := θ_k^{(j)} - α(sum_{i:r(i,j)=1}( (θ^{(j)})^Tx^{(i)}-y^{(i,j)} )x_k^{(i)} +λθ_k^{(j)} ) ]
协同过滤算法使用步骤如下:
- 初始 x (1) ,x (2) ,...,x ((n_m)) ,θ (1) ,θ (2) ,...,θ ((n_u)) 为一些随机小值
- 使用梯度下降算法最小化代价函数
- 在训练完算法后,我们预测((θ ^{(j)} )^ T x^{ (i)}) 为用户 j 给电影 i 的评分
3. Low Rank Matrix Factorization(低秩矩阵分解)
1)Vectorization(向量化): Low Rank Matrix Factorizationv
movie |
Alice |
Bob |
Carol |
Dave |
---|---|---|---|---|
Love at last |
5 |
5 |
0 |
0 |
Romance forever |
5 |
? |
? |
0 |
Cute Puppies of love |
? |
4 |
0 |
? |
nonstop car chases |
0 |
0 |
5 |
4 |
swords & karate |
0 |
0 |
5 |
? |
(同样的例子)很显然我们可以得到评分矩阵Y [Y= left[ begin{array}{cccc} 5&5&0&0 \ 5&?&?&0 \ ?&4&0&? \ 0&0&5&4 \ 0&0&5&0 \ end{array} right] ]
推出评分 [ begin{pmatrix} (θ^{(1)})^T(x^{(1)}) &(θ^{(2)})^T(x^{(1)})& cdots & (θ^{(n_u)})^T(x^{(1)}) \ (θ^{(1)})^T(x^{(2)}) &(θ^{(2)})^T(x^{(2)})& cdots & (θ^{(n_u)})^T(x^{(2)}) \ vdots & vdots& ddots & vdots \ (θ^{(1)})^T(x^{(n_m)}) &(θ^{(2)})^T(x^{(n_m)})& cdots & (θ^{(n_u)})^T(x^{(n_m)}) \ end{pmatrix} ]
如何寻找与电影i相关的电影j呢?满足(||x^{(i)}-x^{(j)}||)较小的前几部影片即可。
2)Implementational Detail:Mean Normalization
假如增加了一个用户marsggbo,他很单纯,这5部电影都还没看过,所以没有评分数据,这是可以通过均值正则化来初始化数据,具体实现如下:
movie |
Alice |
Bob |
Carol |
Dave |
Marsggbo |
---|---|---|---|---|---|
Love at last |
5 |
5 |
0 |
0 |
? |
Romance forever |
5 |
? |
? |
0 |
? |
Cute Puppies of love |
? |
4 |
0 |
? |
? |
nonstop car chases |
0 |
0 |
5 |
4 |
? |
swords & karate |
0 |
0 |
5 |
? |
? |
此时的评分矩阵为 [Y= left[ begin{array}{cccc} 5&5&0&0&? \ 5&?&?&0&? \ ?&4&0&?&? \ 0&0&5&4&? \ 0&0&5&0&? \ end{array} right] ]
首先求出每行的均值(未评分不用计算) [μ=left[ begin{array} 2.5 \ 2.5 \ 2 \ 2.25 \ 1.25 end{array} right]→ Y= left[ begin{array}{cccc} 2.5&2.5&-2.5&-2.5&? \ 2.5&?&?&-2.5&? \ ?&2&-2&?&? \ -2.25& -2.25&2.75&1.75&? \ -1.25&-1.25&3.75&-1.25&? \ end{array} right] ]
预测值为((θ^{(j)})^T(x^{(i)})+μ_i),因为优没有评分。所以化目的函数只需要(minfrac{λ}{2}sum_{j=1}^{n_u}sum_{k=1}^n (θ_k^{(j)})^2),很显然(θ=vec0),所以新增用户评分数据可初始化为均值,即 [Y= left[ begin{array}{cccc} 5&5&0&0&2.5 \ 5&?&?&0&2.5 \ ?&4&0&?&2 \ 0&0&5&4&2.25 \ 0&0&5&0&1.25 \ end{array} right] ]
- 通过nginx GeoIP模块 限制某些国家地区访问网站
- CDN加速下通过nginx获取网站访客真实ip
- linux centos7服务器使用密钥登录ssh同时禁止root密码登录
- linux nginx服务器安装verynginx防止CC攻击
- linux nginx安装HttpGuard防止CC攻击
- wordpress您的主机禁用了mail()函数 SMTP邮件通知解决方法
- 我的编程之路:知识管理与知识体系
- UTF-8 为什么会比 UTF-16 浪费?
- 码农也要学算法
- 19 个常用的 JavaScript 简写方法
- 从零开始写 PHP 扩展
- Linux 基础:文件查找 find
- 区块链入门教程
- AI 玩微信小游戏跳一跳的正确姿势,Auto-Jump 算法详解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Canal+Kafka实现MySQL与Redis数据同步
- 超详细canal入门,看这篇就够了
- 详细讲解!RabbitMQ防止数据丢失
- 详细讲解!从秒杀聊到ZooKeeper分布式锁
- 正确使用 wait/notify/notify方法以及源码解析
- 秒杀商品超卖事故:Redis分布式锁请慎用!
- 3D开发是一个生态,ThingJS支持js,css,json,html外部资源引用
- 手把手教你实现xxl-job分布式任务调度平台搭建
- 在 vscode 中 debugger 调试
- MongoDB 的安装
- 一次opencanary自定义实践
- 从0到1编写一个Xposed Module :Anti Screenshot
- Linux pwn入门学习到放弃
- 一款针对网站的网络侦察和信息收集工具
- Numpy核心语法和代码整理汇总!