1、监督学习:根据已有的数据集,知道输入和输出结果之间的关系。根据这种已知的关系,训练得到一个最优的模型。
监督学习包括回归和分类
理解:监督学习中训练数据既有特征又有标签,通过学习,让机器在面对只有特征没有标签的数据时,可以判断出标签。
举例:①【回归】房子大小(特征),预测房价(标签)
②【分类】肿瘤大小(特征),预测肿瘤是否良性(标签)
2、无监督学习:我们不知道数据集中数据、特征之间的关系,而是要根据聚类或一定的模型得到数据之间的关系。
理解:只有特征,没有标签,根据特征值用聚类算法将数据划分为不同的簇
1、常用符号定义:
m:训练样本数
:第 i 个训练集实例,x是特征(输入变量),y是标签(输出变量)
h:h代表学习算法的假设方案
θ:模型参数
2、代价函数
令
希望建模误差的平方和能够最小
于是代价函数
3、梯度下降算法
想让J最小,类似于下山
单元梯度下降算法描述:
给 θ0、θ1一个初始值,比如 θ0=θ1=0
然后不断循环让
直到偏导均为 0
其中 α 是学习率
地图下降运行的图像类似这样
当然学高数知道我们这样求的一定是极小值点,不一定是最小值
在这个例子中,实际的最小值是下图那样的,而上图只是一个极小值
很显然的是,这个是与起始点有关的
但是无所谓,单变量线性回归的代价函数图像一定是凸函数,像下面这样,所以求出来的一定是最小值,不用担心
关于学习率α
以抛物线为例
α太小,那肯定慢
α太大,就越过最低点了,来回窜,当然也慢,甚至可能无法收敛到最低点
关于 α 的大小,一般选取 0.001,再根据具体情况进行调整即可
1、矩阵A、列向量、行向量
2、矩阵加法:对应相加就完事了
3、标量乘:矩阵每个数都和那个标量乘一下就完事了
4、矩阵乘法:
E用来表示主对角线都为1的矩阵
5、矩阵的逆:满足A是个方阵,且,则A有逆矩阵
6、矩阵的转置:矩阵A,,满足,则是A的转置
1、常用符号定义:
n:特征数n
m:训练样本数m
:第 i 个样本的第 j 个特征
:第 i 个样本的特征
:第 i 个标签
:模型参数
其中,,其中
2、代价函数
3、多元梯度下降
和单元一个道理
多元梯度下降算法描述:
给 θ 一个初始值,比如
然后不断循环让
直到偏导均为 0
其中 α 是学习率
4、特征缩放
基于代价函数的登高线图来分析
圆一些收敛得会更快
椭圆一些就很慢
所以可以把每个特征值缩放到比如 -1 到 +1 之间,并保持原有样本特性
特征缩放方法举例:
5、学习率α
太小:慢
太大:也会慢,而且会出现不收敛的情况
选择学习率的方法
①自动收敛测试:指定ε,比如0.001,代价函数变化幅度小于ε说明收敛
②直接观察图像(推荐)
6、特征和多项式
有的时候可能用线性回归方程拟合的不好
可能用非线性的曲线,用多项式回归去拟合更好一些
比如想用单元多项式回归 去拟合
解决的时候,我们可以将其转化为多元线性回归去处理,把x^2视作一个特征,把x^3视作一个特征
让 变为
7、正规方程
希望最小,换言之就是每个偏导都等于0,这也是我们梯度下降所做的
梯度下降是通过迭代,不断地改变θ的值,来找到我们想要的θ
而我们也可以直接解偏导=0的方程组
求解比较复杂,所以直接看结果就好
正规方程求模型参数的解:
其中,
8、正规方程在矩阵不可逆下的解决方法
不可逆的可能原因:
①有冗余特征:比如有房屋面积()这个特征,又有房屋面积()这个特征
②特征数太多:比如 m<=n 的情况
解决方法:
Octave中,inv(X)表示X的逆矩阵,pinv(X)表示X为伪逆矩阵,在X逆矩阵不存在时,pinv(X)求出的伪逆矩阵用于计算中,可以得到正确的结果
如图,第一次课的肿瘤问题,它是一个二分类问题
我们用线性回归去拟合的话明显不好
最右边那个超级大的肿瘤显然就是恶性的,按斜着那个回归直线看就是良性了
明显用一道竖线直接分两半还要更好
1、假设陈述
可以观察到直接用线性回归问题就出在,它的输出结果可以大于1,可以无限无限地大,从y=1开始的对应的横坐标x,往右边的全都是预测错误
所以问题的解决方法就是给输出结果限制在 [0,1]
我们原来线性回归的假设函数是
我们再套一个函数限制下输出结果范围就好,结论是如下这样:
时输出
时输出
g(z)称作sigmoid函数
假设的输出 实际上就是 的概率
图像示例
2、决策界限
比方说
根据 g 的函数图线我们知道
时,
时,
于是决策界限就是 这条直线
对于复杂的 h 也会有各种复杂的决策界限
3、代价函数
为了保证是一个凸函数
和线性回归相比,改写作了如下形式
简写为,
Cost函数的图像
4、梯度下降算法
和线性回归的结果完全一致
repeat
5、多分类问题
比方说三个类别,怎么办呢
实际上用二分类就能做了
转换成是和不是的问题,是A还是不是A,这样就是二分类了
三个类做三次二分类就可以了,如图所示
1、欠拟合过拟合问题
特征量介次太低,容易欠拟合
特征量介次过高,或者单纯特征数量很多,容易过拟合
解决过拟合的方法:
①减少特征数量
a.手动选择保留哪些特征
b.模型选择算法
②正则化:保留所有特征,但减少量级或模型参数 的大小
2、正则化减小
如图所示,代价函数中加上了 和 的项
叫作正则化项,是一个惩罚项, 叫作正则化参数
我们希望代价函数最小,于是这样 和 就得小,对曲线影响变小,就不会过拟合了
正常来说,我们会选择对 到 进行正则化,肯定不会选择 ,全都约等于 0 就没意义了
然后 太大的话其实也没意义了,假设方法就变成了 了
当然正则化项也并不是说非得从 开始,一般是 1 到 n 就是了
3、梯度下降算法
前面学过线性回归和逻辑回归偏导求出来是一样的,这里还是一样的
正则化后的梯度下降算法:
repeat
把惩罚项提出来,然后提出 得到下面的式子
可以看到,减法前半部分相当于对 进行缩放
减法后半部分减去的就是我们原来梯度下降减去的式子
4、线性回归的正则化
代价函数:
正规方程解模型参数 θ:
在 时
一定可逆
当然正常来讲 肯定是大于 0 的,因为要让 变小嘛
所以说正则化也可以用来解决 不可逆的问题
5、逻辑回归的正则化
代价函数:
1、非线性假设
之前我们的非线性特征都是类似 这样
当然也有 这种形式
如果是后者,特征就很多了,光是二次项个数就 了
所以显然不能用回归算法解决
2、神经网络基本概念
神经网络的发明基于生物上的神经元和神经网络的启发
逻辑单元:
都叫作输入单元
称作输出结果
有必要的时候加入 ,称作偏置单元或偏置神经元
这是一个带有 sigmoid 或者 logistic激活函数 的 人工神经元
也就是指带有
依然可以叫作 模型参数,也可以叫作 模型的权重
神经网络其实就是一组神经元连接在一起的集合,如图所示
其中的第一层称作输入层,第三层称作输出层,第二层称作隐藏层
当然可能不止三层,中间的那些层都称作隐藏层,中间的单元称作隐藏单元
称作第 j 层第 i 个单元的激活项
称作第 j 层向第 j+1 层映射的权重,换句话说就是第 j 层的单元作自变量的方程所用到的参数
举个例子,比如 就是第 1 层的求第2层第三个中间单元 的 的参数
观察 可以看到列下标和层上标的对应
然后如果 j 层有 个单元,j+1层 个
那么 的维度就是 ,当然这是因为有偏置单元,不然应该写作
一般来讲总是会有偏置单元的,但是图里省略了,因为没画出来所以个数也就没算进单元个数 里
的一行就是一个方程的参数,也就是对应求解下一层的一个单元
的一行就是在给一个方程配参数,所以这一行的参数个数,也就是列数,就是自变量个数,即本层的单元个数
于是 的维度就是
如图所示,我们将 这样的方程简记作了 ,代表求第 2 层第 1 个激活项的方程
求第 2 层的激活项的方程组 简单记作了
更一般的写法,
3、神经网络的使用实例
当然神经元就是逻辑回归就是了
不妨考虑如何用逻辑回归实现异或运算
很麻烦,不好实现
如果将异或展开成与和或的运算,用几个神经元去实现那就简单了
这样一个例子就表明了神经网络的价值,用一个逻辑回归表示起来很复杂甚至表示不了
用多个逻辑回归神经元结合起来组成神经网络就可以很好地解决
再比如多分类问题,比如10个手写数字,用二分类你得写10次逻辑回归,而神经网络就一次性解决了
1、代价函数
一共 L 层,第 L 层输出层有 个激活项,特别地,我们将其记作 K
对于分类问题
二分类,K=1 即可
多分类,K>=3,K 等于分类数
如下图是一个例子,对于输出向量,第几个输出标签是1,那他就是第几个类别
神经网络的代价函数(带正则化):
2、反向传播算法
按之前讲过的,正向传播逐层求激活项如下
用 表示第 l 层第 j 个结点的误差
反向传播求误差如下
反向传播算法:
3、梯度检测
梯度下降过程中,看上去代价在不断减小,但最终得到的可能不是最优解
然后我们就需要用梯度检测的方法
选取离当前的 很近的两个点,求一下斜率是否约等于偏导值
一般取 取 和 对应的两点
展开来看就是这样
4、随机初始化
对于神经网络,θ全都初始化成 0 是不行的
一般我们将其初始化为 之间的随机值,再使用反向传播算法等训练模型
1、评估假设
如果只是评估一个假设是否过拟合
我们用
70%的数据作训练集
30%的数据作测试集
看在测试集上跑的误差大小
注意保证训练集合测试集均包含各种类型的数据,先对数据“洗牌”,再分成两个集合
计算误差的方式:
1.对线性回归,用测试集数据计算出的代价函数 作误差
2.对逻辑回归,两种方式
①用测试集计算代价函数 作误差
②使用误分类比率 Testerror 作误差
2、模型的选择和交叉验证集
前面讲了评估一个假设是否过拟合
我们用测试集测试看误差大小就好
但是如果是你要选择一个假设模型
只用这样一个测试集看误差肯定是不好的
换言之你只是针对于测试集上跑怎么样而去选择的
你在别的样本上跑未必好,泛化能力未必强
于是我们用到了交叉验证集(cross validation 简写作 cv)
60%的数据作训练集,20%的数据作交叉验证集,20%的数据作测试集
用训练集训练出 n 个模型
用交叉验证集求交叉验证误差,优先选择交叉验证误差最小的那个模型
然后再用测试集求推广误差,进行最终确认选还是不选,推广误差作为模型好好评判的最终标准
个人的理解就是二次验证,或者二次测试,测一次不一定具有普遍性,那就测两次
3、诊断偏差(bias)和方差(viriance)
假设中多项式的最高次数记作 d
欠拟合是偏差大
过拟合是方差大(方差越小越稳定,方差越大波动越大)
我们常常把训练集和交叉验证集的误差与多项式最高次数的关系放在一张图中去考察
如图,
训练集误差和交叉验证集误差近似时:偏差大、欠拟合
交叉验证集误差远大于训练集误差时:方差大、过拟合
4、正则化和偏差、方差
同样,对于一个确定了多项式的模型,λ 的大小也会引起过拟合欠拟合
λ太大,θ基本就全是0了,一条横线,误差极大
λ太小,就没起到对高次方项的惩罚作用,方差极大,于是就过拟合了
也是像选多项式一样,我们选 λ 也用交叉验证的方式做就好
一般来讲 λ 通常取 0-10 之间的呈现 2 倍关系的值
如:0,0.01,0.02,0.04,0.08,0.15,0.32,0.64,1.28,2.56,5.12,10 (共 12 个)
5、学习曲线
误差error关于训练集大小m的曲线
随m增大,训练集偏差逐渐增大
随m增大,交叉验证集方差逐渐减小,因为交叉验证集体现的是泛化能力
当m无穷大时,训练集偏差和交叉验证集方差将趋近相等,毕竟无穷大这时候训练集和交叉验证集特性就趋近一样了,说成就像同一个集合也无妨
我们的训练集大小一般是相对来讲比较大的状态
如上图所示,学习曲线中,右侧红色箭头的位置大概就是平常的m对应的位置,这里的误差就是我们求出的交叉验证方差和训练集误差
学习曲线长成这样就可以确认误差和方差是比较合适的
下图是高误差的情形,可以看到方差误差很快就趋近相等了
下面是高方差的情形,可以看到得m非常非常大,二者才会趋近到一起
1、误差分析
推荐方法:
拿到一个问题,先通过一个简单的算法来快速地实现
画出相应的学习曲线来找出算法是否存在高偏差或高方差的问题
最后进行误差分析,观察交叉验证集的情况
2、不对称性分类的误差评估
不对称性分类(偏斜类):
比如之前的癌症预测问题,假设我们的假设模型在测试集上的错误类是1%
但实际上可能,患癌症的人只有0.5%,而这样直接输出0,错误率才只有0.5%
看错误率的话似乎直接输出 y=0 反而比我们训练的模型还要好
但是直接输出 y=0 真的比我们训练的模型好吗
再换句话说比如我们更换了模型,准确率从99%提升到了99.5%,我们是真的预测了更好的模型,还是说单纯的把代码替换成了y=0呢
这就是不对称性分类问题
对于这个问题,我们要引入其他量来评估模型
基于实际类和分析类,我们可以用查准率precision(P)和召回率recall(R)来评估算法
True Positive(TP):预测1,真实1,真阳性
True Negative(TN):预测0,真实0,真阴性
False Positive(FP):预测1,真实0,假阳性
False Negative(FN):预测0,真实1,假阴性
查准率precision(P):我们预测是1的样本中,实际是1的比率是多少
召回率recall(R):实际是1的样本中,我们预测是1的比率是多少
于是公式是
很明显,查准率和召回率都是越高越好
而我们前面说的 y=0,显然它 TP=FP=0,他的 R=0,显然不好
3、查准率和召回率的权衡
希望查准率高,召回率小,就相当于希望FP小,FN大,也就是希望足够确信才将病人确诊
希望召回率高,查准率小,就相当于希望FP大,FN小,也就是希望就算没病也要尽可能确诊,不漏一人尽早治疗
对于
阈值 threshold = 0.5
现在,如果我们
希望查准率高,召回率小,换言之就是希望预测的 1 准确,那调高 threshold,比如 0.7
希望召回率高,查准率小,换言之就是不希望漏掉实际的 1,那就调低 threshold,比如 0.3
我们希望两个都要尽可能高呢,怎么样算是两个都高呢
有一个 F值公式,F值公式越高越好
支持向量机别名:大间距分类器
1、优化目标
如图是逻辑回归两部分 log 的图线
很明显我们换成紫笔画的那两条直线的话,计算就会简化
2、假设函数与代价函数
假设函数:(不像逻辑回归输出概率,只有0,1)
代价函数:(带正则化)
参数 C 功能上类似
3、直观上对大间距的理解:
cost函数长这样
希望求出一个 使代价函数尽可能小,很明显cost要取0嘛,所以就很简单了
时,
时,
上述的式子称作决策边界
对大间隔的直观理解:到两个类别间距都尽可能大,如图,就是那条黑线
3、核函数
sim函数相当于相似度函数,也就是向量空间中,x和 的相似度,越相近,减完越接近 0
关于 的影响,如下图
当 较小时,图像会比较尖锐,结果低偏差,高方差
当 较大时,图像会比较平滑一些,结果高偏差,低方差。
线性核函数:
4、使用SVM
高斯核函数和线性核函数是最常见的核函数。
其他的核函数还有:多项式核函数、字符串核函数、卡方核函数、直方图交集核函数。
在进行高斯核函数之前,记得要进行特征缩放。
所有的核函数都要满足默塞尔定理,才能被SVM的优化包正确使用。
如何选择逻辑回归还是SVM:特征数 n,训练样本数 m
(1)如果相较于m而言,n要大许多,即训练集数据量不够支持我们训练一个复杂的非线性模型,我们选用逻辑回归模型或者不带核函数的支持向量机。
(2)如果n较小,而且m大小中等,例如n在 1-1000 之间,而m在 10-10000 之间,使用高斯核函数的支持向量机。
(3)如果n较小,而m较大,例如n在 1-1000 之间,而m大于 50000,则使用支持向量机会非常慢,解决方案是创造、增加更多的特征,然后使用逻辑回归或不带核函数的支持向量机。
簇(聚类)、聚类算法
K-meansK均值算法是最普及的聚类算法
1、算法运行图示:
先选两个聚类中心,每个点看离哪个中心更近,就染成哪个颜色
然后算出同一个颜色点的均值,将聚类中心移动过去
然后按现在聚类中心的位置重新染色
重复运行以上过程,最终聚类中心的位置将不再改变,点的颜色也不再改变,便分好了两个簇
2、算法描述:
随机初始化 K 个聚类中心
repeat{
for i = 1 to m
距离 最近的聚类中心的编号(1 to K)
for k = 1 to K
属于聚类 k 的点的平均值
}
3、代价函数:
4、初始化聚类中心
完全随机初始化是一种方法
吴老师推荐选择 K < m,随机选择 K 个样本点,作为聚类中心
可以看到其实还是会有这样的情况
也就是K-means算法落在了局部最优,和之前讲过的回归算法梯度下降代价函数求出了局部最小值是一个道理
解决方案就是我们要从随机初始化到运行算法,完整地多做几次K-means,比如100次
然后挑出代价函数 J 最小的那个,在这些模型结果中一定就是最好的
5、选取聚类数量
如图,是选择四个类,还是两个类,亦或是其他聚类数量,这种易于用眼睛看的光用眼睛看就已经很不好说怎么选了
所以我们需要一个自动化算法来选择聚类数K
肘部法则
代价函数 J 关于聚类数 K 的图线看起来就像一个肘部
左边是比较理想的情况,很明显选 K=3 比较好
实际上很多时候图线更像右边那样,还是不是很好确定K选多少
肘部法则是值得尝试的,但是不能期望肘部法则解决任何问题
很多时候 K 的选择其实是要看下游目的的
比如说下面的T恤
选3类还是选5类,比方说我的下游目的,T恤只做三种中间尺码的更好卖,那就选3
比方说我就是希望更加细化地拟合尺码,来迎合各种人群,那就选5
1、降维目标:
目标1:数据压缩
去掉不必要的特征,降低时间复杂度和空间复杂度
一个是要去掉明显冗余的属性,比如课程一开始就讲过的,房屋m^2作单位的面积,以feet^2作单位的面积,这两个就是冗余的
然后是具有线性相关性的变量也是多余的,这是很显然的
比方说特征是二维的,拟合成一条直线比较好,那么其实另一维特征是没用的
再比方说特征是三维的,拟合成一个平面比较好
目标2:可视化
有很多的特征,你都搞不清它的意义,和标签有着什么样的联系
那就每次选出两个特征,训练出一个模型,看一看图像,来感受这两个特征的影响
2、主成分分析算法PCA
如图所示样本点到直线上的投影距离(又叫作投影误差)很小,以投影点代替原样本点,就可以实现降维,这样的误差其实很小
对于 n 维空间,我们要找 k 维向量来描绘一个空间,将原来 n 维空间的样本点投影到新的 k 维空间
比如右图,3维空间,我们用 2 维向量描绘了一个平面,将原来 3 位空间的样本点投影到了这个 2 维平面上
找到这样一个 k 维空间,就是主成分分析算法PCA要做的事情
PCA算法描述:
Octave命令: 计算 U
取矩阵 U 的前 k 列得到 矩阵
计算 从而将 x 降维成 z
3、主成分数量的选择
选择满足误差<0.01条件的最小的 k
对于Octave,只需要判断
于是我们的PCA算法就要描述成
从 k=1 开始,计算矩阵 U,S,验证是否符合误差条件,k++,直到不符条件为止
4、压缩重现
压缩重现即压缩的样本,如何得到原来维度的样本的近似
也就是求上面主成分选择算法中的
公式是
5、应用PCA的建议
我们可以用PCA降维加速学习算法的速度,也可以减少内存的需求。
但是我们不应该利用PCA来避免过拟合,虽然这样做可能有时候会有点改进,但是我们还是会保留99%的方差
所以我们应该用更加实用的正则化来避免过拟合
还有就是
在设计一个机器学习系统时,我们有时列举的项目计划一开始就包括了运用PCA来降维
这是不可取的
我们应该首先考虑的是,不使用PCA的情况下,整个系统会得到什么结果
而不是一开始就花费大量时间去运用pca降训练集降维