简单线性模型及局部加权线性模型的基本原理和python实现(参数估计的两个基本角度:几何直观和概率直观。函数最值问题的两大基本算法:梯度方法与迭代方法)


线性模型是什么?

线性模型是监督学习的各类学习算法最基本的一类学习算法,所谓线性值得是模型的输出与数据的各个属性值之间的关系是线性的。线性是我们最擅长处理的(无论是工程实现还是数学分析),同时利用线性进行拓展,我们还可以处理很多非线性的情况。
简单线性模型假设我们的样本空间χ\chiχ与参数θ\thetaθ之间的关系是线性的,如下所示:
y^=θ0x0+θ1x1+...+θnxn\hat{y} = \theta_0x_0+\theta_1x_1+...+\theta_nx_ny^​=θ0​x0​+θ1​x1​+...+θn​xn​记之为y^=hθ(x)=θTx\hat{y} = h_{\theta}(x) = \theta^Txy^​=hθ​(x)=θTx,简单线性模型是后面我们将学习的广义线性模型的基础。

求解参数θ\thetaθ的两种角度:几何直观和概率直观

估计上述参数θ\thetaθ的方式,主要有两种,一种是从几何直观,一种是从概率直观。它们分别是:

  • 最小二乘方法 (Ordinary Squart Least, OSL)
  • 极大似然估计 (Maximum Liklihood Estimate, MLE)
  1. 最小二乘方法从几何的角度出发,认为拟合值与原值之间的平方误差和应该最小化,因此我们定义了一个损失函数(cost function) 如下:
    J(θ)=12∑i=1m[hθ(x(i))−y(i)]2J(\theta) = \frac{1}{2}\sum_{i=1}^{m}[h_{\theta}(x^{(i)})-y^{(i)}]^2J(θ)=21​i=1∑m​[hθ​(x(i))−y(i)]2 参数θ\thetaθ需要使得损失函数最小化

  2. 极大似然估计是从概率的角度出发,认为样本数据既然发生了,其背后的概率应该最大化。因此我们首先对模型进行概率解释,即
    y=θ0x0+θ1x1+...+θnxn+ϵy = \theta_0x_0+\theta_1x_1+...+\theta_nx_n + \epsilony=θ0​x0​+θ1​x1​+...+θn​xn​+ϵ然后我们做一个比较合理的假设,即误差的零均值同方差正态假设,因此有
    ϵ∼N(0,σ2)\epsilon \sim{N(0,\sigma^2)}ϵ∼N(0,σ2)所以标签值yyy的分布为y∼N(θTx,σ2)y\sim{N(\theta^Tx,\sigma^2)}y∼N(θTx,σ2)因此整个样本数据的概率似然函数为
    L(θ)=∑i=1m12πσexp(−(y(i)−hθ(x(i)))2σ2)L(\theta) = \sum_{i=1}^{m}\frac{1}{\sqrt{2\pi}\sigma}exp(-\frac{(y^{(i)}-h_{\theta}(x^{(i)}))^2}{\sigma^2})L(θ)=i=1∑m​2π​σ1​exp(−σ2(y(i)−hθ​(x(i)))2​)那么参数θ\thetaθ需要使得似然函数最大化。

以上两种参数估计的方法最终都归结为某个函数形式的最值问题,下面我们讨论如何求解非线性函数的最值。

函数最值问题的两大数值算法

  • 梯度方法

    • 批量梯度下降(Batch Gradient Descent, BGD)
    • 随机梯度下降(Stochastic Gradient Descent, SGD)
  • 迭代方法
    • 一般迭代法
    • 牛顿迭代法

梯度方法

梯度是微积分中概念。在映射f:Rn→Rf:R^n \rightarrow Rf:Rn→R中,它是一个nnn维向量,其方向是该点处切平面增长最快的方向,在微分中,因为我们用切平面的增量近似函数的增量,所以梯度的方向也是该点函数增长最快的方向。从而利用自变量空间中关于fff的梯度场,就可以保证达到某个极值,在凸性的保证,还可以保证其达到最值。

迭代方法

我们详细介绍迭代方法。首先我们知道最值点的必要条件是稳定点,即导数为0。因此我们实际上需要一个寻找函数零点的方法。一般来讲,迭代方法可以分为两类:

  • 直接法(连续函数的中值定理)
  • 间接法

