zoukankan      html  css  js  c++  java
  • 机器学习实战

    [comment]: # 机器学习实战 - 读书笔记(08) - 预测数值型数据:回归

    前言

    最近在看Peter Harrington写的“机器学习实战”,这是我的学习心得,这次是第8章 - 预测数值型数据:回归。

    基本概念

    • 回归(regression) - 估算一个依赖变量和其它独立变量的关系。不同于分类的是,它计算的是连续数值,也就是数值型数据。
      回归多用于预测。

    • 回归方程(regression equation) : 就是回归分析的结果。一个方程式使用独立变量来计算依赖变量。

    • 线性回归(linear regression) : 回归方程是一个多元一次方程,它是由常量乘以每个独立变量,然后再求和的结果。

    • 过拟合(over-fitting) :
      理解过拟合,可以想象有两个人:小明和小强。我们让他们做开平方计算。
      小明计算能力强,他使用计算的方法求开平方的结果。
      小强记忆能力强,他记住1~10000所有数开平方的结果,通过匹配的方式算出结果。
      小强的方法就是过拟合,过于依靠记忆(训练数据),而没有发现一个通用的规律。

    • 欠拟合(under-fitting)
      在机器学习的回归分析中,希望发现训练数据和目标数据之间的关系。这个关系是未知的。
      寻找这个通用关系有一些困难:

      • 训练数据和目标数据的覆盖度问题。是否能够完全体现了数据关系?
      • 训练数据和目标数据的精确度问题。
      • 关系的复杂性
        这种关系可能是线性的(我们喜欢),也可能是二次方程式、三次方程式、求对数等等。
        如果我们简单的使用线性回归方程,则很可能满足了部分数据,对某些数据却造成了偏差。
        这种现象就是欠拟合。

    线性回归

    使用线性回归方程,求解系数向量(w)

    核心公式

    • 线性回归方程

    [y = f(x) = w^Tx ]

    • (w)
      (w), 是求方程式(y = w^Tx)的最小平方误差。
      平方误差:

    [ extstyle sum_{i=1}^n(y_i - w_i^Tw)^2 ]

    平方误差的矩阵表示:

    [(y-xw)(y-xw) ]

    (w)求导:

    [egin{array}{lcl} ((y-xw)^T(y-xw))' & = (y^2 - 2xyw + (xw)^2)' \ & = -2xy + 2xw \ & = -2x^T(y- xw) \ -2x^T(y- xw) & = 0 \ x^T(y- xw) & = 0 \ x^Ty- x^Txw) & = 0 \ w & = (x^T y)(x^T x)^{-1} end{array} \ where \ qquad x ext{ : training data, it is a matrix.} \ qquad x^T ext{ : x's transpose.} \ qquad y ext{ : result data of training data.} \ qquad w ext{ : it is a vector.} ]

    • 测试算法
      使用相关系数验证回归方程式
    numpy.corrcoef(yEstimate, yActual)
    

    [R_{ij} = frac{C_{ij}}{sqrt{C_{ii}C_jj}} ]

    优势

    • 方法简单,易于实现。

    劣势

    • 不能求解
      ((x^Tx)^{-1}),是对矩阵求逆,然而,矩阵的逆可能并不存在。
    • 欠拟合
      由于线性回归计算的是所有的训练数据,因此不会考虑局部上的细节,这样会出现欠拟合的现象。

    局部加权线性回归(Locally Weighted Linear Regression,LWLR)

    为了解决线性回归欠拟合的问题,一个思路是:我们用离测试数据比较近的训练数据进行线性回归分析。
    因此我们给每个训练数据赋予一个权重(alpha),太远的训练数据的权重为0,离测试数据越近,权重越大。
    这个思路有点像KNN算法。

    • (w)

    [w = (x^T alpha y)(x^T alpha x)^{-1} \ alpha(i, i) = exp left ( frac{left | x^{(i)} - x^{(t)} ight |}{-2k^2} ight) \ where \ qquad x ext{ : training data, it is a matrix.} \ qquad x^T ext{ : x's transpose.} \ qquad y ext{ : result data of training data.} \ qquad w ext{ : it is a vector.} \ qquad alpha ext{ : weight of training data, it is a matrix.} \ qquad alpha(i, i) qquad ext{ : a result is from a kernel function, here we use radial basis function.} \ qquad left | x^{(i)} - x^{(t)} ight | ext{ : the square of the distance of } x^{(i)} ext{ and} x^{(t)} ext{.} \ qquad x^{(t)} ext{ : the testing data.} \ qquad k ext{ : it is an input value. 0 < k } leqslant { 1. } ]

    注: k越小,细分程度越大。 过于小的K会导致过拟合问题。

    岭回归(ridge regression)

    岭回归是一种缩减(shrinkage)技术。缩减方法可以去掉不重要的参数,因此能更好地理解数据。

    逻辑过程

    • 首先对训练数据做标准化处理。
      标准化处理的目的是使得每个特征的重要性相同。
      比如:一个特征的年龄(单位是年龄),另外一个特征是年收入(单位是元)。
      如果使用原始数据,年龄变化比较小,所以可能对应的w会比较大。同理,年收入对应的w会比较小。
      对于岭回归来说,lambda就不太好取值。
    • 然后使用不同的lambda,进行岭回归计算。

    核心公式

    • 标准化处理

    [y^{(mean)} = frac{sum(y)}{count(y)} \ y = y - y^{(mean)} \ x^{(mean)} = frac{sum(x)}{count(x)} \ x^{(var)} = frac{sum((x - x^{(mean)}))^2}{count(x)} \ x = frac{x - y^{(mean)}}{x^{(var)}} \ where \ qquad x ext{ : training data, it is a matrix.} \ qquad y ext{ : result data of training data.} \ qquad y^{(mean)} ext{ : the arithmetic mean along the y.} \ qquad x^{(mean)} ext{ : the arithmetic mean along the x.} \ qquad x^{(var)} ext{ : the variance along the x.} ]

    • 岭回归方程

    [w = (x^T y)(x^T x + lambda I)^{-1} \ where \ qquad x ext{ : training data, it is a matrix.} \ qquad x^T ext{ : x's transpose.} \ qquad y ext{ : result data of training data.} \ qquad w ext{ : it is a vector.} \ qquad I ext{ : is a m * m matrix, 对角线上的元素为1(就是岭), 其它元素都为0. } \ qquad m ext{ : dimension of a training data.} \ qquad lambda ext{ : an input value. 缩减系数} ]

    注:(lambda)非常小时,系数与普通回归一样。而(lambda)非常大时,所有回归系数缩减为0。可以在中间某处找到使得预测的结果最好的(lambda)值。

    • 前向逐步线性回归

    逻辑过程

    对训练数据做标准化处理(和岭回归的标准化处理方式相同).
    初始化w的每个元素为1.
    每次对w的一个元素增大一点或者减少一点,计算误差,如果误差比上次的少,就将当前的w记为w_best。
    按照上面的方法循环许多次后,返回w_best.
    

    核心公式

    • 计算误差的方法

    [y^{(test)} = w x \ error = extstyle sum_{i=1}^n (y_i - y_i^{(test)})^2 \ where \ qquad x ext{ : training data, it is a matrix.} \ qquad w ext{ : the current w.} \ qquad y ext{ : result data of training data.} ]

    参考

  • 相关阅读:
    第一行代码--笔记(1)
    iOS UITableView深入
    iOS 数据库主键重复,依然可以插入
    UILabel文本高度自适应 不同系统出现问题
    UIlabel上的文字 距上 居左 对齐
    UILabel 自定义字体
    【整理】--VC 编译整理
    【整理】--【内核模块】简单例子,编译加载
    【原创】-- uboot,kennel,fs,rootfs 编译制作
    【原创】-- nfs安装配置及使用,挂载根文件系统
  • 原文地址:https://www.cnblogs.com/steven-yang/p/5695082.html
Copyright © 2011-2022 走看看