AI学习笔记-机器学习
Day 1
概念入门
机器学习
某种程度上让计算机自行实现程序设计
监督学习
数据集经过人工打标签,目标是预测标签
无监督学习
数据集未经过人工打标签,目标是分类
回归问题
监督学习解决的目标问题的一种,标签是连续的值或范围很大的离散值
分类问题
监督学习解决的目标问题的一种,标签是少数几个离散值
聚类算法
无监督学习
单变量线性回归
最简单的机器学习算法
监督学习算法的工作模式
令$m$为训练集的大小,$x$为输入(特征),$y$为输出(标签),$(x,y)$代表一个数据(特征为$x$,标签为$y$),$(x^{(i)},y^{(i)})$代表训练集中的第$i$个数据
定义$h$为学习算法的解决方案/函数,也称为假设(hypothesis)
上图的意思大概就是,机器学习算法通过训练集获得了一个假设$h$,之后对于实际的数据,将其利用假设$h$获得一个预测结果
因此,$h$是一个从$x$到$y$的函数映射
一个简单的函数映射为$h(x)=\theta_{1}x+\theta_{0}$,因为只有一个特征值,这类问题称为单变量线性回归问题
代价函数
用于衡量$h$的准确程度的方式。
一个常用的代价函数为:$J(\theta)=\frac{1}{2m}\sum\limits_{i=1}^{m}(h_{\theta}(x^{i})-y^{i})^{2}$
其中,$\theta$称为参数(parameters),$(h_{\theta}(x^{i})-y^{i})^{2}$即是对于训练集中每一个数据,我们的假设预测的结果与实际结果的误差的其中一种计算方式,称为建模误差(modeling error)
我们的目标是通过调整参数,使得代价函数最小,也就是使得假设预测的结果尽量接近实际结果
上面这个代价函数通常称为平方误差函数,是解决回归问题的常用代价函数
在上面给出的单变量线性回归的函数映射中,对应的代价函数为$J(\theta)=\frac{1}{2m}\sum\limits_{i=1}^{m}(\theta_{1}x^{i}+\theta_{0}-y^{i})^{2}$
梯度下降
用来改进$h$使其更接近目标的方法
核心思路是:在每一步中,对于每一个参数,使其减去学习率乘以上一步的代价函数在这个参数上的偏导数的值。
$$\theta_{i}=\theta_{i}-\alpha\frac{\partial}{\partial\theta_{i}}J_{\theta}$$
在这个方法中,学习率( $\alpha$ )是一个提前指定的、对每个参数相等的值,用来控制梯度下降的速度,而偏导数( $\frac{\partial}{\partial\theta_{i}}J_{\theta}$ )用来控制这个参数下降的方向和幅度。
在上面给出的单变量线性回归的假设和代价函数下,对于每个参数的梯度下降过程为:
$$\theta_{0}=\theta_{0}-\alpha\frac{1}{m}\sum\limits_{i=1}^{m}(\theta_{1}x^{i}+\theta_{0}-y^{i})$$
$$\theta_{1}=\theta_{1}-\alpha\frac{1}{m}\sum\limits_{i=1}^{m}((\theta_{1}x^{i}+\theta_{0}-y^{i})x^{i})$$
批量梯度下降是指在梯度下降的每一步中,都使用到了训练集中的所有数据
正规方程
另一种用于计算使得$J_{\theta}$最小的方式,在参数规模较小时适用
多变量线性回归
引入向量和更多特征
多维特征
考虑一个具有$n$个特征的模型,输入为$x_{1},x_{2},x_{3}…x_{n}$,则假设$h$可以写成$h=\theta_{0}+\theta_{1}x_{1}+…+\theta_{n}x_{n}$,为了简化,可以引入一个新的输入$x_{0}=0$,则此假设可以写成$h=\sum\limits_{i=0}^{n}\theta_{i}*x_{i}$。
此时参数$\theta$和输入(特征)$x$都可以写成一个$n+1$维的向量,那么公式可以写成$h=\theta^{T}X$,其中$\theta^{T}$代表向量$\theta$的转置
多变量梯度下降
与单变量时相似,此时代价函数可以写为$J(\theta)=\frac{1}{2m}\sum\limits_{i=1}^{m}(\sum\limits_{j=0}^{n}\theta_{j}x_{j}^{i}-y^{i})^{2}$,其中$x_{j}^{i}$表示第$i$个特征中的第$j$个值
那么每个参数的梯度下降过程为
$$\theta_{j}=\theta_{j}-\alpha\frac{1}{m}\sum\limits_{i=1}^{m}((\sum\limits_{j=0}^{n}\theta_{j}x_{j}^{i}+\theta_{0}-y^{i})x_{j}^{i})$$
特征缩放
对于多个特征,当特征的尺度尽可能接近时,梯度下降法将更有效,因此最好把每个特征都进行缩放,例如都缩放至$[-1,1]$的区间内,或者使用每个特征的标准分数作为输入:$X_{n}=\frac{X_{n}-\mu_{n}}{s_{n}}$,其中$\mu_{n}$为平均值,$s_{n}$为标准差
学习率
无法预知合适的学习率和迭代次数,在特定的学习率下,可以通过绘制迭代次数-最小值的图表来确定收敛阈值
常见的学习率有$\alpha=0.01, 0.03, 0.1, 0.3, 1, 3, 10$
多项式回归
线性回归并不适用于所有情况,可能有的特征与结果的关系并不线性,但是我们可以将其转化为线性回归:例如,假设我们猜测特征中的$x_{i}$与结果的关系接近二次函数$a(x_{i})^{2}+bx_{i}+c$,那么我们可以将$x_{i}$改为两个新的特征$x_{i1}=(x_{i})^{2}$和$x_{i2}=x_{i}$,这样模型就转化为线性回归模型,同理,其他模型也可以类似转化为线性回归模型。
注意,这样经过转化的线性回归模型,特征缩放将会非常重要。
正规方程
可以利用矩阵的逆来直接计算答案,这种方法的优点是准确,一次计算得出,缺点是当特征数量多时计算效率低,以及适用范围较窄,要求矩阵可逆,且只适用于线性回归模型。
利用正规方程可以得到$\theta=(X^{T}X)^{-1}X^{T}y$,也就是参数向量 等于(特征向量的转置 乘以 特征向量)的逆 乘以 特征向量的转置 乘以 结果
Day 2
逻辑回归(Logistic Regression)
引入
对于标签离散并且取值范围小的问题,也就是分类问题,线性回归可能并不适用,例如对于${0,1}$的分类,我们希望结果输出都为$0$和$1$,但是线性回归可能输出远远超过这个范围的值,这时候我们就需要逻辑回归。逻辑回归的特性是:输出永远在$0$和$1$之间,可以用于把输入分类为$0$或$1$
假设函数
逻辑回归的假设函数为$h_{\theta}(X)=g(\theta^{T}X)$,其中,$X$为特征向量,$\theta^{T}$为参数向量的转置,$g$是一个逻辑函数(logistic function),一个常用的逻辑函数是S形函数(Sigmoid function),其公式为$g(z)=\frac{1}{1+e^{-z}}$,图像如下所示:
此时假设函数在逻辑上的定义为:对于给定的特征向量,分类标签为$1$的可能性,即$h(x)=P(y=1|x;\theta)$
决策边界(decision boundary)
令$z=\theta^{T}X$,由于当$z=0$时,$g(z)=\frac{1}{1+e^{0}}=\frac{1}{1+1}=\frac{1}{2}$,上面提到,这个值可以理解为分类标签为$1$的可能性,因此当$z\ge0$时,我们预测$y=1$,反之,$z\lt0$时,我们预测$y=0$
决策边界即是使得$\theta^{T}X=0$的曲线
注意到此时$\theta^{T}X$即为多变量线性回归,那么相似的,我们也可以将更复杂的函数转化为线性回归之后作为逻辑函数的输入,以适应更复杂的分类情况
代价函数
当使用之前在线性回归中使用过的平方误差函数作为逻辑回归的代价函数时,会发现此时这个代价函数是一个非凸函数(non-convexfunction),也就是说很可能存在很多个局部最小值,会导致梯度下降法失效
平方误差函数为$J(\theta)=\frac{1}{2m}\sum\limits_{i=1}^{m}(h_{\theta}(x^{i})-y^{i})^{2}$,我们将其中的差值平方改为一个$Cost$就是一个更为通用的模板化的代价函数:$J(\theta)=\frac{1}{m}\sum\limits_{i=1}^{m}Cost(h_{\theta}(x^{i}),y^{i})$。在逻辑回归中,我们可以将$Cost$定义为$Cost(h_{\theta}(x),y)=\begin{cases} -log_{10}(h_{\theta}(x)), & y=1 \\ -log_{10}(1-h_{\theta}(x)), & y=0 \end{cases}$,这个函数的图像如下所示:
可见,当$y=1$时,此函数在$h_{\theta}(x)=1$时值为$0$,而$h_{\theta}(x)$越接近$0$时其值越大,当$y=0$时相反。这样,这个函数就实现了误差函数的效果。当$y\in{0,1}$时,这个分段函数实际上可以写为$Cost(h_{\theta}(x),y)=-ylog_{10}(h_{\theta}(x))-(1-y)log_{10}(1-h_{\theta}(x))$(本质上是利用$y$和$1-y$是$0$还是$1$来控制使用哪个分支)
于是我们得到了逻辑回归的代价函数$J(\theta)=-\frac{1}{m}\sum\limits_{i=1}^{m}(y^{i}log_{10}(h_{\theta}(x^{i}))+(1-y^{i})log_{10}(1-h_{\theta}(x^{i})))$,可以证明,这个代价函数是凸性的,没有局部最小值
对这个代价函数求偏导得到$\frac{\partial}{\partial\theta_{j}}J_{\theta}=\frac{1}{m}\sum\limits_{i=1}^{m}((h_{\theta}(x^{i})-y^{i})x_{j}^{i})$,与线性回归时的形式很类似,但此时的$h_{\theta}(x^{i})$为$\frac{1}{1+e^{-\theta^{T}x^{i}}}$
于是梯度下降过程为:
$$\begin{aligned}
\theta_{j}&=\theta_{j}-\alpha\frac{\partial}{\partial\theta_{j}}J_{\theta} \\
&=\theta_{j}-\alpha\frac{1}{m}\sum\limits_{i=1}^{m}((h_{\theta}(x^{i})-y^{i})x_{j}^{i}) \\
&=\theta_{j}-\alpha\frac{1}{m}\sum\limits_{i=1}^{m}((\frac{1}{1+e^{-\theta^{T}x^{i}}}-y^{i})x_{j}^{i})
\end{aligned}$$
注意特征缩放在这个过程中同样重要
其他方案
除梯度下降法以外,还有其他方法来求最小的代价函数,这些算法更加复杂和优越,而且通常不需要人工选择学习率,通常比梯度下降算法要更加快速。这些算法有:共轭梯度(Conjugate Gradient),局部优化法(Broyden fletcher goldfarb shann,BFGS)和有限内存局部优化法(LBFGS)
多类别分类问题
考虑将逻辑回归用于解决标签种类更多的情况,比如$y\in{1,2,3,4}$。基本的思路是:对于每一个标签都训练出一个假设,用于预测这个输入符合这个标签的概率,之后对于一个输入,在所有假设中,选择输出的可能性最高的那个。具体到操作上,对于每一个标签$i$,将这个标签$i$设为1,其他标签设为$0$,训练得到一个假设$h_{\theta}^{i}$,之后对于需要预测的输入$x$,取$h_{\theta}^{i}(x)$最大的标签$i$作为预测结果。
正则化(Regularization)
过拟合(over-fitting)
参数过多时,可能训练出一个过于符合训练集,预测效果很差的假设,例如:

