前言
这两天刷了四章视频,再来复盘一下:
- 第十一章————机器学习系统设计
- 第十二章————支持向量机
- 第十三章————K-Means算法
- 第十四章————主成分分析法
视频链接:[中英字幕]吴恩达机器学习系列课程
个人博客页:机器学习笔记——机器学习系统设计、支持向量机(SVM)、K-Means算法、主成分分析法(PCA) | Andrew的个人博客 (andreww1219.github.io)
一、机器学习系统设计
- 快速构建一个较为简单的模型,然后对模型进行验证,再决定下一步应该怎么优化,而不是过早地去优化。
- 在引入新的想法时,可对有无引入该想法地不同模型作验证,由单一指标确定引入新想法是否有效
- 在对偏斜类(或者 不对称类)作误差评估时,应该考虑到查准率(Percision, or P)和召回率(Recall, or R),定义 F = 2 P R P + R F = 2\frac{PR}{P+R} F=2P+RPR,通过比较 F F F值选择模型保证两者处于较高的水平
- 在模型低偏差的情况下,增大数据集保证低方差,能有效提高模型效能。
二、支持向量机(Support Vector Machine, or SVM)
1. 逻辑回归的局限性
在分类问题中,当两个类别之间间隔较大时,我们能够得到许多不同的决策边界将其正确划分。但是不同的决策边界之间也有优劣性:
当决策边界与样本点相隔很近时,新的样本稍微有点不同就可能导致模型对其错误分类,也就是模型的泛化性不强。
因此,我们的优化目标就是找到一个最优决策边界,使得样本点到决策边界的间隔最大。
为什么逻辑回归不能得到最优决策边界
我们知道逻辑回归的损失函数为
J ( θ ) = − 1 m ∑ i = 1 m y i ln h θ ( x ( i ) ) + ( 1 − y i ) ln ( 1 − h θ ( x ( i ) ) ) + λ ∑ j = 1 n θ j 2 J(\theta) = -\frac{1}{m} \sum_{i=1}^m y_i\ln h_\theta(x^{(i)}) + (1-y_i)\ln (1-h_\theta(x^{(i)})) + \lambda \sum_{j=1}^n \theta_j^2 J(θ)=−m1i=1∑myilnhθ(x(i))+(1−yi)ln(1−hθ(x(i)))+λj=1∑nθj2
当模型已经能够正确分类时,前一项几乎为0,我们的的优化目标就是最小化后一项,即最小化 λ ∑ j = 1 n θ j 2 = λ ∥ θ ∥ 2 \lambda \sum_{j=1}^n \theta_j^2 = \lambda \| \theta \|^2 λ∑j=1nθj2=λ∥θ∥2
在逻辑回归中,决策边界为 θ T x = 0 \theta^T x = 0 θTx=0,那么 θ = ( θ 0 , θ 1 , . . . , θ n ) \theta = (\theta_0, \theta_1, ..., \theta_n) θ=(θ0,θ1,...,θn)为决策边界的法向量。
二维的例子就是,当 θ = ( 0 , A , B ) \theta = (0, A, B) θ=(0,A,B),决策边界为直线 A x + B y = 0 Ax + By = 0 Ax+By=0时,直线方向向量 l = ( − B , A ) l = (-B, A) l=(−B,A)与向量 θ \theta θ互相垂直。
那么样本点到决策边界的间隔可表示为向量 x x x在向量 θ \theta θ上的投影的绝对值,记投影
p = ∥ x ∥ c o s < θ , x > p = \| x\| cos<\theta, x> p=∥x∥cos<θ,x>
其中 c o s < θ , x > cos<\theta, x> cos<θ,x>为向量 θ \theta θ和向量 x x x之间夹角的cos值。
决策边界的两边分别满足, θ T x ≥ 0 \theta^T x \ge 0 θTx≥0和 θ T x < 0 \theta^T x \lt 0 θTx<0,又 θ T x = ∥ θ ∥ ∥ x ∥ c o s < θ , x > \theta^T x = \| \theta \| \| x\| cos<\theta, x> θTx=∥θ∥∥x∥cos<θ,x>,得到
∥ θ ∥ p ≥ 0 \| \theta \| p\ge 0 ∥θ∥p≥0 和 ∥ θ ∥ p < 0 \| \theta \| p \lt 0 ∥θ∥p<0
这是 p p p和 ∥ θ ∥ \|\theta\| ∥θ∥之间的限定关系,可知 p p p的变化对 ∥ θ ∥ \|\theta\| ∥θ∥的减少没有什么帮助,于是逻辑回归自然就不会选择 p p p更大的结果,也就是不会选择最优决策边界。
2. SVM的引入
由1可知,如果改变 p p p和 ∥ θ ∥ \|\theta\| ∥θ∥之间的限定关系为
∥ θ ∥ p ≥ 1 \| \theta \| p\ge 1 ∥θ∥p≥1 和 ∥ θ ∥ p < − 1 \| \theta \| p \lt -1 ∥θ∥p<−1
为了使 ∥ θ ∥ \|\theta\| ∥θ∥减小,模型就会自动地去使 p p p的绝对值增大,即选择最优决策边界。
为了实现这一目标,我们需要在原先的逻辑回归上做些手脚,修改损失函数为:
J ( θ ) = C ∑ i = 1 m [ y ( i ) c o s t 1 ( θ T x ( i ) ) + ( 1 − y ( i ) ) c o s t 0 ( θ T x ( i ) ] + 1 2 ∑ j = 1 n θ j 2 J(\theta) = C\sum_{i=1}^m [y^{(i)} cost_1(\theta^T x^{(i)}) + (1-y^{(i)})cost_0(\theta^T x^{(i)}] + \frac{1}{2} \sum_{j=1}^n \theta_j^2 J(θ)=Ci=1∑m[y(i)cost1(θTx(i))+(1−y(i))cost0(θTx(i)]+21j=1∑nθj2
其中,
c o s t 1 ( θ T x ( i ) ) 与 − ln h θ ( x ( i ) ) cost_1(\theta^T x^{(i)}) 与 -\ln h_\theta(x^{(i)}) cost1(θTx(i))与−lnhθ(x(i))相似,但是在自变量 z z z属于 ( 1 , + ∞ ) (1,+\infty) (1,+∞)时, c o s t 1 ( z ) cost_1(z) cost1(z)的值为0
c o s t 0 ( θ T x ( i ) ) 与 − ln ( 1 − h θ ( x ( i ) ) ) cost_0(\theta^T x^{(i)}) 与 -\ln (1-h_\theta(x^{(i)})) cost0(θTx(i))与−ln(1−hθ(x(i)))相似,但是在自变量 z z z属于 ( − ∞ , − 1 ) (-\infty, -1) (−∞,−1)时, c o s t 0 ( z ) cost_0(z) cost0(z)的值为0
也就是说,当 y = 1 y = 1 y=1时,我们希望 θ T x ( i ) > = 1 \theta^T x^{(i)} >= 1 θTx(i)>=1,当 y = 0 y = 0 y=0时,我们希望 θ T x ( i ) < − 1 \theta^T x^{(i)} < -1 θTx(i)<−1
这就是SVM之所以被叫做大间隔分类器的数学原理
3. 核函数(Kernel Function)
参考文献:详解SVM模型——核函数是怎么回事 - 知乎 (zhihu.com)
在实际问题中,我们在已有的维度无法找到一个线性的边界将两个类别划分开。所以我们需要通过一个映射关系,将低维的数据映射到高维,再从高维找到一个超平面将不同类别的样本划分。
所以核函数就是为了得到非线性决策边界,实现低维到高维映射关系且不增加运算的复杂度的函数。也有译作Kernel Trick,所有核函数本质是一种运算技巧。
一个使用频率很高的核函数是高斯核: s i m i l a r i t y ( x i , x j ) = e x p ( − ∥ x i − x j ∥ 2 2 σ 2 ) similarity(x_i, x_j) = exp(- \frac{\|x_i - x_j\|^2}{2\sigma^2}) similarity(xi,xj)=exp(−2σ2∥xi−xj∥2)
由于SVM的数学性质(未考究),把核函数与SVM结合在一起的表现特别出色。
例如,将高斯核与SVM相结合:
定义特征 f = ( f 1 , f 2 , . . . , f m ) T f = (f_1, f_2, ..., f_m)^T f=(f1,f2,...,fm)T取代损失函数中的 x x x,其中 f j = s i m i l a r i t y ( x , l ( j ) ) f_j = similarity(x, l^{(j)}) fj=similarity(x,l(j)), l ( j ) l^{(j)} l(j)为样本中的某一点,那么有
J ( θ ) = 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 θ j 2 J(\theta) = C\sum_{i=1}^m [y^{(i)} cost_1(\theta^T f^{(i)}) + (1-y^{(i)})cost_0(\theta^T f^{(i)}] + \frac{1}{2} \sum_{j=1}^n \theta_j^2 J(θ)=Ci=1∑m[y(i)cost1(θTf(i))+(1−y(i))cost0(θTf(i)]+21j=1∑nθj2
呜呜写不下去了,不知道SVM是怎么求解的
三、K-Means算法
1. 问题描述
已知我们要将没有标签的数据分为 K K K类,要怎么分才最合理?
设每个
c
i
c^{i}
ci为样本点
x
(
i
)
x^{(i)}
x(i)被分配到的聚类的下标
每个聚类中心的坐标为
μ
k
\mu_k
μk
则
μ
c
(
i
)
\mu_{c^{(i)}}
μc(i)为样本点
x
(
i
)
x^{(i)}
x(i)被分配到的聚类的坐标
我们可以用样本点到其分配到的聚类中心的距离作为衡量分类合理性的标准,将问题转化为
如何最小化损失函数 J ( c ( 1 ) , . . . , c ( m ) , μ 1 , . . . , μ K ) = 1 m ∑ i = 1 m ∥ x ( i ) − μ c ( i ) ∥ 2 J(c^{(1)}, ..., c^{(m)}, \mu_1, ..., \mu_K) = \frac{1}{m} \sum_{i=1}^m \| x^{(i)} - \mu_{c^{(i)}}\|^2 J(c(1),...,c(m),μ1,...,μK)=m1∑i=1m∥x(i)−μc(i)∥2
我们也将它叫作失真代价函数(Cost Distortion)
2. 迭代过程
- 修改每一个 c ( i ) c^{(i)} c(i)为离x ( i ) ^{(i)} (i)最近的聚类中心的下标, 1 ≤ i ≤ m 1\le i \le m 1≤i≤m
- 修改每一个 μ k \mu_k μk为聚类 k k k中所有点的均值, 1 ≤ k ≤ K 1\le k \le K 1≤k≤K
- 重复以上两个步骤直到聚类中心不变
3. 优化方法
3.1 随机初始化
不同的初始化结果会导致不同的聚类结果,我们可以选择其中损失函数最小的值作为最终的结果
进行一定次数:随机初始化聚类中心为 m m m个点中的任意 k k k点
- 修改每一个 c ( i ) c^{(i)} c(i)为离x ( i ) ^{(i)} (i)最近的聚类中心的下标, 1 ≤ i ≤ m 1\le i \le m 1≤i≤m
- 修改每一个 μ k \mu_k μk为聚类 k k k中所有点的均值, 1 ≤ k ≤ K 1\le k \le K 1≤k≤K
- 重复1、2步骤直到聚类中心不变
- 计算 J ( c ( 1 ) , . . . , c ( m ) , μ 1 , . . . , μ K ) = 1 m ∑ i = 1 m ∥ x ( i ) − μ c ( i ) ∥ 2 J(c^{(1)}, ..., c^{(m)}, \mu_1, ..., \mu_K) = \frac{1}{m} \sum_{i=1}^m \| x^{(i)} - \mu_{c^{(i)}}\|^2 J(c(1),...,c(m),μ1,...,μK)=m1∑i=1m∥x(i)−μc(i)∥2
从中找出 J J J值最小的情况作为结果
3.2 选择聚类数量
- 手肘法: 画出聚类数量K与失真代价函数J的关系曲线,选择开始变平缓的第一个点
- 当手肘法不管用时,根据实际业务需求选择K的值
四、主成分分析法(Priciple Component Analysis, or PCA)
1. 问题描述
在使用原始数据需要的内存和计算量过于庞大以至于模型工作效率低的情况下,我们考虑对高维的数据 x ( i ) x^{(i)} x(i)压缩为低维 z ( i ) z^{(i)} z(i):过 x ( i ) x^{(i)} x(i)作一低维的超平面,将 x ( i ) x^{(i)} x(i)投影到超平面上得到对应 z ( i ) z^{(i)} z(i)。
对数据压缩应该尽可能保留原来的信息, x ( i ) x^{(i)} x(i)距超平面的距离越远将丢失越多的信息。将均值点与 x ( i ) x^{(i)} x(i)连线,为使 x ( i ) x^{(i)} x(i)距超平面的距离减小,那么 x ( i ) x^{(i)} x(i)到超平面的垂足到均值点的距离应该更大,也就是要保证投影后的数据方差更大。
于是我们的优化目标为:找到一个新的坐标系,使得在新坐标系下数据的方差最大,为了减少数据的冗余,我们希望数据在每个方向上都是不相关的,也就是协方差为零。
2. 数据压缩
2.1 数据预处理
- 为了方便求协方差矩阵,我们将所有数据减去其均值
- 由于我们是用方差度量优化结果,为了防止方差较大的特征主导度量结果,应该做特征缩放。
2.2 PCA算法
参考:【机器学习】降维——PCA(非常详细) - 知乎 (zhihu.com)
参考:怎么通俗地解释svd奇异值分解以及作用? - 石溪的回答 - 知乎
已知原有的数据
X
X
X为
n
×
m
n \times m
n×m维的矩阵,其协方差矩阵
C
=
1
m
X
X
T
C = \frac{1}{m} XX^T
C=m1XXT
求压缩后的矩阵
Y
=
P
X
Y=PX
Y=PX,且
Y
Y
Y的协方差矩阵
D
D
D是对角矩阵(协方差为零),且对角线的元素尽可能大(方差最大化)
则有 D = 1 m ( P X ) ( P X ) T D = \frac{1}{m} (PX)(PX)^T D=m1(PX)(PX)T
D = 1 m P X X T P T D = \frac{1}{m} PX X^T P^T D=m1PXXTPT
D = P 1 m X X T P T = P C P T D = P \frac{1}{m} X X^T P^T = PCP^T D=Pm1XXTPT=PCPT
又协方差矩阵 C C C是对称矩阵,设 E E E为 C C C的特征向量组成的矩阵, Λ \Lambda Λ为以特征值为对角线的矩阵,则有
C E = E Λ CE = E\Lambda CE=EΛ
由于对称矩阵的不同特征值对应的特征向量互相正交,则有 E T = E − 1 E^T = E^{-1} ET=E−1,得
E T C E = Λ E^T CE = \Lambda ETCE=Λ
我们发现矩阵 Λ \Lambda Λ正是我们需要的 D D D,而取 E T E^T ET的前 k k k列正是我们需要的变换 P P P
另一种方法是对
X
X
X求奇异值分解:
[
U
,
S
,
V
]
=
s
v
d
(
X
)
[U, S, V] = svd(X)
[U,S,V]=svd(X),其中,
U
U
U表示变换后新坐标系的标准正交向量,其前
k
k
k列的转置正是我们需要的变换
P
P
P,
奇异值矩阵
S
S
S相当于上述矩阵
Λ
\Lambda
Λ的开方,
V
V
V表示变换前坐标系的标准正交向量的转置
3. 主成分数量选择
主成分数量越少,丢失的信息量越多。保留的信息量可用2.2中奇异值分解得到的矩阵 S S S表示:
∑ j = 1 k S j , j ∑ i = 1 n S i , i \frac{\sum_{j=1}^k S_{j, j}} {\sum_{i=1}^n S_{i, i}} ∑i=1nSi,i∑j=1kSj,j
可人为要求该值大于一定比例,如0.99,0.95等,确保数据压缩能保留足够多的信息