机器学习算法按照“用途”可分为回归、分类、聚类、降维、模型选择和预处理,前面的几篇已经介绍完降维和预处理,从这篇开始更新回归、分类、聚类等算法。关于回归和分类的区别,请自行百度,这一篇介绍回归模型。
一个数据集有m个样本: X = { X 1 , X 2 , . . . , X m } X=\{X^{1},X^{2},...,X^{m}\} X={X1,X2,...,Xm}
对应有m个真实标签 Y = { Y 1 , Y 2 , . . . , Y m } Y=\{Y^{1},Y^{2},...,Y^{m}\} Y={Y1,Y2,...,Ym}
每个样本有n个属性:
X k = { x 1 , x 2 , . . . , x n } 表 示 第 k 个 样 本 X k 具 有 的 n 个 属 性 值 X^{k}=\{x_{1},x_{2},...,x_{n}\}表示第k个样本X^{k}具有的n个属性值 Xk={x1,x2,...,xn}表示第k个样本Xk具有的n个属性值
θ = { θ 1 , θ 2 , . . . , θ n } 表 示 每 个 属 性 值 对 应 的 系 数 \theta =\{\theta_{1},\theta_{2},...,\theta_{n}\}表示每个属性值对应的系数 θ={θ1,θ2,...,θn}表示每个属性值对应的系数
假设数据集中有m个样本,每个样本有n个属性值,那么对于每个样本(这里假设是第k个样本),定义其线性回归模型:
Y θ ( X k ) = θ 1 x 1 + θ 2 x 2 + . . . + θ n x n = ∑ i = 1 n θ i x i = θ T X k Y_{\theta}(X^{k}) =\theta_{1}x_{1}+\theta_{2}x_{2}+...+\theta_{n}x_{n}= \sum_{i =1}^{n}\theta_{i}x_{i}=\theta^{T}X^{k} Yθ(Xk)=θ1x1+θ2x2+...+θnxn=i=1∑nθixi=θTXk
这个预测值 Y θ ( X k ) Y_{\theta}(X_{k}) Yθ(Xk)很明显是基它的系数 θ \theta θ的,那么下面就开始推导 θ \theta θ
记 第 k 个 样 本 的 真 实 标 签 为 y k 记第k个样本的真实标签为y^{k} 记第k个样本的真实标签为yk
那么第k个样本的误差为:
ε k = y k − Y θ ( X k ) = y k − θ T X k (1) \varepsilon ^{k}=y^{k} - Y_{\theta}(X^{k})=y^{k} - \theta^{T}X^{k}\tag{1} εk=yk−Yθ(Xk)=yk−θTXk(1)
误差 ε ( k ) \varepsilon ^{(k)} ε(k)独立同分布,并且服从均值为0,方差为 σ \sigma σ的高斯分布
所以有:
P ( ε k ) = 1 ( 2 π ) σ e x p ( − ( ε k ) 2 2 σ 2 ) (2) P(\varepsilon^{k}) = \frac{1}{\sqrt{(2\pi)}\sigma}exp(- \frac{(\varepsilon^{k})^{2}}{2\sigma^{2}})\tag{2} P(εk)=(2π)σ1exp(−2σ2(εk)2)(2)
将(1)式带入(2)式,可得:
P ( y k ∣ X k ; θ ) = P ( y k − θ T X k ) = 1 ( 2 π ) σ e x p ( − ( y k − θ T X k ) 2 2 σ 2 ) (3) P(y^{k}|X^{k};\theta) =P(y^{k} - \theta^{T}X^{k})= \frac{1}{\sqrt{(2\pi)}\sigma}exp(- \frac{(y^{k} - \theta^{T}X^{k})^{2}}{2\sigma^{2}})\tag{3} P(yk∣Xk;θ)=P(yk−θTXk)=(2π)σ1exp(−2σ2(yk−θTXk)2)(3)
上式取似然函数:
L ( θ ) = ∏ k = 1 m P ( y k ∣ X k ; θ ) = ∏ k = 1 m 1 ( 2 π ) σ e x p ( − ( y k − θ T X k ) 2 2 σ 2 ) (4) L(\theta)=\prod_{k=1}^{m}P(y^{k}|X^{k};\theta)=\prod_{k=1}^{m} \frac{1}{\sqrt{(2\pi)}\sigma}exp(- \frac{(y^{k} - \theta^{T}X^{k})^{2}}{2\sigma^{2}})\tag{4} L(θ)=k=1∏mP(yk∣Xk;θ)=k=1∏m(2π)σ1exp(−2σ2(yk−θTXk)2)(4)
(4)式取对数:
l o g L ( θ ) = l o g ∏ k = 1 m 1 ( 2 π ) σ e x p ( − ( y ( k − θ T X k ) 2 2 σ 2 ) = ∑ k = 1 m l o g ( 1 ( 2 π ) σ e x p ( − ( y k − θ T X k ) 2 2 σ 2 ) ) = m l o g 1 2 π σ − 1 σ 2 ⋅ 1 2 ∑ k = 1 m ( y k − θ T X k ) (5) logL(\theta)=log\prod_{k=1}^{m} \frac{1}{\sqrt{(2\pi)}\sigma}exp(- \frac{(y^{(k} - \theta^{T}X^{k})^{2}}{2\sigma^{2}})\\=\sum_{k=1}^{m}log( \frac{1}{\sqrt{(2\pi)}\sigma}exp(- \frac{(y^{k} - \theta^{T}X^{k})^{2}}{2\sigma^{2}}))\\=mlog\frac{1}{\sqrt{2\pi}\sigma}-\frac{1}{\sigma^{2}}\cdot\frac{1}{2}\sum_{k=1}^{m}(y^{k}- \theta^{T}X^{k})\tag{5} logL(θ)=logk=1∏m(2π)σ1exp(−2σ2(y(k−θTXk)2)=k=1∑mlog((2π)σ1exp(−2σ2(yk−θTXk)2))=mlog2πσ1−σ21⋅21k=1∑m(yk−θTXk)(5)
记 l o g L ( θ ) = A + B , 其 中 A = m l o g 1 2 π σ , B = 1 σ 2 ⋅ 1 2 ∑ k = 1 m ( y k − θ T X k ) logL(\theta)=A+B,其中A=mlog\frac{1}{\sqrt{2\pi}\sigma},B=\frac{1}{\sigma^{2}}\cdot\frac{1}{2}\sum_{k=1}^{m}(y^{k}- \theta^{T}X^{k}) logL(θ)=A+B,其中A=mlog2πσ1,B=σ21⋅21∑k=1m(yk−θTXk)
为了使(5)式表示的对数似然最大,A是一个常数,所以让B越小越好,这样便得到优化目标:
J ( θ ) = 1 2 ∑ k = 1 m ( y k − θ T X k ) 2 = 1 2 ∥ [ y 1 − θ T X 1 y 2 − θ T X 2 . . . y k − θ T X k ] ∥ 2 = 1 2 ∥ [ y 1 y 2 . . . y k ] − θ T [ X 1 X 2 . . . X k ] ∥ 2 = 1 2 ∥ Y − X θ ∥ 2 = 1 2 ( Y − X θ ) T ( Y − X θ ) (6) J(\theta)=\frac{1}{2}\sum_{k=1}^{m}(y^{k}- \theta^{T}X^{k})^{2}=\frac{1}{2}\left\|\begin{bmatrix}y^{1}-\theta^{T}X^{1}\\y^{2}-\theta^{T}X^{2}\\...\\y^{k}-\theta^{T}X^{k} \end{bmatrix} \right \|^{2} =\frac{1}{2}\left\| \begin{bmatrix}y^{1}\\y^{2}\\...\\y^{k}\end{bmatrix}-\theta^{T}\begin{bmatrix}X^{1}\\X^{2}\\...\\X^{k}\end{bmatrix} \right\| ^{2} =\frac{1}{2}\left\|Y-X\theta \right\|^{2}=\\\frac{1}{2}(Y - X\theta)^{T}(Y -X\theta)\tag{6} J(θ)=21k=1∑m(yk−θTXk)2=21∥∥∥∥∥∥∥∥⎣⎢⎢⎡y1−θTX1y2−θTX2...yk−θTXk⎦⎥⎥⎤∥∥∥∥∥∥∥∥2=21∥∥∥∥∥∥∥∥⎣⎢⎢⎡y1y2...yk⎦⎥⎥⎤−θT⎣⎢⎢⎡X1X2...Xk⎦⎥⎥⎤∥∥∥∥∥∥∥∥2=21∥Y−Xθ∥2=21(Y−Xθ)T(Y−Xθ)(6)
(6)就是最小二乘,记住这个式子,因为后面的岭回归算法,只在这块不同
对(6)式求偏导:
▽ θ J ( θ ) = ▽ θ ( 1 2 ( Y − X θ ) T ( Y − X θ ) ) = ▽ θ ( 1 2 ( Y T − θ T X T ) ( Y − X θ ) ) = ▽ θ ( 1 2 ( Y T Y − θ T X T Y − Y T X θ + θ T X T X θ ) ) = 1 2 ( 2 X T X θ − X T Y − ( Y T X ) T ) = X T X θ − X T Y (7) \bigtriangledown _{\theta}J(\theta)=\bigtriangledown_{\theta}(\frac{1}{2}(Y-X\theta)^{T}(Y - X\theta))=\bigtriangledown_{\theta}(\frac{1}{2}(Y^{T}-\theta^{T}X^{T})(Y-X\theta))\\=\bigtriangledown_{\theta}(\frac{1}{2}(Y^{T}Y-\theta^{T}X^{T}Y-Y^{T}X\theta+\theta^{T}X^{T}X\theta))\\=\frac{1}{2}(2X^{T}X\theta-X^{T}Y-(Y^{T}X)^{T})=X^{T}X\theta-X^{T}Y\tag{7} ▽θJ(θ)=▽θ(21(Y−Xθ)T(Y−Xθ))=▽θ(21(YT−θTXT)(Y−Xθ))=▽θ(21(YTY−θTXTY−YTXθ+θTXTXθ))=21(2XTXθ−XTY−(YTX)T)=XTXθ−XTY(7)
令(7)等于0,即 ▽ θ J ( θ ) = 0 \bigtriangledown _{\theta}J(\theta)=0 ▽θJ(θ)=0,解得解析解
θ = ( X T X ) − 1 X T Y \theta = (X^{T}X)^{-1}X^{T}Y θ=(XTX)−1XTY
如此看来,为了得到最优的 θ \theta θ,需要求矩阵的逆,那么问题就来了,不是所有的矩阵都可以求逆的,所以需要使用梯度下降法得到 θ \theta θ。
在上面算法推导到最小二乘公式那块,依然对其求导,但使用梯度下降法(如果关于梯度下降法不清晰,请立即百度),更新参数 θ \theta θ:
优化目标:
J ( θ ) = 1 2 m ∑ k = 1 m ( y k − θ T X k ) 2 = 1 2 ( Y − θ T X ) T ( Y − θ T X ) (8) J(\theta)=\frac{1}{2m}\sum_{k=1}^{m}(y^{k}- \theta^{T}X^{k})^{2}=\frac{1}{2}(Y - \theta^{T}X)^{T}(Y -\theta^{T}X)\tag{8} J(θ)=2m1k=1∑m(yk−θTXk)2=21(Y−θTX)T(Y−θTX)(8)
注:(8)式与(6)式的不同
令 θ j 表 示 n 个 θ 中 第 j 个 θ ( n 个 属 性 一 定 有 n 个 θ , 这 块 要 想 明 白 , 不 然 算 法 实 现 有 点 费 劲 ) 令\theta_{j}表示n个\theta中第j个\theta(n个属性一定有n个\theta ,这块要想明白,不然算法实现有点费劲) 令θj表示n个θ中第j个θ(n个属性一定有n个θ,这块要想明白,不然算法实现有点费劲)
∂ J ( θ ) ∂ θ j = − 1 m ∑ k = 1 m ( y k − θ T X k ) X j k (9) \frac{\partial J(\theta)}{\partial \theta_{j}} =-\frac{1}{m}\sum_{k=1}^{m}(y^{k}-\theta^{T}X^{k})X_{j}^{k}\tag{9} ∂θj∂J(θ)=−m1k=1∑m(yk−θTXk)Xjk(9)
更新参数 θ j \theta_{j} θj:
θ j ‘ = θ j + α m ∑ k = 1 m ( y k − θ T X k ) X j k (10) \theta_{j}^{`}=\theta_{j}+\frac{\alpha}{m}\sum_{k=1}^{m}(y^{k}-\theta^{T}X^{k})X_{j}^{k}\tag{10} θj‘=θj+mαk=1∑m(yk−θTXk)Xjk(10)
批量梯度下降的缺点:由(10)(下图圈中部分)可以看出,每个参数更新一次,都会动用全部数据集,所以速度很慢;
优点:容易得到最优解。
更新参数 θ j \theta_{j} θj:
θ j ‘ = θ j + ( y k − θ T X k ) X j k (11) \theta_{j}^{`}=\theta_{j}+(y^{k}-\theta^{T}X^{k})X_{j}^{k}\tag{11} θj‘=θj+(yk−θTXk)Xjk(11)
优点:每次找一个样本,迭代速度很快
缺点:不一定每次都能朝着收敛的方向
批量随机下降很慢,随机梯度下降又很不准,那么综合这两个,提出小批量梯度下降:
θ j ‘ = θ j − α 1 n u m ∑ k = i i + n u m ( y k − θ T X k ) X j k (12) \theta_{j}^{`}=\theta_{j}-\alpha \frac{1}{num}\sum_{k=i}^{i+num}(y^{k}-\theta^{T}X^{k})X_{j}^{k}\tag{12} θj‘=θj−αnum1k=i∑i+num(yk−θTXk)Xjk(12)
α 是 更 新 步 长 , 学 习 率 ; n u m 是 需 要 指 定 的 需 要 选 择 参 加 计 算 的 样 本 个 数 , 一 般 取 2 的 指 数 , 64 、 128 等 \alpha是更新步长,学习率;num是需要指定的需要选择参加计算的样本个数,一般取2的指数,64、128等 α是更新步长,学习率;num是需要指定的需要选择参加计算的样本个数,一般取2的指数,64、128等
这样的话每次更新选择一小部分数据来算,实用!
使用求逆矩阵的方法:
def lwlr(testPoint,xArr,yArr,k=1.0):
xMat = mat(xArr); yMat = mat(yArr).T
m = shape(xMat)[0]
weights = mat(eye((m)))
for j in range(m): #next 2 lines create weights matrix
diffMat = testPoint - xMat[j,:] #
weights[j,j] = exp(diffMat*diffMat.T/(-2.0*k**2))
xTx = xMat.T * (weights * xMat)
if linalg.det(xTx) == 0.0:
print("This matrix is singular, cannot do inverse")
return
ws = xTx.I * (xMat.T * (weights * yMat))
return testPoint * ws