这种情况称为过拟合。解决过拟合主要有两个方法:
1、丢弃一些不能帮助我们正确预测的特征。可以是手工选择保留哪些特征,或者使用一些模型选择的算法来帮忙(例如PCA)
2、正则化。保留所有的特征,但是减少参数的大小(magnitude)
代价函数
考虑一个代价函数$J(\theta)=\frac{1}{m}\sum\limits_{i=1}^{m}Cost(h_{\theta}(x^{i}),y^{i})$,所谓正则化,就是对参数的大小进行惩罚,也就是增加当参数过大时的代价,具体来说,就是给每一项代价加上一个$\lambda\sum\limits_{j=1}^{n}\theta_{j}^{2}$,其中,$\lambda$称为正则化参数(Regularization Parameter),用来调节正则化的幅度。一般惯例而言,不对$\theta_{0}$进行惩罚
对于线性回归,代价函数可以写成$J(\theta)=\frac{1}{2m}(\sum\limits_{i=1}^{m}((h_{\theta}(x^{i})-y^{i})^{2})+\lambda\sum\limits_{j=1}^{n}\theta_{j}^{2})$,求导后得到梯度下降的过程:
$$\theta_{j}=\theta_{j}-\alpha(\frac{1}{m}\sum\limits_{i=1}^{m}(h_{\theta}(x^{i})-y^{i})x_{j}^{i})+\frac{\lambda}{m}\theta_{j})$$
同理,对于逻辑回归,代价函数可以写成$J(\theta)=-\frac{1}{m}(\sum\limits_{i=1}^{m}(ylog_{10}(h_{\theta}(x))+(1-y)log_{10}(1-h_{\theta}(x)))+\lambda\sum\limits_{j=1}^{n}\theta_{j}^{2})$,求导后形式上与上式相同:
$$\theta_{j}=\theta_{j}-\alpha(\frac{1}{m}\sum\limits_{i=1}^{m}(h_{\theta}(x^{i})-y^{i})x_{j}^{i})+\frac{\lambda}{m}\theta_{j})$$
注意对于$\theta_{0}$,因为不进行惩罚,所以按没有正则化的梯度下降式子进行
神经网络
(暂空,在深度学习课程再学)
训练方法
评估假设
将数据集分为训练集和测试集,例如取$70%$的数据作为训练集,其余数据作为测试集。在训练集上训练出一个假设后,在测试集上计算对应的代价函数,就可以得知这个假设的预测效果。对于逻辑回归,可以将代价函数是否预测正确转化为$0$和$1$的数值,从而得知预测正确的比例。
交叉验证
我们现在有若干个假设,要如何选择合适的假设?
可以将数据集分为训练集、交叉验证集和测试集,例如将$60%$的数据作为训练集,$20%$的数据作为交叉验证集,其余数据作为测试集。在训练集上训练出若干个假设,之后将这些假设在交叉验证集上计算对应的代价函数,选择其中误差最小的一个,作为结果,在测试集上进行验证。
诊断偏差和方差
当交叉验证集的误差和训练集的误差都很大时,模型可能是欠拟合的
当交叉验证集的误差很大,但训练集的误差很小时,模型可能是过拟合的
正则化
与交叉验证类似,先选定一系列$\lambda$,之后同样进行分别训练,在交叉验证集上选择误差最小的,在测试集上验证。
正则化同样有欠拟合和过拟合问题,$\lambda$过小时过拟合,$\lambda$过大时欠拟合
学习曲线
以训练集大小为横坐标,误差大小为纵坐标绘制的图表
如果训练集和交叉验证集的误差大小很快就收敛到一个较高的值,说明很可能欠拟合了
如果训练集和交叉验证集的误差大小一直不收敛,说明很可能过拟合了
常用方法
高偏差-欠拟合
高方差-过拟合
获得更多的训练样本——解决高方差
尝试减少特征的数量——解决高方差
尝试获得更多的特征——解决高偏差
尝试增加多项式特征——解决高偏差
尝试减少正则化程度λ——解决高偏差
尝试增加正则化程度λ——解决高方差
Day 3
支持向量机(SVM, Support Vector Machines)
定义
使用一个定义更简单的假设函数来近似替代逻辑回归中使用的S形函数$g(z)=\frac{1}{1+e^{-z}}$,具体如下图:
其中,$y=0$和$y=1$时,均使用两段式的直线,其中一条为常数$0$,另一条为斜线,斜率其实不是很重要。$y=1$时,此函数称为$Cost_{1}(z)$,其中$z=\theta^{T}x$,$y=0$时同理为$Cost_{0}(z)$
接下来,使用$Cost$函数替换原来的S形函数,得到$J(\theta)=\frac{1}{m}\sum\limits_{i=1}^{m}(y^{i}Cost_{1}(\theta^{T}x^{i})+(1-y^{i})Cost_{1}(\theta^{T}x^{i}))+\lambda\sum\limits_{j=1}^{n}\theta_{j}^{2}$
考虑到在最小化过程中,外面的常数$\frac{1}{m}$并不影响在哪取到最小值,因此可以去掉;之后考虑正则化项,我们可以令$C=\frac{1}{\lambda}$,那么代价函数可以改为$J(\theta)=C\sum\limits_{i=1}^{m}(y^{i}Cost_{1}(\theta^{T}x^{i})+(1-y^{i})Cost_{1}(\theta^{T}x^{i}))+\frac{1}{2}\sum\limits_{j=1}^{n}\theta_{j}^{2}$
最后,与逻辑回归不同,当训练完成后,对于得到的参数$\theta$,支持向量机用于预测的假设函数实际为$h_{\theta}(x)=\begin{cases} 1,& \theta^{T}x\ge0 \\ 0, & \theta^{T}x\lt0\end{cases}$,也就是直接给出预测,而非输出一个概率
大间距分类器
注意到假设函数中,两段直线的转折点并非在原点$x=0$处,也就是对于$y=1$,我们不但要求$\theta^{T}x$大于$0$,而是要超过$0$一定的距离(在这个例子中为$1$)。因此,它不仅需要区分开输入的样本,而且还相当于嵌入了一个额外的安全间距
考虑当$C$及其大时,正则化因子的影响相当于可以忽略,此时,我们实际上的目标变为寻找一个参数$\theta$,使得对于第$i$组样本,有$\begin{cases}\theta^{T}x^{i}\ge1, & y^{i}=1 \\ \theta^{T}x^{i}\le-1, & y^{i}=0\end{cases}$,此时代价函数(不考虑正则化因子的影响)为$0$
在这个情况下,求得的决策边界的特点是,距离所有样本都有一定的间距,如下图黑线:
显然,这样的决策边界(黑线)相对于间距小的边界(绿线、粉线)是更优的
把正则化因子的影响考虑进来,那么当我们能够找到这样的参数时,实际的优化目标变为使得$\frac{1}{2}\sum\limits_{j=1}^{n}\theta_{j}^{2}$最小,也就是问题变为$min\frac{1}{2}\sum\limits_{j=1}^{n}\theta_{j}^{2}\quad s.t.\begin{cases}\theta^{T}x^{i}\ge1, & if\quad y^{i}=1 \\ \theta^{T}x^{i}\le-1, & if\quad y^{i}=0\end{cases}$
实际上,支持向量机还有其他好处,例如对于以下情况:
当$C$足够大时,找到的决策边界可能类似于图中的粉线,受左下角的异常点的影响。而当$C$并不那么大时,正则化因子将会发挥作用,使得最终找到类似图中黑线的决策边界,甚至当数据不是线性可分时,也可以得到比较好的结果
$C$较大时,相当于$\lambda$较小,可能导致过拟合/高方差
$C$较小时,相当于$\lambda$较大,可能导致欠拟合/高偏差
核函数(Kernel)
用于扩展到非线性的分类问题,例如
一种构造思路是构造多维高次的新特征,如令$f_{1}=x_{1},f_{2}=x_{2},f_{3}=x_{1}x_{2},f_{4}=x_{1}^{2},f_{5}=x_{2}^{2}$等。而核函数是一种更好的构造新特征的方法
核函数的核心思路是,给定一个训练样本$x$,使用一些提前指定的地标(landmarks),通过原特征与地标的距离来获得新特征
此时,$f_{1}=similarity(x, l^{1})=e^{(-\frac{||x-l^{1}||^{2}}{2\sigma^{2}})}$
其中,$||x-l^{1}||^{2}=\sum\limits_{j=1}^{n}(x_{j}-l_{j}^(1))^{2}$,也就是训练样本$x$的所有特征和地标$l^{1}$之间的距离的和,$similarity(x, l^{1})$即为核函数,具体来说,这里的$e^{(-\frac{||x-l^{1}||^{2}}{2\sigma^{2}})}$是一个高斯核函数(Gaussian Kernel)
在这个定义下,如果一个样本$x$与某个地标$l$距离近似于$0$,则$e^{(-\frac{||x-l^{1}||^{2}}{2\sigma^{2}})}$近似于$e^{-0}=1$,而反之,则近似于$e^{-(某个很大的数字)}$也就是近似于$0$
在实际使用中,通常直接使用训练集作为地标,也就是当训练集中有$m$个样本,则$l^{i}=x^{i}$,并利用这些地标构造$m$个新特征,具体来说,对于第$i$个样本$x^{i}$,令$f_{j}^{i}=sim(x^{i},l^{j})$,特别的,$f_{0}^{i}=1$,$f_{i}^{i}=sim(x^{i},l^{i})=e^{0}=1$
之后,支持向量机的假设变为:给定输入$x$,计算新特征$f$,当$\theta^{T}f\ge0$时,预测$y=1$,反之预测$y=0$
现在代价函数为$J(\theta)=C\sum\limits_{i=1}^{m}(y^{i}Cost_{1}(\theta^{T}f^{i})+(1-y^{i})Cost_{1}(\theta^{T}f^{i}))+\frac{1}{2}\sum\limits_{j=1}^{m}\theta_{j}^{2}$,$\sum\limits_{j=1}^{m}\theta_{j}^{2}$可以写成$\theta^{T}\theta$,在实际计算中,常常使用$\theta^{T}M\theta$代替,其中$M$为一个根据选用的核函数而不同的矩阵。
$\sigma$较大时,可能导致低方差,高偏差
$\sigma$较小时,可能导致低偏差,高方差
聚类(Clustering)
无监督学习
给定的样本没有初始标定好的标签,需要算法去寻找内在的结构
能够将给定的样本分成若干个集合的算法,就称为聚类算法
K-均值算法(K-means Algorithm)
K-均值算法是最普及的聚类算法,其核心思想是:先指定$K$个随机的点,作为聚类的核心,之后对于每个样本,计算其距离哪个核心最近,按照距离最近的核心聚成一类;之后,计算每一类中样本特征的平均值,将对应的点移动到这个平均值形成的新位置,然后迭代这个过程,直到所有点都不再移动。
K-均值算法的优化目标,是使得所有点与其关联的聚类中心的距离之和最小。K-均值的代价函数,又称为畸变函数(Distortion function),为$J(c^{1},…,c^{m},\mu_{1},…,\mu_{K})=\frac{1}{m}\sum\limits_{i=1}^{m}||x^{i}-\mu_{c}^{i}||^{2}$,其中$\mu_{c}^{i}$代表与第$i$个样本$x^{i}$距离最近的中心点
K-均值算法的问题是,根据初始选择的随机点的不同,最后可能陷入局部最小值,如下图:
简单的解决办法是运行多次K-均值算法,每次重新随机选择初始值,然后选择结果最好的结果。这种方法在聚类数$K$较小($2-10$)时有效,但当$K$较大时效果可能一般。
对于如何选择聚类数$K$的问题,没有通用的方法,一般需要根据问题而选择。其中一个参考是肘部法则,核心思想是,在代价函数的结果随$K$增大而减小的过程中,选择一个恰当的拐点,在拐点之前,代价函数下降很快,而在拐点之后,代价函数下降较慢
降维
目的
压缩数据大小、加速运算、数据可视化
主成分分析(PCA, Principal Component Analysis)
假设我们现在计划将一个$n$维的特征减少到$k$维
主成分分析的核心思想是:找到一个$k$维的方向向量,使得所有样本数据投射到该向量时,投射的平均均方误差尽可能小——可以理解为从特征向量向该向量做垂线的长度尽可能小
第一步,将数据做均值归一化。对于每个特征,求出其在所有训练样本中的均值$\mu_{j}$,之后对于每个训练样本,令$x_{j}^{i}=x_{j}^{i}-\mu_{j}$。如果特征之间的数量级不同,还需要将其除以标准差$\sigma^{2}$
第二步,计算协方差矩阵(covariance matrix)。协方差矩阵$\sum=\frac{1}{m}\sum\limits_{i=1}^{n}(x^{i})(x^{i})^{T}$
第三步,求协方差矩阵$\sum$的特征向量(eigenvectors)。可以利用奇异值分解(SVD, singular value decomposition) 实现,将矩阵$\sigma$转为$U,S,V$三个结果矩阵。其中,$U$为一个$n\times n$维度的矩阵,每一列都是一个方向向量,具有与数据之间最小的投射误差。
第四步,从矩阵$U$中取出前$k$列,组成一个$n\times k$维度的矩阵,称为$U_{reduce}$,之后每个新的输入样本$z^{i}=U_{reduce}^{T}x^{i}$
PCA也可以作为一种压缩算法,因此可以将$k$维的向量还原回$n$维度。对于$n$维的特征$x$,压缩为$k$维的$z$后,还原的结果$x_{approx}$为$x_{approx}=U_{reduce}z$
如何选取$k$呢?我们知道,PCA的目标是最小化平均均方误差,也就是$\frac{1}{m}\sum\limits_{i=1}^{m}||x^{i}-x_{approx}^{i}||^{2}$,同时,训练集的方差为$\frac{1}{m}\sum\limits_{i=1}^{m}||x^{i}||^{2}$。我们希望平均均方误差和方差之间的比例尽量小,在这个基础上选择尽可能小的$k$值。一般而言,我们希望这个比例小于$1%$
因此可以从$k=1$开始,逐个计算PCA,直到这个比例小于$1%$为止
在使用SVD计算的情况下,有一个更好的方法,SVD返回的结果矩阵中,矩阵$S$是一个仅有对角线有值的$n\times n$维的矩阵,而我们所求的比例可以利用其中的值计算:$\frac{\frac{1}{m}\sum\limits_{i=1}^{m}||x^{i}-x_{approx}^{i}||^{2}}{\frac{1}{m}\sum\limits_{i=1}^{m}||x^{i}||^{2}}=1-\frac{\sum\limits_{i=1}^{k}S_{ii}}{\sum\limits_{i=1}^{n}S_{ii}}=\frac{\sum\limits_{i=k+1}^{n}S_{ii}}{\sum\limits_{i=1}^{n}S_{ii}}$,这样就可以快速计算出$k$了
压缩维度不建议作为默认使用的方法,最好是在保留所有维度的情况下遇到问题,例如运行太慢、占用内存太多等,再考虑降维操作