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
二、 重点&难点
Anomaly Detection
1. Density Estimation
1) Problem Motivation
假设我们生产了若干产品,现在通过两个特征来衡量产品是否合格,下面表示的是合格产品的分布图。
现在有两个新生产的产品,分布如下(绿色×)
上面我们构建的模型(即蓝色同心圆)能根据测试数据告诉我们其属于一组数据的可能性p(x).上图中,在蓝色圈内的数据属于该组数据的可能性较高,而越是偏远的数据,其属于该组数据的可能性就越低。 这种方法称为密度估计,表达如下:
[if quad p(x)≤ε,则为anomaly(异常)] [if quad p(x)>ε,则为normal(正常)]
2) Gaussian Distribution
略
3) Algorithm
还是以上面产品检测为例,我们先得到如下图左边的样品特征分布,然后根据分布图分别画出x1和x2的高斯分布图
下面的三维图表表示的是密度估计函数,z 轴为根据两个特征的值所估计 p(x)值:
我们选择一个 ε,将 p(x)=ε 作为我们的判定边界,当 p(x)>ε 时预测数据为正常数据,否则则为异常。
2. Building an Anomaly Detection System(创建异常检测系统)
1) Developing and Evaluating an Anomaly Detection System
异常检测算法是一个非监督学习算法,意味着我们无法根据结果变量 y 的值来告诉我 们数据是否真的是异常的。我们需要另一种方法来帮助检验算法是否有效。当我们开发一个 异常检测系统时,我们从带标记(异常或正常)的数据着手,我们从其中选择一部分正常数 据用于构建训练集,然后用剩下的正常数据和异常数据混合的数据构成交叉检验集和测试 集。
例如:我们有 10000 台正常引擎的数据,有 20 台异常引擎的数据。 我们这样分配数 据: 6000 台正常引擎的数据作为训练集 2000 台正常引擎和 10 台异常引擎的数据作为交叉检验集 2000 台正常引擎和 10 台异常引擎的数据作为测试集
具体的评价方法如下:
- 根据测试集数据,我们估计特征的平均值和方差并构建 p(x)函数
- 对交叉检验集,我们尝试使用不同的 ε 值作为阀值,并预测数据是否异常,根据 F 1 值或者查准率与查全率的比例来选择 ε
- 选出 ε 后,针对测试集进行预测,计算异常检验系统的 F 1 值,或者查准率与查全 率之比
2) Anomaly Detection vs. Supervised Learning
异常检测和监督学习的确有几分相似,但是还是有区别的,整理如下:
异常检测 |
监督学习 |
---|---|
非常少量的正向类(异常数据 y=1),大量的负向类(y=0) |
同时有大量的正向类和负类 |
许多不同种类的异常,非常难。根据非常少量的正向类数据来训练算法。 |
有足够多的正向类实例,足够用于训练算法,未来遇到的正向类实例可能与训练集中的非常近似。 |
未来遇到的异常可能与已掌握的异常、非常的不同。 |
|
例如:1. 欺诈行为检测2. 生产(例如飞机引擎)3. 检测数据中心的计算机运行状况 |
例如:1. 邮件过滤器2. 天气预报3. 肿瘤分类 |
3) Choosing What Features to Use
异常检测假设特征符合高斯分布,如果数据的分布不是高斯分布,异常检测算法也能够 工作,但是最好还是将数据转换成高斯分布,例如使用对数函数:x = log(x+c),其中 c 为非 负常数; 或者 x=xc ,c 为 0-1 之间的一个分数,等方法。
3. Multivariate Gaussion Distribution(多元高斯分布)
1) Multivariate Gaussion Distribution
假使我们有两个相关的特征,而且这两个特征的值域范围比较宽,这种情况下,一般的 高斯分布模型可能不能很好地识别异常数据。其原因在于,一般的高斯分布模型尝试的是去 同时抓住两个特征的偏差,因此创造出一个比较大的判定边界。 下图中是两个相关特征,洋红色的线(根据 ε 的不同其范围可大可小)是一般的高斯分 布模型获得的判定边界,很明显绿色的 X 所代表的数据点很可能是异常值,但是其 p(x)值却 仍然在正常范围内。多元高斯分布将创建像图中蓝色曲线所示的判定边界
- 一般的高斯分布模型 我们计算 p(x)的方法是: 通过分别计算每个特征对应的几 率然后将其累乘起来,在多元高斯分布模型中,我们将构建特征的协方差矩阵,用所有的特 征一起来计算 p(x)。
[p(x)=∏_{j=1}^{n}p(x_j;μ_j,σ^2_j)=∏_{j=1}^{n}frac{1}{sqrt{2π}σ_j}exp(-frac{(x_j-μ_j)^2}{2σ_j^2})] [μ=frac{1}{m}sum_{i=1}^{m}x^{(i)} ]
- 多元高斯分布
[p(x)=frac{1}{(2π)^{frac{n}{2}} |Σ|^{frac{1}{2}}}exp(-frac{1}{2}(x-μ)^TΣ^{-1}(x-μ))] [Σ=frac{1}{m}(X-μ)^T(X-μ)]
μ和Σ对模型的影响
上图是 5 个不同的模型,从左往右依次分析:
- 是一个一般的高斯分布模型
- 通过协方差矩阵,令特征 1 拥有较小的偏差,同时保持特征 2 的偏差
- 通过协方差矩阵,令特征 2 拥有较大的偏差,同时保持特征 1 的偏差
- 通过协方差矩阵,在不改变两个特征的原有偏差的基础上,增加两者之间的正相关 性
- 通过协方差矩阵,在不改变两个特征的原有偏差的基础上,增加两者之间的负相关 性 2) Anomaly Detection using the Multivariate Gaussion Distribution
通过使用多元高斯分布异常检测,可以更好的拟合数据,不再是画同心圆了,2333~~。
- Android WebView 上传文件支持全解析
- 网站管理软件 – AspxSpy2014 Final
- 特性分支与特性开关哪家强?
- Android快速开发框架 roboguice
- 悄悄的干活,打枪的不要!勒索+比特币挖矿木马
- 拥有可移动头像的折叠Android工具栏:CollapsingAvatarToolbar
- Android平台下的第一个Tor木马
- 利用代码实现自定义圆角+阴影按钮 android-flat-button
- 周末阅读:程序员的《权利法案》
- 对利用Adobe 0day – CVE-2014-0502进行攻击的行为分析
- Android系统更改状态栏字体颜色
- Android实现竖着的滑动刻度尺效果,选择身高(竖向的)
- DedeCMS全版本通杀SQL注入漏洞利用代码及工具
- Android实现滑动刻度尺效果,选择身高体重和生日
- 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 数组属性和方法
- 突击并发编程JUC系列-JDK1.8 扩展类型 LongAdder
- 利用tensorflow训练简单的生成对抗网络GAN
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.7):运算符(基本算数运算符、原码、反码、补码)
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.6):基本数据类型及字符集编码(字符编码和char型)
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.6):基本数据类型及字符集编码(整型、浮点型、布尔型)
- 多图详解Spring框架的设计理念与设计模式
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.2-3.5):标识符、关键字、注释、变量及常量
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.1):一个简单的例子
- 详解Java解析XML的四种方法
- 《Java从入门到失业》第四章:类和对象(4.6):类路径
- 《Java从入门到失业》第四章:类和对象(4.5):包
- 《Java从入门到失业》第四章:类和对象(4.4):方法参数及传递
- 《Java从入门到失业》第四章:类和对象(4.3):一个完整的例子带你深入类和对象
- 《Java从入门到失业》第四章:类和对象(4.2):String类
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.9):数组(数组基本使用、数组的循环、数组拷贝、数组排序、多维数组)