十、应用机器学习的建议(Advice for Applying Machine Learning)
10.1 决定下一步做什么
假如,得到学习参数以后,想要将假设函数放到一组新的样本上进行测试,该怎么办?
以下几种选择:
- 获得更多的训练样本——通常是有效的,但代价较大,下面的方法也可能有效,可考虑先采用下面的几种方法。
- 尝试减少特征的数量
- 尝试获得更多的特征
- 尝试增加多项式特征
- 尝试减少正则化程度 λ \lambda λ
- 尝试增加正则化程度 λ \lambda λ
我们不应该随机选择方法,而是运用一些机器学习诊断法来帮助我们知道哪个是有效的。
机器学习诊断法:这是一种测试法,你通过执行这种测试,能够深入了解某种算法到底是否有用。这通常也能够告诉你,要想改进一种算法的效果,什么样的尝试,才是有意义的。
10.2 评估一个假设
检验过拟合
将数据分成训练集和测试集,通常70%作为训练集。训练集和测试集均要含有各种类型的数据,通常我们要对数据进行“洗牌”,然后分成训练集和测试集。
-
对于线性回归模型,利用测试数据集来计算代价函数 J J J
-
对于逻辑回归模型,除了计算代价函数,还可以计算:
然后对结果求平均。
10.3 模型选择和交叉验证集
如果要在10个不同次数的二项式模型之间选择:
使用交叉验证集来帮助选择模型(60%训练集+20%交叉验证集+20%测试集)。
模型选择的方法为:
-
使用训练集训练出10个模型
-
用10个模型分别对交叉验证集计算得出交叉验证误差(代价函数的值)
-
选取代价函数值最小的模型
-
用步骤3中选出的模型对测试集计算得出推广误差(代价函数的值)
10.4 诊断偏差和方差
算法不理想——偏差比较大/方差比较大——欠拟合/过拟合
将训练集和交叉验证集的代价函数误差与多项式的次数绘制在一张图表上:
对于训练集,当 d d d 较小时,模型拟合程度更低,误差较大;随着 d d d 的增长,拟合程度提高,误差减小。
对于交叉验证集,当 d d d 较小时,模型拟合程度低,误差较大;但是随着 d d d 的增长,误差呈现先减小后增大的趋势,转折点是我们的模型开始过拟合训练数据集的时候。
训练集误差和交叉验证集误差近似时:偏差/欠拟合
交叉验证集误差远大于训练集误差时:方差/过拟合
10.5 正则化和偏差/方差
使用正则化防止过拟合时,要合理选择 λ \lambda λ的值。
选择的 λ \lambda λ 值,通常是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 0,0.01,0.02,0.04,0.08,0.15,0.32,0.64,1.28,2.56,5.12,10 0,0.01,0.02,0.04,0.08,0.15,0.32,0.64,1.28,2.56,5.12,10共12个)
选择 λ \lambda λ的方法为:
-
使用训练集训练出12个不同程度正则化的模型
-
用12个模型分别对交叉验证集计算的出交叉验证误差
-
选择得出交叉验证误差最小的模型
-
运用步骤3中选出模型对测试集计算得出推广误差,我们也可以同时将训练集和交叉验证集模型的代价函数误差与λ的值绘制在一张图表上:
- 当 λ \lambda λ 较小时,训练集误差较小(过拟合)而交叉验证集误差较大
- 随着 λ \lambda λ 的增加,训练集误差不断增加(欠拟合),而交叉验证集误差则是先减小后增加
10.6 学习曲线
使用学习曲线来判断某一个学习算法是否处于偏差、方差问题。学习曲线是将训练集误差和交叉验证集误差作为训练集样本数量( m m m)的函数绘制的图表。
10.7 决定下一步做什么
- 获得更多的训练样本——解决高方差
- 尝试减少特征的数量——解决高方差
- 尝试获得更多的特征——解决高偏差
- 尝试增加多项式特征——解决高偏差
- 尝试减少正则化程度λ——解决高偏差
- 尝试增加正则化程度λ——解决高方差
神经网络的方差和偏差
较小的神经网络——参数较少的情况——导致高偏差和欠拟合——计算代价较小
较大的神经网络——参数较多的情况——导致高方差和过拟合——计算代价较大——可以通过正则化调整
通常选择较大的神经网络并采用正则化处理会比采用较小的神经网络效果要好。
十一、机器学习系统的设计(Machine Learning System Design)
11.1 首先要做什么
当我们使用机器学习时,可以“头脑风暴”一下,想出一堆方法来试试。
后面几节介绍怎么在一堆不同的方法中,选取合适的那一个。
11.2 误差分析
构建一个学习算法的推荐方法为:
- 从一个简单的能快速实现的算法开始,实现该算法并用交叉验证集数据测试这个算法
- 绘制学习曲线,决定是增加更多数据,或者添加更多特征,还是其他选择
- 进行误差分析:人工检查交叉验证集中我们算法中产生预测误差的样本,看看这些样本是否有某种系统化的趋势
误差分析并不总能帮助我们判断应该采取怎样的行动。有时我们需要尝试不同的模型,然后进行比较,在模型比较时,用数值来判断哪一个模型更好更有效,通常我们是看交叉验证集的误差。
推荐在交叉验证集上实施误差分析,而不是在测试集上。
11.3 类偏斜的误差度量
类偏斜情况表现为我们的训练集中有非常多的同一种类的样本,只有很少或没有其他类的样本。
例如我们希望用算法来预测癌症是否是恶性的,在我们的训练集中,只有0.5%的实例是恶性肿瘤。假设我们编写一个非学习而来的算法,在所有情况下都预测肿瘤是良性的,那么误差只有0.5%。然而我们通过训练而得到的神经网络算法却有1%的误差。这时,误差的大小是不能视为评判算法效果的依据的。
- 正确肯定(True Positive,TP):预测为真,实际为真
- 正确否定(True Negative,TN):预测为假,实际为假
- 错误肯定(False Positive,FP):预测为真,实际为假
- 错误否定(False Negative,FN):预测为假,实际为真
查准率=TP/(TP+FP)
例,在所有我们预测有恶性肿瘤的病人中,实际上有恶性肿瘤的病人的百分比,越高越好。
查全率=TP/(TP+FN)
例,在所有实际上有恶性肿瘤的病人中,成功预测有恶性肿瘤的病人的百分比,越高越好。
11.4 查准率和查全率之间的权衡
查全率和查准率的权重可以调节
F β S c o r e : ( 1 + β 2 ) P R β 2 P + R {{F}_{\beta}}Score:(1+\beta^2)\frac{PR}{\beta^2P+R} FβScore:(1+β2)β2P+RPR
通常使用:
F 1 S c o r e : 2 P R P + R {{F}_{1}}Score:2\frac{PR}{P+R} F1Score:2P+RPR
11.5 机器学习的数据
“取得成功的人不是拥有最好算法的人,而是拥有最多数据的人”
十二、支持向量机(Support Vector Machines)
12.1 优化目标
在学习复杂的、非线性的方程时,提供了一种更为清晰、强大的方式。
代价函数的替换
逻辑回归的代价函数
SVM的代价函数
当 y = 1 y=1 y=1时,以1为分界点,两条直线
当 y = 0 y=0 y=0时,以-1为分界点,两条直线
公式的变化
首先是控制权重的 λ \lambda λ变成了 C C C,把权重加到了第一项上,其次,去掉了系数 1 m \frac{1}{m} m1(不会影响最终的最小值)
最终得代价函数
输出不同
直接给出最终的分类(0或1),而不是分别给出0和1的概率。
12.2 大边界的直观理解
逻辑回归中,只要代价函数的自变量大于等于0,我们就可以判定是正样本,只要代价函数的自变量小于0,我们就可以判定是负样本。
但是,在SVM中,我们不仅仅是要求大于0或小于0就可以,而是要大于1或小于-1。0和1/-1之间的距离叫做叫做“安全间距”。
这个间距就叫做“Margin”,赋予了SVM鲁棒性。
只有在C被设置的比较大的时候,margin才会大,鲁棒性才会好。
12.3 大边界分类背后的数学(选修)
向量内积
两个向量u,v的内积 = 向量u在向量v上的投影*向量v的范式 ,即 u T v = p ⋅ ∥ u ∥ {{u}^{T}}v=p\centerdot \left\| u \right\| uTv=p⋅∥u∥
因此, θ T x = p ⋅ ∥ θ ∥ \theta^{T}x=p\centerdot \left\| \theta \right\| θTx=p⋅∥θ∥,举例说明:
我们假设 θ 0 = 0 \theta_0=0 θ0=0,并且 θ \theta θ和 x x x只有两个分量1,2。
对于下面这个问题:
我们给出两种分类方式:
对于左边的分类,我们可以看到 x x x在 θ \theta θ上的投影非常短,也就是 p p p很小,而右边的则很大。 p p p变大了, θ \theta θ的范式就可以变小了。这就是支持向量机能够有效产生大间距分类的原因。
θ 0 = 0 θ_0=0 θ0=0的意思是我们决策界通过原点。
12.4 核函数1
使用高阶多项式来解决非线性问题
选定地标(landmarks) l ( 1 ) , l ( 2 ) , l ( 3 ) l^{(1)},l^{(2)},l^{(3)} l(1),l(2),l(3), x x x的特征y与地标之间的近似程度为新的特征 f f f
核函数:相似函数,有很多种
高斯核函数: f 1 = s i m i l a r i t y ( x , l ( 1 ) ) = e ( − ∥ x − l ( 1 ) ∥ 2 2 σ 2 ) {{f}_{1}}=similarity(x,{{l}^{(1)}})=e(-\frac{{{\left\| x-{{l}^{(1)}} \right\|}^{2}}}{2{{\sigma }^{2}}}) f1=similarity(x,l(1))=e(−2σ2∥x−l(1)∥2)
如下图所示, σ \sigma σ决定了 f f f值变化的速率。
在下图的例子中,当样本处于洋红色的点位置处,因为其离 l ( 1 ) l^{(1)} l(1)更近,但是离 l ( 2 ) l^{(2)} l(2)和 l ( 3 ) l^{(3)} l(3)较远,因此 f 1 f_1 f1接近1,而 f 2 f_2 f2, f 3 f_3 f3接近0。因此 h θ ( x ) = θ 0 + θ 1 f 1 + θ 2 f 2 + θ 1 f 3 > 0 h_θ(x)=θ_0+θ_1f_1+θ_2f_2+θ_1f_3>0 hθ(x)=θ0+θ1f1+θ2f2+θ1f3>0,因此预测 y = 1 y=1 y=1。同理可以求出,对于离 l ( 2 ) l^{(2)} l(2)较近的绿色点,也预测 y = 1 y=1 y=1,但是对于蓝绿色的点,因为其离三个地标都较远,预测 y = 0 y=0 y=0。
这样,图中红色的封闭曲线所表示的范围,便是我们依据一个单一的训练样本和我们选取的地标所得出的判定边界,在预测时,我们采用的特征不是训练样本本身的特征,而是通过核函数计算出的新特征 f 1 , f 2 , f 3 f_1,f_2,f_3 f1,f2,f3。
12.5 核函数2
如何选择地标?
l ( 1 ) = x ( 1 ) , l ( 2 ) = x ( 2 ) , . . . . . , l ( m ) = x ( m ) l^{(1)}=x^{(1)},l^{(2)}=x^{(2)},.....,l^{(m)}=x^{(m)} l(1)=x(1),l(2)=x(2),.....,l(m)=x(m)
好处在于:新特征是建立在原有特征与训练集中所有其他特征之间距离的基础之上的,即:
则代价函数变为:
m i n C ∑ i = 1 m [ y ( i ) c o s t 1 ( θ T f ( i ) ) + ( 1 − y ( i ) ) c o s t 0 ( θ T f ( i ) ) ] + 1 2 ∑ j = 1 n = m θ j 2 min C\sum\limits_{i=1}^{m}{[{{y}^{(i)}}cos {{t}_{1}}}( {{\theta }^{T}}{{f}^{(i)}})+(1-{{y}^{(i)}})cos {{t}_{0}}( {{\theta }^{T}}{{f}^{(i)}})]+\frac{1}{2}\sum\limits_{j=1}^{n=m}{\theta _{j}^{2}} minCi=1∑m[y(i)cost1(θTf(i))+(1−y(i))cost0(θTf(i))]+21j=1∑n=mθj2
在计算$\sum{_{j=1}^{n=m}}\theta _{j}{2}={{\theta}{T}}\theta 时 , 用 时,用 时,用θTMθ$代替$θTθ , 其 中 ,其中 ,其中M$是根据核函数选择的不同的一个矩阵。原因是为了简化计算。
参数影响
C = 1 / λ C=1/\lambda C=1/λ
C C C 较大时, λ \lambda λ较小,过拟合,高方差;
C C C 较小时, λ \lambda λ较大,欠拟合,高偏差;
σ \sigma σ较大时,可能会导致低方差,高偏差;
σ \sigma σ较小时,可能会导致低偏差,高方差。
12.6 使用支持向量机
其他核函数
多项式核函数(Polynomial Kernel)
字符串核函数(String kernel)
卡方核函数( chi-square kernel)
直方图交集核函数(histogram intersection kernel)
用SVM需要注意的
- 参数 C C C的选择
- 选择内核参数或你想要使用的相似函数,其中一个选择是:我们选择不需要任何内核参数,没有内核参数的理念,也叫线性核函数。
逻辑回归和SVM的选择
n n n为特征数, m m m为训练样本数。
(1)如果相较于 m m m而言, n n n要大许多,即训练集数据量不够支持我们训练一个复杂的非线性模型,我们选用逻辑回归模型或者不带核函数的支持向量机。
(2)如果 n n n较小,而且 m m m大小中等,例如 n n n在 1-1000 之间,而 m m m在10-10000之间,使用高斯核函数的支持向量机。
(3)如果 n n n较小,而 m m m较大,例如 n n n在1-1000之间,而 m m m大于50000,则使用支持向量机会非常慢,解决方案是创造、增加更多的特征,然后使用逻辑回归或不带核函数的支持向量机。
值得一提的是,神经网络在以上三种情况下都可能会有较好的表现,但是训练神经网络可能非常慢(当时),选择支持向量机的原因主要在于它的代价函数是凸函数,不存在局部最小值。
十三、聚类(Clustering)
13.1 无监督学习:简介
样本点没有标签
其中一种:将一系列点分为簇
应用:市场分割、社交网络分析、优化数据中心
13.2 K-均值算法
- 输入:簇数k,无标签的数据集
- 输出:数据集的分类结果
- 步骤:
- 随机选k个点,叫做“聚类中心”
- 对于数据集中的每个数据,按照距离分为k个簇
- 在每个簇中求一个中心点,作为新的聚类中心
- 重复步骤2、3,直至分类无变化
13.3 优化目标
K-均值的代价函数: J ( c ( 1 ) , . . . , c ( m ) , μ 1 , . . . , μ K ) = 1 m ∑ i = 1 m ∥ X ( i ) − μ c ( i ) ∥ 2 J(c^{(1)},...,c^{(m)},μ_1,...,μ_K)=\dfrac {1}{m}\sum^{m}_{i=1}\left\| X^{\left( i\right) }-\mu_{c^{(i)}}\right\| ^{2} J(c(1),...,c(m),μ1,...,μK)=m1∑i=1m∥∥X(i)−μc(i)∥∥2
迭代的过程一定会是每一次迭代都在减小代价函数,不然便是出现了错误。
13.4 随机初始化
随机初始化聚类中心点:
- 我们应该选择 K < m K<m K<m,即聚类中心点的个数要小于所有训练集实例的数量
- 随机选择 K K K个训练实例,然后令 K K K个聚类中心分别与这 K K K个训练实例相等
解决局部最小处:
多次运行K-均值算法,每一次都需要重新初始化,再比较多次运行的结果,选择代价函数最小的一个。
仅在K较小时(2-10)可行,K较大时不会有明显改善。
13.5 选择聚类数
肘部法则
随着聚类数K的增加,成本函数会呈现一个肘部的形状:
在达到“肘点”时,就是最合理的聚类数。
十四、降维(Dimensionality Reduction)
14.1 动机一:数据压缩
二维数据降到一维
三维数据降到二维
能够减少内存、时间复杂度
14.2 动机二:数据可视化
数据:
可视化结果:
存在问题:只负责减少维数,新产生的特征的意义需要有我们自己去发现。
14.3 主成分分析问题
主成分分析(PCA):最常见的降维算法。
找到一个方向向量(Vector direction),当把所有的数据都投射到该向量上时,投射平均均方误差能尽可能地小。
方向向量是一个经过原点的向量,而投射误差是从特征向量向该方向向量作垂线的长度。
14.4 主成分分析算法
PCA从n维减少到k维:
- 均值归一化,计算所有特征的均值,然后令 x j = x j − μ j x_j= x_j-μ_j xj=xj−μj,如果特征是在不同的数量级上,还需要除以标准差 σ 2 σ^2 σ2。
- 计算协方差矩阵
Σ
Σ
Σ:
∑ = 1 m ∑ i = 1 n ( x ( i ) ) ( x ( i ) ) T \sum=\dfrac {1}{m}\sum^{n}_{i=1}\left( x^{(i)}\right) \left( x^{(i)}\right) ^{T} ∑=m1∑i=1n(x(i))(x(i))T - 计算协方差矩阵的特征向量
14.5 选择主成分的数量
训练集的方差为: 1 m ∑ i = 1 m ∥ x ( i ) ∥ 2 \dfrac {1}{m}\sum^{m}_{i=1}\left\| x^{\left( i\right) }\right\| ^{2} m1∑i=1m∥∥x(i)∥∥2
在平均均方误差与训练方差比例尽可能小的情况下选择尽可能小的k值
1 m ∑ i = 1 m ∥ x ( i ) − x a p p r o x ( i ) ∥ 2 1 m ∑ i = 1 m ∥ x ( i ) ∥ 2 = 1 − Σ i = 1 k S i i Σ i = 1 m S i i ≤ 1 % \dfrac {\dfrac {1}{m}\sum^{m}_{i=1}\left\| x^{\left( i\right) }-x^{\left( i\right) }_{approx}\right\| ^{2}}{\dfrac {1}{m}\sum^{m}_{i=1}\left\| x^{(i)}\right\| ^{2}}=1-\dfrac {\Sigma^{k}_{i=1}S_{ii}}{\Sigma^{m}_{i=1}S_{ii}}\leq 1\% m1∑i=1m∥∥x(i)∥∥2m1∑i=1m∥∥∥x(i)−xapprox(i)∥∥∥2=1−Σi=1mSiiΣi=1kSii≤1%
这时候可以说, 99 % 99\% 99%的方差得以保留。
令k=1,然后逐个增加,一直到满足要求的k停止。
14.6 重建的压缩表示
PCA是把高维变成低维,重建就是把低维返回高维
方法是用矩阵的逆 z = U r e d u c e T x z=U^{T}_{reduce}x z=UreduceTx
左图到下图:PCA
下图到右图:重建原始数据
14.7 主成分分析法的应用建议
PCA仅能用在训练集上,而不能用在交叉验证集和测试集上。在训练集上使用PCA得到 U r e d u c e U_{reduce} Ureduce后,可以将 U r e d u c e U_{reduce} Ureduce应用在交叉验证集和测试集上。
不要使用PCA来减少过拟合,使用正则化更好。(因为PCA不使用y,可能会丢掉关键信息)
在使用PCA之前,先用原始方法试试,不行再用PCA。
十五、异常检测(Anomaly Detection)
15.1 问题的动机
用于非监督学习,单单从某个角度看,又类似于一些监督学习的问题。
举例说明:
你是一个飞机引擎制造商,飞机引擎从生产线上流出时,需要进行QA(质量检测),作为测试的一部分,你收集了飞机引擎的一些特征变量,比如:运转时产生的热量、引擎的振动。
这样就有了数据集,如果你有m个引擎,绘成图表:
假使目前图中的数据都是正常的,将来有一天生产了新的飞机引擎,想要判断是否需要进一步测试:
如果落在了蓝色圈内,则属于该组数据(正常)的可能性较高,而越是偏远的数据,属于该组数据的可能性越低。
这种方法叫做:密度估计。
15.2 高斯分布
x ∼ N ( μ , σ 2 ) x \sim N(\mu, \sigma^2) x∼N(μ,σ2),则其概率密度函数为: p ( x , μ , σ 2 ) = 1 2 π σ exp ( − ( x − μ ) 2 2 σ 2 ) p(x,\mu,\sigma^2)=\frac{1}{\sqrt{2\pi}\sigma}\exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right) p(x,μ,σ2)=2πσ1exp(−2σ2(x−μ)2)
μ = 1 m ∑ i = 1 m x ( i ) \mu=\frac{1}{m}\sum\limits_{i=1}^{m}x^{(i)} μ=m1i=1∑mx(i)
σ 2 = 1 m ∑ i = 1 m ( x ( i ) − μ ) 2 \sigma^2=\frac{1}{m}\sum\limits_{i=1}^{m}(x^{(i)}-\mu)^2 σ2=m1i=1∑m(x(i)−μ)2
注:机器学习中对于方差我们通常只除以 m m m而非统计学中的 ( m − 1 ) (m-1) (m−1)。实际使用中区别很小,因为训练集很大, m m m很大。
15.3 算法
针对给定的数据集 x ( 1 ) , x ( 2 ) , . . . , x ( m ) x^{(1)},x^{(2)},...,x^{(m)} x(1),x(2),...,x(m),计算每一个特征的 μ \mu μ 和 σ 2 \sigma^2 σ2 的估计值。
μ j = 1 m ∑ i = 1 m x j ( i ) \mu_j=\frac{1}{m}\sum\limits_{i=1}^{m}x_j^{(i)} μj=m1i=1∑mxj(i)
σ j 2 = 1 m ∑ i = 1 m ( x j ( i ) − μ j ) 2 \sigma_j^2=\frac{1}{m}\sum\limits_{i=1}^m(x_j^{(i)}-\mu_j)^2 σj2=m1i=1∑m(xj(i)−μj)2
获得了均值和方差以后,给定一个训练实例,就可以计算 p ( x ) p(x) p(x):
p ( x ) = ∏ j = 1 n p ( x j ; μ j , σ j 2 ) = ∏ j = 1 1 1 2 π σ j e x p ( − ( x j − μ j ) 2 2 σ j 2 ) p(x)=\prod\limits_{j=1}^np(x_j;\mu_j,\sigma_j^2)=\prod\limits_{j=1}^1\frac{1}{\sqrt{2\pi}\sigma_j}exp(-\frac{(x_j-\mu_j)^2}{2\sigma_j^2}) p(x)=j=1∏np(xj;μj,σj2)=j=1∏12πσj1exp(−2σj2(xj−μj)2)
当 p ( x ) < ε p(x) < \varepsilon p(x)<ε时,为异常。
15.4 开发和评价一个异常检测系统
开发一个异常检测系统时,我们从带标记的数据着手,从其中选择一部分正常数据用于构建训练集,然后用剩下的正常数据和异常数据混合的数据构成交叉验证集和测试集。
具体的评价方法:
-
根据测试集数据,我们估计特征的平均值和方差并构建 p ( x ) p(x) p(x)函数
-
对交叉检验集,我们尝试使用不同的 ε \varepsilon ε值作为阀值,并预测数据是否异常,根据 F 1 F1 F1值或者查准率与查全率的比例来选择 ε \varepsilon ε
-
选出 ε \varepsilon ε 后,针对测试集进行预测,计算异常检验系统的 F 1 F1 F1值,或者查准率与查全率之比
15.5 异常检测与监督学习对比
异常检测 | 监督学习 |
---|---|
非常少量的正向类(异常数据 y = 1 y=1 y=1), 大量的负向类( y = 0 y=0 y=0) | 同时有大量的正向类和负向类 |
许多不同种类的异常,非常难。根据非常 少量的正向类数据来训练算法。 | 有足够多的正向类实例,足够用于训练 算法,未来遇到的正向类实例可能与训练集中的非常近似。 |
未来遇到的异常可能与已掌握的异常、非常的不同。 | |
例如: 欺诈行为检测 生产(例如飞机引擎)检测数据中心的计算机运行状况 | 例如:邮件过滤器 天气预报 肿瘤分类 |
15.6 选择特征
异常检测假设特征符合高斯分布,如果数据的分布不是高斯分布,异常检测算法也能够工作,但是最好还是将数据转换成高斯分布,例如使用对数函数: x = l o g ( x + c ) x= log(x+c) x=log(x+c),其中 c c c 为非负常数; 或者 x = x c x=x^c x=xc, c c c为 0-1 之间的一个分数
误差分析:
一些异常的数据可能也会有较高的 p ( x ) p(x) p(x)值,因而被算法认为是正常的。这种情况下需要分析那些被错误预测为正常的数据,观察能否找出一些问题,然后可以通过增加新特征来更好地异常检测。
我们通常可以通过将一些相关的特征进行组合,来获得一些新的更好的特征(异常数据的该特征值异常地大或小)。
15.7 多元高斯分布(选修)
假设我们有两个相关特征,并且这两个特征的值域比较宽,一般的高斯模型可能不能够很好地识别异常数据。
洋红色的线(根据ε的不同其范围可大可小)是一般的高斯分布模型获得的判定边界,很明显绿色的X所代表的数据点很可能是异常值,但是其 p ( x ) p(x) p(x)值却仍然在正常范围内。多元高斯分布将创建像图中蓝色曲线所示的判定边界。
在一般的高斯分布模型中,我们计算
p
(
x
)
p(x)
p(x) 的方法是:
通过分别计算每个特征对应的几率然后将其累乘起来。
在多元高斯分布模型中,我们将构建特征的协方差矩阵,用所有的特征一起来计算 p ( x ) p(x) p(x)。
Σ = 1 m ∑ i = 1 m ( x ( i ) − μ ) ( x ( i ) − μ ) T = 1 m ( X − μ ) T ( X − μ ) \Sigma = \frac{1}{m}\sum_{i=1}^m(x^{(i)}-\mu)(x^{(i)}-\mu)^T=\frac{1}{m}(X-\mu)^T(X-\mu) Σ=m1∑i=1m(x(i)−μ)(x(i)−μ)T=m1(X−μ)T(X−μ)
p ( x ) = 1 ( 2 π ) n 2 ∣ Σ ∣ 1 2 e x p ( − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) ) p(x)=\frac{1}{(2\pi)^{\frac{n}{2}}|\Sigma|^{\frac{1}{2}}}exp\left(-\frac{1}{2}(x-\mu)^T\Sigma^{-1}(x-\mu)\right) p(x)=(2π)2n∣Σ∣211exp(−21(x−μ)TΣ−1(x−μ))
15.8 使用多元高斯分布进行异常检测(选修)
原始模型和多元高斯分布比较:
十六、推荐系统(Recommender Systems)
16.1 问题形式化
五部电影和四个用户,用户为电影打分
没有一个用户为所有电影打过分,构建一个算法来预测未打分电影的分数。
引入一些标记:
n u n_u nu 代表用户的数量
n m n_m nm 代表电影的数量
r ( i , j ) r(i, j) r(i,j) 如果用户j给电影 i i i 评过分则 r ( i , j ) = 1 r(i,j)=1 r(i,j)=1
y ( i , j ) y^{(i, j)} y(i,j) 代表用户 j j j 给电影 i i i的评分
m j m_j mj代表用户 j j j 评过分的电影的总数
16.2 基于内容的推荐系统
假设每个电影都有两个特征,如 x 1 x_1 x1代表电影的浪漫程度, x 2 x_2 x2 代表电影的动作程度。
假设采用线性回归模型,针对每一个用户都训练一个线性回归模型:
θ ( j ) \theta^{(j)} θ(j)用户 j j j 的参数向量, x ( i ) x^{(i)} x(i)电影 i i i 的特征向量
对于用户 j j j和电影 i i i,我们的预测评分为 ( θ ( j ) ) T x ( i ) (\theta^{(j)})^T x^{(i)} (θ(j))Tx(i)
代价函数:
min
θ
(
j
)
1
2
∑
i
:
r
(
i
,
j
)
=
1
(
(
θ
(
j
)
)
T
x
(
i
)
−
y
(
i
,
j
)
)
2
+
λ
2
(
θ
k
(
j
)
)
2
\min_{\theta (j)}\frac{1}{2}\sum_{i:r(i,j)=1}\left((\theta^{(j)})^Tx^{(i)}-y^{(i,j)}\right)^2+\frac{\lambda}{2}\left(\theta_{k}^{(j)}\right)^2
θ(j)min21i:r(i,j)=1∑((θ(j))Tx(i)−y(i,j))2+2λ(θk(j))2
为了学习所有用户,将代价函数求和:
min
θ
(
1
)
,
.
.
.
,
θ
(
n
u
)
1
2
∑
j
=
1
n
u
∑
i
:
r
(
i
,
j
)
=
1
(
(
θ
(
j
)
)
T
x
(
i
)
−
y
(
i
,
j
)
)
2
+
λ
2
∑
j
=
1
n
u
∑
k
=
1
n
(
θ
k
(
j
)
)
2
\min_{\theta^{(1)},...,\theta^{(n_u)}} \frac{1}{2}\sum_{j=1}^{n_u}\sum_{i:r(i,j)=1}\left((\theta^{(j)})^Tx^{(i)}-y^{(i,j)}\right)^2+\frac{\lambda}{2}\sum_{j=1}^{n_u}\sum_{k=1}^{n}(\theta_k^{(j)})^2
θ(1),...,θ(nu)min21j=1∑nui:r(i,j)=1∑((θ(j))Tx(i)−y(i,j))2+2λj=1∑nuk=1∑n(θk(j))2
如果使用梯度下降来求解的话,梯度下降的更新公式为:
θ
k
(
j
)
:
=
θ
k
(
j
)
−
α
∑
i
:
r
(
i
,
j
)
=
1
(
(
θ
(
j
)
)
T
x
(
i
)
−
y
(
i
,
j
)
)
x
k
(
i
)
(
for
k
=
0
)
\theta_k^{(j)}:=\theta_k^{(j)}-\alpha\sum_{i:r(i,j)=1}((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})x_{k}^{(i)} \quad (\text{for} \, k = 0)
θk(j):=θk(j)−αi:r(i,j)=1∑((θ(j))Tx(i)−y(i,j))xk(i)(fork=0)
θ k ( j ) : = θ k ( j ) − α ( ∑ i : r ( i , j ) = 1 ( ( θ ( j ) ) T x ( i ) − y ( i , j ) ) x k ( i ) + λ θ k ( j ) ) ( for k ≠ 0 ) \theta_k^{(j)}:=\theta_k^{(j)}-\alpha\left(\sum_{i:r(i,j)=1}((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})x_{k}^{(i)}+\lambda\theta_k^{(j)}\right) \quad (\text{for} \, k\neq 0) θk(j):=θk(j)−α⎝⎛i:r(i,j)=1∑((θ(j))Tx(i)−y(i,j))xk(i)+λθk(j)⎠⎞(fork=0)
16.3 协同过滤
上一节是已知电影的特征,求用户的参数。
相反,已知用户的参数,也可以求电影的特征。
m
i
n
x
(
1
)
,
.
.
.
,
x
(
n
m
)
1
2
∑
i
=
1
n
m
∑
j
r
(
i
,
j
)
=
1
(
(
θ
(
j
)
)
T
x
(
i
)
−
y
(
i
,
j
)
)
2
+
λ
2
∑
i
=
1
n
m
∑
k
=
1
n
(
x
k
(
i
)
)
2
\mathop{min}\limits_{x^{(1)},...,x^{(n_m)}}\frac{1}{2}\sum_{i=1}^{n_m}\sum_{j{r(i,j)=1}}((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})^2+\frac{\lambda}{2}\sum_{i=1}^{n_m}\sum_{k=1}^{n}(x_k^{(i)})^2
x(1),...,x(nm)min21i=1∑nmjr(i,j)=1∑((θ(j))Tx(i)−y(i,j))2+2λi=1∑nmk=1∑n(xk(i))2
但如果两个特征都没有,可以用协同过滤算法。
同时对
x
x
x和
θ
\theta
θ进行优化:
J
(
x
(
1
)
,
.
.
.
x
(
n
m
)
,
θ
(
1
)
,
.
.
.
,
θ
(
n
u
)
)
=
1
2
∑
(
i
:
j
)
:
r
(
i
,
j
)
=
1
(
(
θ
(
j
)
)
T
x
(
i
)
−
y
(
i
,
j
)
)
2
+
λ
2
∑
i
=
1
n
m
∑
k
=
1
n
(
x
k
(
j
)
)
2
+
λ
2
∑
j
=
1
n
u
∑
k
=
1
n
(
θ
k
(
j
)
)
2
J(x^{(1)},...x^{(n_m)},\theta^{(1)},...,\theta^{(n_u)})=\frac{1}{2}\sum_{(i:j):r(i,j)=1}((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})^2+\frac{\lambda}{2}\sum_{i=1}^{n_m}\sum_{k=1}^{n}(x_k^{(j)})^2+\frac{\lambda}{2}\sum_{j=1}^{n_u}\sum_{k=1}^{n}(\theta_k^{(j)})^2
J(x(1),...x(nm),θ(1),...,θ(nu))=21(i:j):r(i,j)=1∑((θ(j))Tx(i)−y(i,j))2+2λi=1∑nmk=1∑n(xk(j))2+2λj=1∑nuk=1∑n(θk(j))2
求偏导结果如下:
x
k
(
i
)
:
=
x
k
(
i
)
−
α
(
∑
j
:
r
(
i
,
j
)
=
1
(
(
θ
(
j
)
)
T
x
(
i
)
−
y
(
i
,
j
)
θ
k
j
+
λ
x
k
(
i
)
)
x_k^{(i)}:=x_k^{(i)}-\alpha\left(\sum_{j:r(i,j)=1}((\theta^{(j)})^Tx^{(i)}-y^{(i,j)}\theta_k^{j}+\lambda x_k^{(i)}\right)
xk(i):=xk(i)−α⎝⎛j:r(i,j)=1∑((θ(j))Tx(i)−y(i,j)θkj+λxk(i)⎠⎞
θ k ( i ) : = θ k ( i ) − α ( ∑ i : r ( i , j ) = 1 ( ( θ ( j ) ) T x ( i ) − y ( i , j ) x k ( i ) + λ θ k ( j ) ) \theta_k^{(i)}:=\theta_k^{(i)}-\alpha\left(\sum_{i:r(i,j)=1}((\theta^{(j)})^Tx^{(i)}-y^{(i,j)}x_k^{(i)}+\lambda \theta_k^{(j)}\right) θk(i):=θk(i)−α⎝⎛i:r(i,j)=1∑((θ(j))Tx(i)−y(i,j)xk(i)+λθk(j)⎠⎞
协同算法使用步骤:
- 初始 x ( 1 ) , x ( 1 ) , . . . x ( n m ) , θ ( 1 ) , θ ( 2 ) , . . . , θ ( n u ) x^{(1)},x^{(1)},...x^{(nm)},\ \theta^{(1)},\theta^{(2)},...,\theta^{(n_u)} x(1),x(1),...x(nm), θ(1),θ(2),...,θ(nu)为一些随机小值
- 使用梯度下降算法最小化代价函数
- 在训练完算法后,我们预测 ( θ ( j ) ) T x ( i ) (\theta^{(j)})^Tx^{(i)} (θ(j))Tx(i)为用户 j j j 给电影 i i i 的评分
学习之后的数据不总是能读懂的,但是可以用这些数据来给用户推荐电影。
16.4 协同过滤算法
协同过滤优化目标:
给定
x
(
1
)
,
.
.
.
,
x
(
n
m
)
x^{(1)},...,x^{(n_m)}
x(1),...,x(nm),估计
θ
(
1
)
,
.
.
.
,
θ
(
n
u
)
\theta^{(1)},...,\theta^{(n_u)}
θ(1),...,θ(nu):
min
θ
(
1
)
,
.
.
.
,
θ
(
n
u
)
1
2
∑
j
=
1
n
u
∑
i
:
r
(
i
,
j
)
=
1
(
(
θ
(
j
)
)
T
x
(
i
)
−
y
(
i
,
j
)
)
2
+
λ
2
∑
j
=
1
n
u
∑
k
=
1
n
(
θ
k
(
j
)
)
2
\min_{\theta^{(1)},...,\theta^{(n_u)}}\frac{1}{2}\sum_{j=1}^{n_u}\sum_{i:r(i,j)=1}((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})^2+\frac{\lambda}{2}\sum_{j=1}^{n_u}\sum_{k=1}^{n}(\theta_k^{(j)})^2
θ(1),...,θ(nu)min21j=1∑nui:r(i,j)=1∑((θ(j))Tx(i)−y(i,j))2+2λj=1∑nuk=1∑n(θk(j))2
给定
θ
(
1
)
,
.
.
.
,
θ
(
n
u
)
\theta^{(1)},...,\theta^{(n_u)}
θ(1),...,θ(nu),估计
x
(
1
)
,
.
.
.
,
x
(
n
m
)
x^{(1)},...,x^{(n_m)}
x(1),...,x(nm):
m
i
n
x
(
1
)
,
.
.
.
,
x
(
n
m
)
1
2
∑
i
=
1
n
m
∑
j
r
(
i
,
j
)
=
1
(
(
θ
(
j
)
)
T
x
(
i
)
−
y
(
i
,
j
)
)
2
+
λ
2
∑
i
=
1
n
m
∑
k
=
1
n
(
x
k
(
i
)
)
2
\mathop{min}\limits_{x^{(1)},...,x^{(n_m)}}\frac{1}{2}\sum_{i=1}^{n_m}\sum_{j{r(i,j)=1}}((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})^2+\frac{\lambda}{2}\sum_{i=1}^{n_m}\sum_{k=1}^{n}(x_k^{(i)})^2
x(1),...,x(nm)min21i=1∑nmjr(i,j)=1∑((θ(j))Tx(i)−y(i,j))2+2λi=1∑nmk=1∑n(xk(i))2
同时最小化
x
(
1
)
,
.
.
.
,
x
(
n
m
)
x^{(1)},...,x^{(n_m)}
x(1),...,x(nm)和
θ
(
1
)
,
.
.
.
,
θ
(
n
u
)
\theta^{(1)},...,\theta^{(n_u)}
θ(1),...,θ(nu):
J
(
x
(
1
)
,
.
.
.
,
x
(
n
m
)
,
θ
(
1
)
,
.
.
.
,
θ
(
n
u
)
)
=
1
2
∑
(
i
,
j
)
:
r
(
i
,
j
)
=
1
(
(
θ
(
j
)
)
T
x
(
i
)
−
y
(
i
,
j
)
)
2
+
λ
2
∑
i
=
1
n
m
∑
k
=
1
n
(
x
k
(
i
)
)
2
+
λ
2
∑
j
=
1
n
u
∑
k
=
1
n
(
θ
k
(
j
)
)
2
J(x^{(1)},...,x^{(n_m)},\theta^{(1)},...,\theta^{(n_u)})=\frac{1}{2}\sum_{(i,j):r(i,j)=1}((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})^2+\frac{\lambda}{2}\sum_{i=1}^{n_m}\sum_{k=1}^{n}(x_k^{(i)})^2+\frac{\lambda}{2}\sum_{j=1}^{n_u}\sum_{k=1}^{n}(\theta_k^{(j)})^2
J(x(1),...,x(nm),θ(1),...,θ(nu))=21(i,j):r(i,j)=1∑((θ(j))Tx(i)−y(i,j))2+2λi=1∑nmk=1∑n(xk(i))2+2λj=1∑nuk=1∑n(θk(j))2
min x ( 1 ) , . . . , x ( n m ) θ ( 1 ) , . . . , θ ( n u ) J ( x ( 1 ) , . . . , x ( n m ) , θ ( 1 ) , . . . , θ ( n u ) ) \min_{x^{(1)},...,x^{(n_m)} \\\ \theta^{(1)},...,\theta^{(n_u)}}J(x^{(1)},...,x^{(n_m)},\theta^{(1)},...,\theta^{(n_u)}) x(1),...,x(nm) θ(1),...,θ(nu)minJ(x(1),...,x(nm),θ(1),...,θ(nu))
16.5 向量化:低秩矩阵分解
电影和用户:
Movie | Alice (1) | Bob (2) | Carol (3) | Dave (4) |
---|---|---|---|---|
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 vs. karate | 0 | 0 | 5 | ? |
矩阵:
推出评分:
找到相关影片:
16.6 推行工作上的细节:均值归一化
如果新增了一个用户,没有对任何电影进行评分,如何给他推荐?
先对 Y Y Y矩阵进行均值归一化处理,每一个用户对电影的评分减去该电影评分的平均值。
使用新的 Y Y Y矩阵来训练算法。
如果要用该模型来预测,则需要重新加上均值,即 ( θ ( j ) ) T x ( i ) + μ i (\theta^{(j)})^T x^{(i)}+\mu_i (θ(j))Tx(i)+μi。
十七、大规模机器学习(Large Scale Machine Learning)
17.1 大型数据集的学习
迭代的代价很大,需要实现检查大规模的训练集是否有必要,也许少量训练集也能获得较好效果,可以绘制学习曲线来帮助判断。
17.2 随机梯度下降法
大规模数据集中,使用随机梯度下降来代替批量梯度下降。
代价函数为单个训练实例的代价:
c o s t ( θ , ( x ( i ) , y ( i ) ) ) = 1 2 ( h θ ( x ( i ) ) − y ( i ) ) 2 cost\left( \theta, \left( {x}^{(i)} , {y}^{(i)} \right) \right) = \frac{1}{2}\left( {h}_{\theta}\left({x}^{(i)}\right)-{y}^{{(i)}} \right)^{2} cost(θ,(x(i),y(i)))=21(hθ(x(i))−y(i))2
算法:
- 首先对训练集随机“洗牌”
- 每一次计算之后便更新参数 θ \theta θ,不需要首先将所有的训练集求和,在一次迭代未完成时,随机梯度下降便走出了很远
存在问题:不是每一步都是朝着正确的方向前进的,可能会在最小值点附近徘徊。
17.3 小批量梯度下降
介于批量下降算法和随机梯度下降算法之间,每计算 b b b次训练实例,便更新一次参数 θ \theta θ。
通常 b b b在2-100之间。
17.4 随机梯度下降收敛
随机梯度下降中,每一次更新 θ \theta θ之前都计算一次代价,经过 x x x此迭代后,求出 x x x次代价的平均值,然后绘制这些平均值和迭代次数之间的关系。
我们会得到一个颠簸不平但是不会明显减少的函数图像(蓝线),当我们增加学习率 α \alpha α时,函数会更加平缓,也许能看出下降趋势(红线),也许仍然不下降(粉线),那么模型本身可能存在错误。
如果绘制的图是上图所示,不断上升,我们可能会需要一个更小的学习率。
也可以令学习率随着迭代次数的增加而减少,随着不断靠近全局最小值点,通过学习率的减少,可以让算法收敛而不是在最小值点附近徘徊。不过通常不这样做,性价比不高。
17.5 在线学习
如果有一个有连续的用户流引发的连续的数据流,你能做的是使用一个在线学习机制,从数据流中学习用户的偏好,然后使用这些信息来优化一些网站的决策。
针对数据流而不是离线的静态数据集的学习。
比如一个物流网站,用户给起始点,网站给价格,用户选择接受与否。希望构建一个模型,来预测用户接受报价的可能性,特征就是:网站报价、起点、终点、用户信息,输出就是 P ( y = 1 ) P(y=1) P(y=1)。
在线学习与随机梯度下降类似,是对单一的实例进行学习,而非一个提前定义的训练集进行循环。
一旦一个数据的学习完成了,就可以丢弃该数据,好处是算法可以很好地适应用户的倾向性。
17.6 映射化简和数据并行
映射化简:将数据集分配给多台计算机,每一个计算机处理数据集的一个子集,然后将计算的结果汇总求和。
多核CPU并行处理矩阵运算,这也是向量化实现重要的原因。
十八、应用实例:图片文字识别(Application Example: Photo OCR)
18.1 问题描述和流程图
从一张给定的图片中识别文字
步骤:
- 文字侦测(Text detection)——将图片上的文字与其他环境对象分离开来
- 字符切分(Character segmentation)——将文字分割成一个个单一的字符
- 字符分类(Character classification)——确定每一个字符是什么
18.2 滑动窗口
滑动窗口是一项从图像中抽取对象的技术。
图片识别:
首先是用固定尺寸的图片来训练识别模型,然后用该尺寸在需识别的图片上进行剪裁,再将剪裁得到的切片交给模型,交给模型判断,然后继续滑动进行识别,直至全部检测完。
文字识别:
- 文字侦测:滑动窗口进行识别,识别完成后,将识别得出的重叠区域合并,然后通过宽高比再过滤一次文字区域。
- 字符切分:使用单个字符图片和两个字符相连的图片来训练模型,该模型能够将文字分割成一个个字符。分割完使用滑动窗口进行识别。
- 字符分类:使用神经网络、SVM或逻辑回归训练一个分类器。
18.3 获取大量数据和人工数据
1. 人工数据合成
2. 手动收集、标记数据
3. 众包
18.4 上限分析:流程中哪部分需要接下去做
流程图中每一部分的输出都是下一部分的输入,上限分析中,我们选取一部分,手工提供100%正确的输出结果,然后看应用的整体效果提升了多少。假使我们的例子中总体效果为72%的正确率。
如果我们令文字侦测部分输出的结果100%正确,发现系统的总体效果从72%提高到了89%。这意味着我们很可能会希望投入时间精力来提高我们的文字侦测部分。
接着我们手动选择数据,让字符切分输出的结果100%正确,发现系统的总体效果只提升了1%,这意味着,我们的字符切分部分可能已经足够好了。
不过通常不这样做,性价比不高。
17.5 在线学习
如果有一个有连续的用户流引发的连续的数据流,你能做的是使用一个在线学习机制,从数据流中学习用户的偏好,然后使用这些信息来优化一些网站的决策。
针对数据流而不是离线的静态数据集的学习。
比如一个物流网站,用户给起始点,网站给价格,用户选择接受与否。希望构建一个模型,来预测用户接受报价的可能性,特征就是:网站报价、起点、终点、用户信息,输出就是 P ( y = 1 ) P(y=1) P(y=1)。
在线学习与随机梯度下降类似,是对单一的实例进行学习,而非一个提前定义的训练集进行循环。
一旦一个数据的学习完成了,就可以丢弃该数据,好处是算法可以很好地适应用户的倾向性。
17.6 映射化简和数据并行
映射化简:将数据集分配给多台计算机,每一个计算机处理数据集的一个子集,然后将计算的结果汇总求和。
多核CPU并行处理矩阵运算,这也是向量化实现重要的原因。
十八、应用实例:图片文字识别(Application Example: Photo OCR)
18.1 问题描述和流程图
从一张给定的图片中识别文字
步骤:
- 文字侦测(Text detection)——将图片上的文字与其他环境对象分离开来
- 字符切分(Character segmentation)——将文字分割成一个个单一的字符
- 字符分类(Character classification)——确定每一个字符是什么
[外链图片转存中…(img-GJHPpe0e-1611447239291)]
18.2 滑动窗口
滑动窗口是一项从图像中抽取对象的技术。
图片识别:
首先是用固定尺寸的图片来训练识别模型,然后用该尺寸在需识别的图片上进行剪裁,再将剪裁得到的切片交给模型,交给模型判断,然后继续滑动进行识别,直至全部检测完。
文字识别:
- 文字侦测:滑动窗口进行识别,识别完成后,将识别得出的重叠区域合并,然后通过宽高比再过滤一次文字区域。
- 字符切分:使用单个字符图片和两个字符相连的图片来训练模型,该模型能够将文字分割成一个个字符。分割完使用滑动窗口进行识别。
- 字符分类:使用神经网络、SVM或逻辑回归训练一个分类器。
18.3 获取大量数据和人工数据
1. 人工数据合成
2. 手动收集、标记数据
3. 众包
18.4 上限分析:流程中哪部分需要接下去做
[外链图片转存中…(img-5LYPiqVM-1611447239293)]
流程图中每一部分的输出都是下一部分的输入,上限分析中,我们选取一部分,手工提供100%正确的输出结果,然后看应用的整体效果提升了多少。假使我们的例子中总体效果为72%的正确率。
如果我们令文字侦测部分输出的结果100%正确,发现系统的总体效果从72%提高到了89%。这意味着我们很可能会希望投入时间精力来提高我们的文字侦测部分。
接着我们手动选择数据,让字符切分输出的结果100%正确,发现系统的总体效果只提升了1%,这意味着,我们的字符切分部分可能已经足够好了。
最后我们手工选择数据,让字符分类输出的结果100%正确,系统的总体效果又提升了10%,这意味着我们可能也会应该投入更多的时间和精力来提高应用的总体表现。