直接法有我们熟悉的二分法等,我们略去不谈。这里要重点介绍间接法。我们首先谈迭代法的一般理论,然后再谈广泛使用的牛顿迭代法及其多元形式。
在一维情况下,由f(x)=0f(x)=0f(x)=0可以尝试得到:
x=φ(x)x=\varphi(x)x=φ(x)当∣φ′(x)∣&lt;1\mid \varphi^{'}(x)\mid &lt; 1∣φ′(x)∣<1在区间[a,b][a,b][a,b]成立时,则可以证明在由迭代式xn=φ(xn−1)x_{n}=\varphi(x_{n-1})xn​=φ(xn−1​)产生的迭代序列{xn}\{x_{n}\}{xn​}收敛于x∗x^*x∗,其中x0∈[a,b]x_0\in[a,b]x0​∈[a,b]。从而有
lim⁡n→∞xn=lim⁡n→∞φ(xn−1)=x∗\lim_{n\to\infty}x_{n}=\lim_{n\to\infty}\varphi(x_{n-1})=x^*n→∞lim​xn​=n→∞lim​φ(xn−1​)=x∗
现在我们讨论牛顿迭代法。其基本思想在于做切线不断逼近零点。假设我们面对的函数为f(x)f(x)f(x),则在初始值x0x_0x0​处的切线为y−y0=f′(x0)(x−x0)y-y_0 = f^{'}(x_0)(x-x_0)y−y0​=f′(x0​)(x−x0​)令y=0y=0y=0得到x1x_1x1​,从而不断迭代逼近真实值,其迭代式为
xn=φ(xn−1)=xn−1−f(xn−1)f′(xn−1)x_n = \varphi(x_{n-1}) = x_{n-1}-\frac{f(x_{n-1})}{f^{'}(x_{n-1})}xn​=φ(xn−1​)=xn−1​−f′(xn−1​)f(xn−1​)​当求最值问题时,则迭代式为
xn=xn−1−f′(xn−1)f′′(xn−1)x_n = x_{n-1}-\frac{f_{'}(x_{n-1})}{f^{''}(x_{n-1})}xn​=xn−1​−f′′(xn−1​)f′​(xn−1​)​牛顿迭代法在一定的条件下可以证明收敛 (参见《计算方法》,凹凸性),其收敛条件一般采用事后判断法,即
∣xn−xn−1∣&lt;ϵ\mid x_{n}-x_{n-1}\mid &lt; \epsilon∣xn​−xn−1​∣<ϵ当自变量为多元情况的时候,其迭代式的形式仍是一致的。根据多元微积分,此时的一阶偏导数为一个向量,即梯度,记为▽xf(x)\bigtriangledown_{x}f(x)▽x​f(x),二阶偏导数为一个矩阵,即海森矩阵(Hessian)HHH,每一个元素为Hi,j=∂2f(x)∂xi∂xjH_{i,j} = \frac{\partial^2{f(x)}}{\partial{x_{i}}\partial{x_{j}}}Hi,j​=∂xi​∂xj​∂2f(x)​因此多元情况下的牛顿迭代法的迭代式为
xn=φ(xn−1)=xn−1−H−1▽xf(x)x_n = \varphi(x_{n-1}) = x_{n-1}-H^{-1}\bigtriangledown_{x}f(x)xn​=φ(xn−1​)=xn−1​−H−1▽x​f(x)注:一般情况下牛顿迭代法会比梯度下降迭代次数更少,收敛速度更快。然而每一次迭代牛顿迭代法需要需要计算的量更多,因为其中有一个海森矩阵。但只要维度n不是很大,总体上牛顿迭代的速度更快。

Newton’s method typically enjoys faster convergence than (batch) gra-dient descent, and requires many fewer iterations to get very close to the minimum. One iteration of Newton’s can, however, be more expensive than one iteration of gradient descent, since it requires finding and inverting an n-by-n Hessian; but so long as n is not too large, it is usually much faster overall. When Newton’s method is applied to maximize the logistic regres-sion log likelihood function ℓ(θ), the resulting method is also called Fisher scoring.——Andrew Ng

殊途同归:简单线性模型下几何直观和概率直观的统一汇合

前面我们讨论了θ\thetaθ的两个求解角度,得到了两个函数,即损失函数和似然函数。接下来我们将看到,最小化损失函数和最大化似然函数实际上是等价的。然后我们会讨论在简单线性模型下,两种角度下的函数最值求解,其实不同数值算法也可以,因为我们可以直接进行代数分析给出最值点的数学解析式。

注意,从OSL和MLE两个角度出发,得到损失函数和似然函数,其最值问题等价,这个事情并不平凡。在后面介绍广义线性模型的时候,我们会看到基于各种指数簇分布的回归特例(简单线性模型只是基于正态分布下的回归特例),这个事情并不成立,即它们在理论上可能得到不同的参数θ\thetaθ。BTW,后面我们采用的都是MLE的角度,因为从MLE出发,利用梯度方法,各个回归特例的梯度更新公式都有统一的优美形式,此为后话。

几何直观角度下(OSL)的BGD、SGD梯度方法

OSL定义的损失函数(cost function) 如下:
J(θ)=12∑i=1m[hθ(x(i))−y(i)]2J(\theta) = \frac{1}{2}\sum_{i=1}^{m}[h_{\theta}(x^{(i)})-y^{(i)}]^2J(θ)=21​i=1∑m​[hθ​(x(i))−y(i)]2其关于参数的导数为∂J(θ)∂θ=∑i=1m(hθ(x(i))−y(i))x(i)\frac{\partial{J(\theta)}}{\partial\theta}=\sum_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})x^{(i)}∂θ∂J(θ)​=i=1∑m​(hθ​(x(i))−y(i))x(i)在BSD中,每一次对θ\thetaθ的更新需要遍历全部训练集的数据,其更新规则如下:θ:=θ+α∑i=1m(y(i)−hθ(x(i)))x(i)\theta:=\theta+\alpha\sum_{i=1}^{m}(y^{(i)}-h_{\theta}(x^{(i)}))x^{(i)}θ:=θ+αi=1∑m​(y(i)−hθ​(x(i)))x(i)而在SGD中,每一次仅从训练集中挑出一个训练样本对θ\thetaθ进行更新,因此其更新规则为:
θ:=θ+α(y(i)−hθ(x(i)))x(i)\theta:=\theta+\alpha(y^{(i)}-h_{\theta}(x^{(i)}))x^{(i)}θ:=θ+α(y(i)−hθ​(x(i)))x(i)其中α\alphaα表示的是学习率,或者形象地认为其为更新的步长。
注:从更高的角度来看,我们要降低不仅仅是训练数据集中的整体误差,而是整个样本空间的泛化误差,因此真正的损失函数为J(θ)=12∫x∈χ[hθ(x(i))−y(i)]2p(x)dxJ(\theta) = \frac{1}{2}\int_{x\in\chi}[h_{\theta}(x^{(i)})-y^{(i)}]^2p(x)dxJ(θ)=21​∫x∈χ​[hθ​(x(i))−y(i)]2p(x)dx而由于事实上我们无法知道总体的分布,因此按照蒙特卡洛模拟算法,应该抽取一定的样本进行近似,若取样本量M=mM = mM=m,则为BGD,若取样本量M=1M = 1M=1时,则为SGD,显然还可以取1&lt;M&lt;m1 &lt; M &lt; m1<M<m,此时则为小批量梯度下降算法 (Mini-Batch Gradient Descent)。
至此其实可以看到BGD与SGD本质上是一致的,即从总体中抽出样本来降低模拟误差。实际中SGD的应用会更多一些,特别是在训练数据量m较大时,其收敛速度更快,同时一定程度上能避免陷入局部最小值。

概率直观下(MLE)的 BGD、SGD方法

概率直观下定义的似然函数为
L(θ)=∑i=1m12πσexp(−(yi−hθ(x))2σ2)L(\theta) = \sum_{i=1}^{m}\frac{1}{\sqrt{2\pi}\sigma}exp(-\frac{(y_{i}-h_{\theta}(x))^2}{\sigma^2})L(θ)=i=1∑m​2π​σ1​exp(−σ2(yi​−hθ​(x))2​)对数之并约简,即可得到
ℓ(θ)=lnL(θ)=−mln(2πσ)−1σ2∑i=1m(yi−hθ(x))2\ell(\theta) = lnL(\theta)=-mln(\sqrt{2\pi}\sigma)-\frac{1}{\sigma^2}\sum_{i=1}^{m}(y^{i}-h_{\theta}(x))^2ℓ(θ)=lnL(θ)=−mln(2π​σ)−σ21​i=1∑m​(yi−hθ​(x))2可以看到,求ℓ(θ)\ell(\theta)ℓ(θ)的最大值,等价于求∑i=1m[hθ(x(i))−y(i)]2\sum_{i=1}^{m}[h_{\theta}(x^{(i)})-y^{(i)}]^2∑i=1m​[hθ​(x(i))−y(i)]2的最小值,这正是OLS的损失函数的形式。因此MLE对参数θ\thetaθ的求解,理论上同OLS就是等价的。由此也可以领悟到OLS是一个非常自然的方法,它实际上是在一组假设下做极大似然估计(我们其实更偏爱概率直观,所以用MLE来解释OSL)。

This is thus one set of assumptions under which least-squares re-gression can be justified as a very natural method that’s just doing maximum likelihood estimation.----Andrew Ng

两种角度下最优参数的数学解析式

通过代数分析,我们可以直接在理论上给出θ=arg⁡min⁡θ∈ΘJ/L(θ)\theta = {\arg\min}_{\theta\in\Theta}J/L(\theta)θ=argminθ∈Θ​J/L(θ)时的数学表达式。为了方便进行代数分析,我们引入下列记号:

  • 样本矩阵XXX
    [1x1(1)x2(1)⋯xn(1)1x1(2)x2(2)⋯xn(2)1x1(3)x2(3)⋯xn(3)⋮⋱⋮1x1(m)x2(m)⋯xn(m)]\left[ \begin{matrix} 1 &amp; x_1^{(1)} &amp; x_2^{(1)} &amp; \cdots &amp; x_n^{(1)}\\ 1 &amp; x_1^{(2)} &amp; x_2^{(2)} &amp; \cdots &amp; x_n^{(2)}\\ 1 &amp; x_1^{(3)} &amp; x_2^{(3)} &amp; \cdots &amp; x_n^{(3)}\\ \vdots &amp; &amp; &amp; \ddots &amp; \vdots\\ 1 &amp; x_1^{(m)} &amp; x_2^{(m)} &amp; \cdots &amp; x_n^{(m)} \end{matrix} \right] ⎣⎢⎢⎢⎢⎢⎢⎡​111⋮1​x1(1)​x1(2)​x1(3)​x1(m)​​x2(1)​x2(2)​x2(3)​x2(m)​​⋯⋯⋯⋱⋯​xn(1)​xn(2)​xn(3)​⋮xn(m)​​⎦⎥⎥⎥⎥⎥⎥⎤​

  • 对参数向量θ\thetaθ的求导运算:

  1. 向量求导:∂ATθ∂θ=A\frac{\partial{A^T\theta}}{\partial{\theta}}=A∂θ∂ATθ​=A,其中AAA是一个常数列向量。
  2. 向量求导:∂θTBθ∂θ=2Bθ\frac{\partial{\theta^TB\theta}}{\partial{\theta}}=2B\theta∂θ∂θTBθ​=2Bθ,其中BBB是一个对称矩阵。

至此,则损失函数可以表示为矩阵代数的形式:
J(θ)=12u^Tu^=12(y−Xθ)T(y−Xθ)=12(yTy−2yTXθ+θTXTXθ)\begin{aligned} J(\theta)=&amp; \frac{1}{2}\hat{u}^T\hat{u} \\ =&amp;\frac{1}{2}(y-X\theta)^T(y-X\theta)\\ =&amp;\frac{1}{2}( y^Ty-2y^TX\theta+\theta^TX^TX\theta) \end{aligned}J(θ)===​21​u^Tu^21​(y−Xθ)T(y−Xθ)21​(yTy−2yTXθ+θTXTXθ)​令J′(θ)=XTXθ−XTy=0J^{'}(\theta) = X^TX\theta-X^Ty = 0J′(θ)=XTXθ−XTy=0,即可解出
θ=(XTX)−1XTy\theta = (X^TX)^{-1}X^Tyθ=(XTX)−1XTy

简单线性模型的进一步拓展:局部加权线性回归(Local Weighted Liner Regression,LWLR)

局部加权线性回归采用一种非参数的方法来预测未知的样本。在之前的方法中,一旦参数向量θ\thetaθ学习出来后,则可以将历史的样本抛弃。而在LWLR中,历史收集到的样本需要始终保留下来,每一次对新样本进行估计时,都会动态得到结合样本数据和新样本的位置,给出一个参数θ\thetaθ的一个新的估计结果。换言之,θ\thetaθ是为新样本量身定做的。下面我们主要从几何直观的角度讨论LWLR。
注:我们其实仍然可以从概率直观的角度来解释LWLR,有兴趣的读者可以自己思考(从异方差的角度)。

下面讨论LWLR的具体做法。对于一个新进的样本x(j)x^{(j)}x(j):

  • 利用已有的数据(经验),最小化∑i=1mw(i)(hθ(x(i))−y(i))2\sum_{i=1}^{m}w^{(i)}(h_{\theta}(x^{(i)})-y^{(i)})^2∑i=1m​w(i)(hθ​(x(i))−y(i))2,得到θj^\hat{\theta_j}θj​^​
  • 给出预测值y^(j)=θj^Tx(j)\hat{y}^{(j)} = \hat{\theta_j}^{T}x^{(j)}y^​(j)=θj​^​Tx(j)

其中,w(i)w^{(i)}w(i)可以由核光滑函数来确定,即:
w(i)=exp(−(x(i)−x(j))22τ2)w^{(i)} = exp(-\frac{(x^{(i)}-x^{(j)})^2}{2\tau^2})w(i)=exp(−2τ2(x(i)−x(j))2​)其中τ\tauτ称为宽度(bandwidth),控制了权重随距离下降的快慢。从几何直观的角度看,越靠近x(j)x^{(j)}x(j)的x(i)x^{(i)}x(i),其误差平方将会被给予更大的权重。
总体上可以认为对y(j)y^{(j)}y(j)的估计时,不同的训练样本不在被一视同仁,越靠近x(j)x^{(j)}x(j)的样本点越被重视,从而得到的直线将会更好地符合x(j)x^{(j)}x(j)周围的样本点的情况。

在局部加权最小二乘法中,利用梯度方法进行θ\thetaθ的迭代求解,此时的更新公式是:

  • BGD:θ:=θ+α∑i=1m(y(i)−hθ(x(i)))x(i)w(i)\theta:=\theta+\alpha\sum_{i=1}^{m}(y^{(i)}-h_{\theta}(x^{(i)}))x^{(i)}w^{(i)}θ:=θ+α∑i=1m​(y(i)−hθ​(x(i)))x(i)w(i)
  • SGD:θ:=θ+α(y(i)−hθ(x(i)))x(i)w(i)\theta:=\theta+\alpha(y^{(i)}-h_{\theta}(x^{(i)}))x^{(i)}w^{(i)}θ:=θ+α(y(i)−hθ​(x(i)))x(i)w(i)

利用矩阵代数分析,同样可以得到θj^\hat{\theta_{j}}θj​^​的数学解析式。首先令
权重矩阵WWW为
[w(1)0⋯00w(2)⋯0⋮⋱⋮00⋯w(m)]\left[ \begin{matrix} w^{(1)} &amp; 0 &amp; \cdots &amp; 0\\ 0 &amp; w^{(2)} &amp; \cdots &amp; 0\\ \vdots &amp; &amp; \ddots &amp; \vdots \\ 0 &amp; 0 &amp; \cdots &amp; w^{(m)} \end{matrix} \right] ⎣⎢⎢⎢⎡​w(1)0⋮0​0w(2)0​⋯⋯⋱⋯​00⋮w(m)​⎦⎥⎥⎥⎤​则此时的损失函数可以表示为:
J(θ)=12∑i=1mw(i)(hθ(x(i))−y(i))2=12∑i=1m(w(i)hθ(x(i))−w(i)y(i))2=12∑i=1m(hθ(w(i)x(i))−w(i)y(i))2\begin{aligned} J(\theta) = &amp; \frac{1}{2}\sum_{i=1}^{m}w^{(i)}(h_{\theta}(x^{(i)})-y^{(i)})^2\\ = &amp; \frac{1}{2}\sum_{i=1}^{m}(\sqrt{w^{(i)}}h_{\theta}(x^{(i)})-\sqrt{w^{(i)}}y^{(i)})^2\\ = &amp; \frac{1}{2}\sum_{i=1}^{m}(h_{\theta}(\sqrt{w^{(i)}}x^{(i)})-\sqrt{w^{(i)}}y^{(i)})^2 \end{aligned}J(θ)===​21​i=1∑m​w(i)(hθ​(x(i))−y(i))221​i=1∑m​(w(i)​hθ​(x(i))−w(i)​y(i))221​i=1∑m​(hθ​(w(i)​x(i))−w(i)​y(i))2​因此原来的样本数据等价变换后的样本数据,其属性值为w(i)x(i)\sqrt{w^{(i)}}x^{(i)}w(i)​x(i),标记值为w(i)y(i)\sqrt{w^{(i)}}y^{(i)}w(i)​y(i)。利用矩阵的记法,则样本矩阵记为W12XW^{\frac{1}{2}}XW21​X,标记矩阵记为W12y⃗W^{\frac{1}{2}}\vec{y}W21​y​,故代入原来的解析式
θ=(XTX)−1XTy⃗\theta = (X^TX)^{-1}X^T\vec{y}θ=(XTX)−1XTy​可得
θj^=(XTWX)−1XTWy⃗\hat{\theta_{j}} = (X^TWX)^{-1}X^TW\vec{y}θj​^​=(XTWX)−1XTWy​一般的,当样本属性空间是多维度的时候,即xxx是多维向量时,根据高维欧式空间距离的推广式:∥x−y∥=(x−y)T(x−y)\parallel x-y \parallel = (x-y)^T(x-y) ∥x−y∥=(x−y)T(x−y)核光滑函数可以表示为:
w(i)=exp(−(x(i)−x(j))T(x(i)−x(j))2τ2)w^{(i)} = exp(-\frac{(x^{(i)}-x^{(j)})^T(x^{(i)}-x^{(j)})}{2\tau^2})w(i)=exp(−2τ2(x(i)−x(j))T(x(i)−x(j))​)

实战项目:简单线性模型下BGD、SGD、Mini-Batch GD、数学解析式的实现和LWLR的实现 (python)

特别说明:在梯度下降算法中,需要特别留意学习率α\alphaα(步长)的大小设置。以BGD为例,如果α\alphaα设置过大,则会出现总误差不减反增的现象,最终导致溢出。通过查看中间输出可看到,其过程中误差函数的偏导数出现正负号轮流出现的规律,可以推断这是由于α\alphaα过大导致的震荡现象,从而使得偏导数越来越大,总误差趋向无穷。
SGD中步长更合适的方法应该是采取自适应方式,即不应当将其设为一个常值,原因在于在最后收敛处,较大的步长会影响其得到稳定的优解,而在一开始迭代时,较小的步长会影响到其迭代的速度,因此总体上步长的设置应该逐步减小。

myLm.py

import numpy as np
from numpy import dot
from numpy.linalg import inv
import randomdef Lm(X,Y,method,alpha = 0.001,epsilon = 0.0000001,o = None,tau = None):'''X:样本矩阵 [1,x1,x2,x3,...,xn]Y:样本标签值向量 [y]method:训练参数时使用的方法,有OLS、BGD、SGD、MBGD、LWLMalpha: 学习速率(步长)epsilon:迭代终止阈值return:本函数通过使用相应的算法,给出简单线性回归模型的参数估计值'''if(method == 'OLS'):theta_0 = dot(dot(inv(dot(X.T,X)),X.T),Y)return theta_0elif(method == 'BGD'):#初始值设置theta_0 = np.ones(shape = X.shape[1])#计算当前损失函数的总误差error_0 = 0.5*dot((dot(X,theta_0)-Y).T,dot(X,theta_0)-Y)#启动循环error = epsilon+1#迭代次数nn = 0while(error > epsilon):       #计算全部样本误差函数的梯度G = dot(dot(X.T,X),theta_0)-dot(X.T,Y)#更新thetatheta_0 = theta_0 - alpha*G#计算步长更新后的损失函数的总误差error_1 = 0.5*dot((dot(X,theta_0)-Y).T,dot(X,theta_0)-Y)#计算前后二者的差error = abs(error_1-error_0)#将新一轮的误差保存用于下一轮error_0 = error_1# 输出迭代过程# print('---------------第',n,'轮迭代--------------')# print('theta:',theta_0)# print('error:',error)# print('G:',G,'\n')n = n + 1print('BGD Iteration Times: ',n)return theta_0elif(method == 'SGD'):#初始值设置theta_0 = np.ones(shape = X.shape[1])#计算当前初始值下损失函数的总误差error_0 = 0.5*dot((dot(X,theta_0)-Y).T,dot(X,theta_0)-Y)#启动循环error = epsilon+1#样本量m = X.shape[0]#遍历列表k = list(range(m))#迭代次数n = 0while(error > epsilon):#选择一个随机数[] r = random.randint(0,m-1)#遍历乱序列表random.shuffle(k)#计算当前样本下的梯度for r in k:G = (dot(X[r,:],theta_0)-Y[r])*X[r,:]#更新theta的值theta_0 = theta_0 - alpha*G#计算步长更新后theta_1下损失函数的总误差error_1 = 0.5*dot((dot(X,theta_0)-Y).T,dot(X,theta_0)-Y)#计算误差修正值大小error = abs(error_1-error_0)#将新一轮的误差保存用于下一轮error_0 = error_1# 输出迭代过程# if(n%100 == 0):# print('---------------第',n,'轮迭代--------------')# print('theta:',theta_0)# print('error:',error)# if(n > 8000):# alpha = 0.00001# print('r:',r)# print('G:',G,'\n')n = n + 1print('SGD Iteration Times: ',n)return theta_0elif(method == 'MBGD'):#初始值设置theta_0 = np.ones(shape = X.shape[1])#计算当前损失函数的总误差error_0 = 0.5*dot((dot(X,theta_0)-Y).T,dot(X,theta_0)-Y)#启动循环error = epsilon+1#样本量m = X.shape[0]#遍历列表k = list(range(m))        #迭代次数nn = 0while(error > epsilon):       #随机选取一定批量的样本random.shuffle(k)minBatch = k[:m//10]minX = X[minBatch]minY = Y[minBatch]  #计算小批量样本误差函数的梯度G = dot(dot(minX.T,minX),theta_0)-dot(minX.T,minY)#更新thetatheta_0 = theta_0 - alpha*G#计算步长更新后的损失函数的总误差error_1 = 0.5*dot((dot(X,theta_0)-Y).T,dot(X,theta_0)-Y)#计算前后二者的差error = abs(error_1-error_0)#将新一轮的误差保存用于下一轮error_0 = error_1# 输出迭代过程# print('---------------第',n,'轮迭代--------------')# print('theta:',theta_0)# print('error:',error)# print('G:',G,'\n')n = n + 1print('MBGD Iteration Times: ',n)return theta_0elif(method == 'LWLM'):#局部加权线性回归XCopy = X[:,1:]-od = []for i in range(XCopy.shape[0]):d.append(dot(XCopy[i],XCopy[i]))d = np.array(d)w = np.exp(-d**2/(2*tau**2))W = np.diag(w)theta_0 = dot(dot(dot(inv(dot(dot(X.T,W),X)),X.T),W),Y)return theta_0else:print('No Such Method In this Func.')

myLmtest.py

import myLm
import numpy as np
import pandas as pdif __name__ == '__main__':samData = pd.read_table('mlData/regreData/simpleRegre.txt',header = None)#转换为二维数组sample = np.array(samData)#将属性值与标签值分开sampleX = sample[:,:np.shape(sample)[1]-1]sampleY = sample[:,sample.shape[1]-1]x = np.array([0])#Testingtheta = myLm.Lm(sampleX,sampleY,method = 'LWLM',o = x,tau = 1)print('LWLM:',theta)theta = myLm.Lm(sampleX,sampleY,method = 'SGD')print('SGD:',theta)theta = myLm.Lm(sampleX,sampleY,method = 'BGD')print('BGD:',theta)theta = myLm.Lm(sampleX,sampleY,method = 'MBGD')print('MBGD:',theta)theta = myLm.Lm(sampleX,sampleY,method = 'OLS')print('OLS:',theta)

机器学习笔记——2 简单线性模型及局部加权线性模型的基本原理和python实现(参数估计的两个基本角度:几何直观和概率直观。函数最值问题的两大基本算法:梯度方法与迭代方法)相关推荐

  1. 【机器学习】线性回归之概率解释及局部加权线性回归

    Probabilistic interpretation 我们应该想这样一个问题:当我们讨论回归问题时,我们为什么要最小化平方损失函数?在CS229的课程中,吴恩达教授给我们做了详细的概率解释.现总结 ...

  2. 机器学习(回归五)——线性回归-局部加权线性回归

    前面博客有讲到,样本如果不是线性的可以通过多项式扩展,映射到多维空间来拟合.如此之外,还可以做一个局部加权线性回归(Locally Weighted Linear Regression,LWLR). ...

  3. JS高程5.引用类型(6)Array类型的位置方法,迭代方法,归并方法

    一.位置方法 ECMAScript5为数组实例添加了两个位置:indexOf()和 lastIndexOf().这两个方法接收两个参数:要查找的项和(可选的)表示查找起点位置的索引(如在数组[7,8, ...

  4. EM算法原理和python简单实现

    目录 第一章最大似然估计    1 第二章最大似然估计到EM    2 第三章 EM算法推导    3 第四章 EM例子和python代码    7 参考文献    8 最大似然估计 这篇文章主要是在 ...

  5. wrr算法原理和python实现

    文章目录 简介 实现 最大权重 最大权重算法 令牌轮询示例 令牌轮询 令牌轮询算法 令牌轮询示例 平滑最大权重 平滑最大权重算法 平滑最大权重示例 代码模拟 算法比较 简介 在测试各种负载均衡时,总会 ...

  6. 计算多边形(polygon)面积的算法原理和python实现

    计算多边形(polygon)的面积其实很简单,假设是n边形,分割为n-2个三角形,积分别计算每个三角形面积后累加得多边形面积. 如下图所示: 那么如何计算三角形的面积呢? △ABC的面积是" ...

  7. 【人工智能 AI】机器学习教程:如何降低模型损失?迭代方法与梯度下降方法

    目录 迭代方法 如何减少损失? 梯度下降法 降低损失:梯度下降法 迭代方法 为了训练模型,我们需要一种降低模型损失的好方法.迭代方法是一种广泛使用的损失损失方法,就像向下山一样简单有效. 预计用时:5 ...

  8. 几何算法——6.曲线曲面求交的方法总结(国内外文献调研、思考和总结)

    几何算法--6.曲线曲面求交的方法总结(国内外文献调研.思考和总结) 1 曲线曲线 1.1 直线/二次曲线 1.2 二次曲线/二次曲线 1.3 其他类型 (1992年11月)NURBS求交算法一一曲线 ...

  9. 增强学习Reinforcement Learning经典算法梳理2:蒙特卡洛方法

    1 前言 在上一篇文章中,我们介绍了基于Bellman方程而得到的Policy Iteration和Value Iteration两种基本的算法,但是这两种算法实际上很难直接应用,原因在于依然是偏于理 ...

最新文章

  1. POJ C程序设计进阶 编程题#3:运算符判定
  2. Unity5 Survival Shooter开发笔记(1)
  3. Scrapy 导出的 cvs 文件,双击打开乱码问题
  4. 获取代理IP的三种途径
  5. MATLAB读取MIT心电信号
  6. OneNote | OneNote 备份(线上+本地)
  7. 好物推荐:眼科OCT影像自动分割工具推荐
  8. 彻底卸载360安全卫士的方法
  9. fiash星空动画制作_Flash8实现动态星空的通用方法
  10. 六年如逆旅,我亦是行人 ——一个顾问的六年安全从业经历
  11. html制作课程导航页面,学成在线页面制作(HTML+CSS部分)(顶部+轮播图部分)...
  12. TIM/QQ——将群文件中的临时文件转换成永久文件的方法
  13. 利用VBA批量发送Excel中工资单邮件
  14. drippingblues-靶机渗透
  15. 华奥安心延保对代码的敬畏之心
  16. android的文字识别OCR
  17. 初次注册知乎账号,不小心遭受系统限制,该如何解封?
  18. c3p0-config.xml配置文件的那些事
  19. Mac电脑如何卸载Sophos防病毒软件?
  20. Python之父吉多·范罗苏姆谈中国的996工作制度

热门文章

  1. 好像什么都来得及,又好像什么都来不及的IT普信男
  2. 【配电网重构】基于遗传算法实现配电网重构附matlab代码
  3. 她经济”成为品牌新危机?小红书精准营销读懂女人心
  4. 辽宁科技学院计算机专业宿舍,辽宁科技学院专科宿舍内部结构如何
  5. adk java,windows ADB配置java adk Android adk
  6. html5不可修改,5 款不可缺席的 HTML5 编辑器
  7. 洛谷P1346 电车(双端队列BFS)
  8. matlab 图 教程,Matlab图形
  9. CS201 USB TYPEC音频控制芯片|TYPEC拓展坞音频芯片|CS201参数特性
  10. ZZNUOJ_Java1058:求解不等式(完整代码)