• Linear Regression and the Theory

    Linear Regression and the Theory

    DEC 16TH, 2012

    问题

    有一堆实数数据,数据的格式如下:

    x1,x2,x3,?,xn,y

    所有的这些数据称为训练集,其中 x 称为feature, y 称为target。

    现在又来了一个数据:

    x1,x2,x3,?,xn

    现在需要做的是根据这些 x 的值,推测出 y 的值。

    对这个问题更详细的描述可以看Stanford机器学习公开课中相关描述。

    解决方法

    Overdetermined Equations

    假设 y x 的线性函数(顺便说一句lr中的linear是对于 θ 而言的,并非针对 x ),表达为公式为:

    y=θ0x0+θ1x1+θ2x2+?+θnxn

    其中 x0 为截距(intercept term),其值恒为1。

    最容易想到的方法,可以把所有训练集的数据代入这个公式,得到方程组:

    ???????????????y(1)=θ0x(1)0+θ1x(1)1+θ2x(1)2+?+θnx(1)ny(2)=θ0x(2)0+θ1x(2)1+θ2x(2)2+?+θnx(2)n?y(m)=θ0x(m)0+θ1x(m)1+θ2x(m)2+?+θnx(m)n

    这个方程组有m个方程,n+1个未知数,实际问题中通常是训练集的个数大于feature个数,也就是说m > n+1,这种情况下的方程组称为超定方程组,是不能直接求解的。当然可以像当年欧拉和拉普拉斯最初解决天文计算问题一样(here),把m个方程组分成n+1组,然后每一组合并成一个方程,得到n+1个方程后再求解。不过问题是怎么分成n+1组,这个很是adhoc的。

    Cost Function

    机器学习上解决这个问题的方法是定义一个损失函数:

    J(θ)=12i=1m(hθ(x(i))?y(i))2

    然后选择适当的 θ ,使得 J(θ) 最小。

    Gradient Descent

    这个最小化的算法在机器学习中称为梯度下降:

    • 随机初始化一组 θ 值;
    • 朝着减少cost function的方向,不断更新 θ 值,直到收敛。更新公式为:
    θj:=θj?α?J(θ)?θj

    其中 α 为学习速率(learning rate)。

    Gradient Descent推导

    假设训练集中只有一个数据, ?J(θ)?θj 计算如下:(x,y代表所有xi,yi,可以看成向量)

    ?J(θ)?θj=?(12(hθ(x)?y)2)?θj=2?12(hθ(x)?y)??(hθ(x)?y)?θj=(hθ(x)?y)??(hθ(x)?y)?θj=(hθ(x)?y)??(ni=0θixi?y)?θj=(hθ(x)?y)xj

    代入更新公式:

    θj=θj?α(hθ(x)?y)xj=θj+α(y?hθ(x))xj

    对于有m个数据集的情况可以得到如下公式:

    θj:=θj+αi=1m(y(i)?hθ(x(i)))x(i)j

    Gradient Descent直观解释

    J(θ) 是一个关于 θ 的多元函数,高等数学的知识说, J(θ) 在点 P(θ0,θ1,?,θn) 延梯度方向上升最快。现在要最小化  J(θ) ,为了让 J(θ) 尽快收敛,就在更新 θ 时减去其在P点的梯度。

    在最终推导出的更新公式中,可以得出以下直观结论:如果遇到一个数据使得 (y?hθ(x)) 比较小,这时候 θ 的更新也会很小,这也符合直观感觉。当一个数据使得差值比较大时, θ 的更新也会比较大。

    Stochastic Gradient Descent

    以上的讨论的算法叫batch gradient descent,batch指的是,每次更新 θ 的时候都需要所有的数据集。

    这个算法有两个缺陷:数据集很大时,训练过程计算量太大;需要得到所有的数据才能开始训练;

    比如一个场景下,我们训练了一个lr模型,应用于线上环境,当这个模型跑在线上的时候我们会收集更多的数据。但是上面两个问题使得我们不能及时更新模型,而这正是随机梯度下降要解决的问题。

    在之前的推导过程中已经给出了sgd的更新公式,只是没有指出,现正式提出sgd的更新公式:

    loop for every (x, y) in training set until convergence:

    θj:=θj+α(y?hθ(x))xj

    与bgd唯一的区别是,无论数据集有多少,每次迭代都只用一个数据。这样当有新的数据时,直接通过上式更新 θ ,这就是所谓的online learning。又因为每次更新都只用到一个数据,所以可以显著减少计算量。

    bgd的Python实现

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    
    #!/usr/bin/env python # -*- coding: utf-8 -*-  import re import numpy as np   def load_data(filename):  feature = []  target = []  f = open(filename, 'rb')  for line in f.readlines():  sample = re.split('\s+', line.strip())  feature.append([1, ] + sample[0:-1])  target.append(sample[-1])   return np.array(feature, np.float), np.array(target, np.float)   def sgd(feature, target, iter=200, step=0.001):  theta = np.zeros(feature.shape[1])  # theta = np.ones(feature.shape[1])   for it in range(iter):  for i in range(feature.shape[0]):  error = target[i] - sum(theta * feature[i])  theta = theta + step * error * feature[i]   predict = [sum(theta * sample) for sample in feature]  mse = sum((target - predict) ** 2) / feature.shape[0]  print it, 'mse:', mse   return theta   def normalize(feature):  mu = feature.mean(0)  std = feature.std(0)   for j in range(1, feature.shape[1]):  feature[:, j] = (feature[:, j] - mu[j]) / std[j]   return feature, mu, std   if __name__ == '__main__':  datafile = 'housing_data'  x, y = load_data(datafile)  x, mu, std = normalize(x)  theta = sgd(x, y)  print theta

    代码中使用的数据集可以从这里下载,描述在这里

    代码中normalize函数用于对feature进行归一化处理,可以尝试一下去掉normalize过程,对于这个数据集会得出很出乎意料的结果。

    概率解释

    以上的讨论中,得出 y x 的关系是线性假设,使用梯度下降也可以从高数中得到依据,唯有损失函数好像是拍脑袋想出来的。这里选择二次函数是有其理论基础的。

    y x 满足以下公式:

    y(i)=θTx(i)+ε(i)

    其中 ε(i) 称为误差,可能由两个原因产生:feature选择的不合适;随机噪声;

    又假设 ε(i) 独立同分布,且满足均值为0,方差为 σ2 的高斯分布,即:

    p(ε(i))=12π???σe?(ε(i))22σ2

    也就是:

    p(y(i)|x(i);θ)=12π???σe?(y(i)?θTx(i))22σ2

    以上是一个关于 y X 的公式,可以定义一个似然函数,形式如同上式,但是似然函数是关于 θ 的公式:

    L(θ)=L(θ;X,y)=p(y|X;θ)

    根据之前 ε(i) 的独立性假设, L(θ) 可以记做

    L(θ)=i=1mp(y(i)|x(i);θ)=i=1m12π???σe?(y(i)?θTx(i))22σ2

    现在已经观察到了很多数据( x y ),那么什么样的模型才能让这些数据出现的可能性最大。这就是最大似然估计的出发点,也就是求解 θ 以最大化这些数据出现的概率,即最大化似然函数 L(θ)

    关于最大似然估计方法更多解释可以看这里

    当然更多时候最大化的是 logL(θ) ,而不是直接最大化 L(θ) ,因为log函数单调递增函数,所以这个转化不会影响 θ 的最终取值。

    l(θ)=logL(θ)=logi=1m12π???σe?(y(i)?θTx(i))22σ2=i=1mlog12π???σe?(y(i)?θTx(i))22σ2=mlog12π???σ?1σ212i=1m(y(i)?θTx(i))2

    因此最大化 l(θ) 也就是最小化:

    12i=1m(y(i)?θTx(i))2

    也就是之前出现的 J(θ)

    至此,我们从概率和最大似然估计的角度解释了 J(θ) 选择这个二次式是合理的。

     Dec 16th, 2012  AlgorithmMachine Learning

    from : http://yangpengg.github.io/blog/2012/12/16/linear-regression-and-the-theory/

    相关文章
    相关标签/搜索
    每日一句
      每一个你不满意的现在,都有一个你没有努力的曾经。
    公众号推荐
       一个历史类的公众号,欢迎关注
    一两拨千金
    4887铁算王中王开奖结果小说 庆云县| 河曲县| 邓州市| 郴州市| 嘉峪关市| 阳泉市| 宣化县| 陕西省| 大化| 宜宾县| 仙居县| 陕西省| 德惠市| 开平市| 开封县| 门头沟区| 泰宁县| 达州市| 宜良县| 玉龙| 军事| 普洱| 吴旗县| 新津县| 天等县| 宁远县| 繁昌县| 石林| 德化县| 康乐县| 汨罗市| 灵寿县| 鹰潭市| 罗甸县| 张家川| 荆州市| 和顺县| http://fa.hz0j1r2vo.fun http://fa.hz0j1r6vo.fun http://fa.hz0j1r0vo.fun http://fa.hz0j0r3vo.fun http://fa.hz0j2r2vo.fun