吴恩达机器学习第三课 Unsupervised learning recommenders reinforcement learning
Unsupervised learning recommenders reinforcement learning
week1
1.1 课程介绍
- 非监督学习-
Unsupervised Learning
1)聚类算法-Clustering
2)异常检测-Anomaly Detection
- 个性化推荐系统-
Recommender System
- 强化学习-
Reinforcement Learning
2.1 什么是聚类
聚类算法 查看大量的数据点并寻找找到彼此相关或者相似的数据点
这是一种无监督学习算法。
什么是聚类:输入的数据集中只有特征x,没有标签y(label),需要算法自行找出数据间的关系。
应用:将内容相似的新闻分组(grouping similar news),市场/用户人群分析(market segmentation),DNA 分析(DNA analysis),航天数据分析(Astronomical data analysis)。
2.2 k-means 直观理解
首先算法猜测数据的中心点——聚类中心 / 簇质心;
K-means will take a random guess at where are the centers of the clusters.
The centers of the cluster are called cluster centroids.
k-means首先随机猜测你可能要求他找到的两个聚类
步骤一:
遍历所有数据点,判断每个数据点距离哪一个簇质心更近,并将数据点分配给更接近的簇质心。
Assign each point to its closest centroid.
步骤二:
计算分配好的2(n)组数据点,取出一组,对组内所有数据点计算平均值,并把改组对应的簇质心移动到平均值所在的点;对所有组进行以上操作。
Recompute the centroids.
以上第一次迭代完成后,即通过计算获得新的一组簇质心;重新对所有数据重复步骤一、二的操作,更新簇质心的位置,直到数据分类和簇质心不再改变(算法收敛)。
Look at each point and assign it to the nearest cluster centroid and then move each cluster centroid to the mean of all the points with the same color.
2.3 K-means算法
- 随机初始化K个簇质心μ1,μ2...,μk
- 将点分配给聚类
- 移动簇质心,把更新的集群质心的位置设置为这个集群k的点的平均值
这个算法有一个极端情况:如果一个集群分配给它的训练样本为0。最常见的做法就是消除这个集群,最终得到k-1个簇。但是如果你真的需要k个集群,那么随机重新初始化这个集群质心,并希望下一轮它至少被分配一些点
这些实力都是k-means 工作的很好给出有用结果的实例,即使数据不位于分割良好的集群中
2.4 优化目标
\(c^{(i)}\), (i = 1,…,K):数据集所分成所有聚类的索引(index of cluster to which example x(i) is currently assigned)
\(μ_{K}\):第k个聚类的中心点向量(cluster centroid k)
\(μ_{c}^{(i)}\):样本x(i)所在聚类的中心点向量(cluster centroid of cluster to which example x(i) has been assigned)
代价函数(Cost function / Distortion function):
代价函数每一步都应该降低/不变,如果出现代价函数增大,说明有bug;可以通过代价函数降低的梯度判断算法是否收敛。
这里m代表的是实例的数量,即前面例子中点的数量(30);
k代表的是分成的簇群的个数,就是要把点分到几个类里面
在每一步中都会尝试更新集群分配c1~c30 或者更新集群集中度U1和U2的位置,为了继续降低这个成本函数J(同时也被称为distortion function 畸变函数)
K-means算法正在优化成本函数J 保证他在每次迭代的时候收敛
2.5 初始化K-means
随机初始化可能会有陷入局部最小值的情况出现
可以多次使用随机初始化,选择J最小的那一个。
2.6 选择聚类数量
3.1 发现异常事件
异常检测算法会查看未标记的正常事件数据集,从而学会检测异常或者发出危险信号。
执行异常检测最常见的方法就是通过density estimation 密度估计法
当得到这m个例子的训练集的时候,要做的第一件事情就是为x的概率建立一个模型
学习算法将会尝试找出具有高概率的特征x1和x2的值是什么,以及在数据集中出现的可能性较小的值是什么
\(x_{test}\)是异常吗?引入事件发生的概率:
\(p(x_{test})<ε\) ————flag anomaly
\(p(x_{test})≥ε\) ————“OK”
3.2 高斯正态分布
$ \sigma^2$就是variance方差
概率之和一定为1,所以这里的面积之和一定为1
最大似然估计
3.3 异常检测算法
- 选择你可能指示异常的特征xi
- fit \(u_{1}...μ_{n} ,\sigma_{1}^2,...\sigma_{n}^2\)
3.4 开发与评估异常检测系统
案例:飞机引擎数据集中有10000个正常引擎(good / normal),20个异常引擎(flawed / anomalous);
方案一:
训练集(Training set):6000个正常引擎
交叉验证集(CV):2000个正常引擎(y = 0),10个异常引擎(y = 1)
测试集(Test):2000个正常引擎(y = 0),10个异常引擎(y = 1)
方案二(效率高但可能过拟合):
训练集(Training set):6000个正常引擎
交叉验证集(CV):4000个正常引擎(y = 0),20个异常引擎(y = 1)
测试集(Test):无
算法的评估标准:(参考Part2-Week3(下)-4.1和4.2)对于高倾斜数据,可以采用查准率、查全率作为评估指标。
如果你有一些标记的例子,因为您仍将使用无监督学习算法。为什么不采用那些标记的示例并使用监督学习算法呢?
3.5 异常检测与监督学习对比
异常检测(Anomaly detection) | 监督学习(Supervised learning) |
---|---|
高倾斜数据:y = 1 的样本很少(Very small number of positive example: y = 1 . Large number of negative example: y = 0 ) |
正例和反例的样本量都很大(Large number of positive and negative examples) |
异常样本的种类多且杂。(Hard for any algorithm to learn from positive examples what the anomalies look like; future anomalies may look nothing like any of the anomalous examples we’ve seen so far.) | 可以通过正例的学习得到反例的特征。(Enough positive examples for algorithm to get a sense of what positive examples are like, future positive examples likely to be similar to ones in training set.) |
应用:欺诈检测(Fraud detection) | 垃圾邮件分类(Email spam classification) |
生产制造(Manufacturing- Finding new previously unseen defects in manufacturing, e.g. aircraft engines) | Manufacturing- Finding known, previously seen defects |
Monitoring machines in a data center | Weather prediction(sunny/rainy/etc.) |
… | Diseases classification |
一个是从错题集里找答案,一个是从正确题库里找做题技巧然后思考为什么做错了 。
异常检测尝试找到全新的正面示例,这些事例可能和我们之前见过的任何东西都不一样。
监督学习会查看正面示例并尝试确定未来示例是否和你已经看到的正面示例相似。
3.6 选择使用什么特征
在监督学习中,如果你没有完全正确的特征,或者如果你有一些与问题无关的额外的特征,通常结果是没问题的。因为算法可以忽略某些特征或者重新缩放特征并充分利用您提供的特征。
但是对于异常检测很难找出要忽略的特征。
所以仔细选择特征对于异常检测甚至比监督学习方法更重要。
如果我可以想出一个X2的新特征,比如说,我正在尝试检测欺诈行为,如果X1是他们的交易数量。X2是这个用户的打字速度。这里有新特征X2之后,这里算法可能会拟合一个高斯分布。
week2
1.1 提出建议
1.2 使用每个特征
m是电影数量
n表示特征数量
\(n_{u}\)是用户的数量
如果用户j对电影i进行了评分,则r(i,j)=1,否则为0
\(y^{(i,j)}\)是用户j对电影i的评分
w(j) 和 b(j)是用户j的参数
针对用户j和电影i的预测评级为\(w^{j}*x^{i}+b^{j}\)
这里使用\(m^{(j)}\)来表示用户j评分的电影数量
我们要做的就是在给定我们拥有的数据的情况下学习参数w和b
使用mean square error
1.3 协同过滤算法
如果我们事先不知道\(x_1\)和\(x_2\)的值是多少
给定的w这些值,\(x_1\)设为多少会令这些值正确
协同过滤就是从多个用户收集数据,用户之间的这种写作可以帮助您预测未来甚至其他用户的评级
1.4 二进制标签
为了构建这个算法,我们必须根据平方误差来修改成本函数
在这个数据集上运行算法,你实际上会得到第五个用户的参数,因为eve还没有给电影评分,所以这里w和b并不会影响成本函数中的第一项,因为没有Eve的评分在这个平方误差成本函数中起作用。
如果有一个新用户还没有评分,那么这个算法会认为所有电影评分都是0。因此在本视频中,我们将会看到均值归1化,将会帮助这个算法更好的预测电影收视率。
2.1 均值归一化
事实上这个算法的效果会导致新用户对eve的初始猜测刚好等于其他用户对于这五部电影评分的平均值
在这个算法中,我们所做的就是讲这个矩阵的每一行归一化为均值为0,并且当有一个新用户还没有给很多电影评分的时候,这很有用。
还有另一种替代方案,就是将这个矩阵的列标准化均值为0(电影还未有人看过),但我认为在这个应用程序中,规范化行以便您可以给出合理的评级。
2.2 协同过滤tensorflow实现
tensorflow可以帮你自动找出成本函数的导数,我们要做的就是实现成本函数,无需了解其他的。
当我们处理我们的第一个线性回归示例的时候,那时我们设置了b=0
最主要的工作是:告诉它如何计算成本函数J,其余的语法会导致tensorflow自动为你找出那个导数是什么。
如果使用梯度下降来进行附带过滤,请记住,成本函数J将是w、b和x的函数
数据集:有真实人物评分的真实电影
2.3 寻找相关特征
给定一个特征向量\(x^(k)\)我们确定与特征\(x^(i)\)相似的方法:
如果你正在构建一个网站并希望帮助用户找到他们正在查看的特定产品相关的产品,这是一个方法
协同过滤的一些限制:
- 不太擅长冷启动问题
eg:有人发布了一个新的电影,但是几乎没人评价过这部电影,该如何对这个新的电影排名
eg:对于只评价了几个项目的新用户,我们如何确保向他们展示合理的东西
- 使用一些附加的用户信息
3.1 协同过滤与基于内容过滤对比
比较和对比到目前为止我们将要研究的协同过滤方法与这种新的基于内容的过滤方法。
-
协同过滤算法
根据与您给出相似评级的用户的评级来向您推荐项目
-
基于内容的过滤算法
根据用户的特征和物品的特征向您推荐物品,以找到合适的匹配项
如果\(v_u\)是一个用户向量,结果是捕获了用户的偏好
eg: \(v_{u}\)是[4.9,0.1...]说明了这个用户4.9喜欢romance,0.1喜欢action
\(v_{m}\)是电影特征
eg: \(v_{m}\)=[4.5,0.2...]说明这个4.5可能是romance,0.2可能是action
将两个向量点积(长度需要相同),可以得到用户对这部特定电影的喜爱程度
3.2 基于内容过滤的深度学习方法
在我们的方法中,给定一个描述用户的特征向量,例如年龄、性别、国家等,我们必须必须计算\(v_u\),同理计算\(v_m\)
为了做到前者,我们将使用 用户神经网络
后者使用 电影神经网络
假设用户网络和电影网络可以具有不同数量的隐藏层,每个隐藏层的的单元也可以不同
如果我们有二进制标签,如果y表示用户喜欢某个项目,可以修改prediction:
\(g(v_{u}·v_{m})\)预测\(y^{(i,j)}\)=1的概率
使用梯度下降或者一些其他的优化算法来调整神经网络的参数,让J尽可能的小
3.3 从大型目录中推荐
分两步:检索 排名
检索:
- 先产生一个疑似的候选列表
- 对于这个用户最后看过的10部电影,找10部类似的电影
- 对于最经常观看的3种类型,找出前10名的电影
- 在这个国家的前20名电影
- 组合这些并删除重复的和已经观看过的
排名:
对于每个用户电影,计算预测分。
3.4 推荐系统中的伦理
3.5 基因内容过滤的tensorflow实现
4.1 降低特征数量
主成分分析( principal components analysis) 的无监督学习方法
4.2 PCA算法
如果要想将数据减少到一个轴或者一个特征,那么主成分分析是一个不错的选择
轴的不同选择将会影响投影的可视化
将轴设置在此处的时候,这些点被挤压在一起
如果将轴设置为这样,那么这些点的变化就大的多,这里捕获了原始数据集中的更多信息
PCA 不是一种线性回归
使用线性回归:试图拟合一条直线,以便预测值尽可能的接近真实标签y,最小化这些垂直方向的小线段的长度
在PCA中,没有真实标签y,只有未标记的数据X1和X2,不会尝试拟合一条线,使用X1来预测X2,而是平等的对待X1和X2,我们试图找到这个Z轴。
可以用z上面的点去近似实际点
4.3 PCA 代码实现
- 首先先进行特征缩放,这里特征缩放对于帮助PCA找到合适的轴非常重要
- 运行PCA算法来拟合数据以获得新轴
- 查看新的轴,还有新的轴在多大程度上解释了你的数据差异
- 进行变换,将数据投影到新轴上面
pca 经常用于可视化,可以将数据减少到2~3个数字,以便于绘制这个图像
另一个pca的应用是用于数据压缩
还可以用于加速监督学习模型的训练,如果特征太多的话,可以将特征减小到100个这样可以加速监督学习模型的训练。
week3
1.1 什么是强化学习
无线电遥控器直升机可以十秒一次获得直升机的位置、方向和速度(状态s)。
任务:根据给出的直升机的状态s来决定如何移动控制杆
强化学习的关键:奖励函数(可以告知直升机什么时候做得好,什么时候做的不好)
1.2 示例:火星探测器
(state,action,reward,next state)
1.3 强化学习的回报
获得奖励越早导致总的回报值越高
折扣分子是一个非常接近于1的数字
从不同的状态开始得到的回报值不同
1.4 决策:强化学习中的策略
1.5 复习关键概念
马尔可夫决策 :未来只取决于你现在在哪里,不是关于你是怎么到这里的
选择动作a 并基于这些动作 环境改变 观察我们所处的环境以及获得的奖励
2.1 状态-动作价值函数
Q(s,a)
先找到一个状态s,再做出行动a1,a2...,然后比较这些行动带来的回报,最终选择回报最高的行动
2.2 状态-动作价值函数示例
2.3 贝尔曼方程
2.4 random stochastic environment
3.1 示例:连续状态空间应用
3.2 登月器
奖励函数:
3.3 学习状态值函数
训练一个神经网络来近似Q(s,a)
state 八种
action:nothing、left、main、right(使用one-hot进行编码)
强化学习与监督学习不同,我们要做的不是输入状态并让它输出动作。我们要做的是输入一个状态动作,让它尝试对输出Q(s,a)
使用贝尔曼方程来创建包含大量示例x和y的训练集,然后我们将使用监督学习
3.4 算法改进:改进的神经网络架构
3.5 算法改进:ε 贪婪策略
3.6 算法改进:小批量和软更新
mini-batch :在循环的每次迭代过程中不使用所有的训练实例,而是选择与一个比较小的数字
小批量的梯度下降会趋向于全局最小值,虽然有点不可靠,但是每次的计算成本较低
逐步的更新参数可以减少震荡