C++实现线性回归

线性模型

f(x)=ω1x1+ω2x2+ω3x3+...+ωdxd+bf(\bm{x}) = \omega_1x_1 + \omega_2x_2 + \omega_3x_3 + ... + \omega_dx_d + b
f(x)=ωTx+bf(\bm{x}) = \bm{\omega^Tx} + b

其中ω=(ω1;ω2;ω3;....;ωd)x=(x1;x2;...;xd)T\bm{\omega} = (\omega_1;\omega_2;\omega_3;....;\omega_d), \bm{x} = (x_1;x_2;...;x_d)^T

线性回归

线性回归试图学得

f(xi)=ωxi+bf(\bm{x_i}) = \bm{\omega x_i} + b

使得

f(xi)yif(\bm{x_i}) \simeq y_i

如何求得ω\omegabb,关键在于衡量f(xi)yif(\bm{x_i}) \simeq y_i,他们之间相差越小,结果越好,于是有

(ω,b)=argω,bmini=1m(f(xi)yi)2=argω,bmini=1m(yiωxib)2(\omega^*,b^*) = \arg \limits_{\bm{\omega}, b} min \sum \limits_{i = 1} ^m (f(\bm{x_i}) - y_i) ^ 2 = \arg \limits_{\bm{\omega}, b} min \sum \limits_{i = 1} ^m (y_i - \bm{\omega x_i} - b) ^ 2
化为一般式:
ω^=argωmin(yXω^)T(yXω^)\widehat{\bm{\omega}}^* = \arg \limits_{\bm{\omega}} min (\bm{y - X\widehat{\omega}})^T(\bm{y - X\widehat{\omega}})

对上式的ω\bm{\omega}bb求导,当XTX\bm{X^TX}为满秩矩阵或者正定矩阵式,令其等于零得到

ω^=(XTX)1XTy\widehat{\bm{\omega}}^* = (\bm{X^TX})^{-1}\bm{X^Ty}

最后求的线性回归模型为:

f(x^i)=x^i(XTX)1XTyf(\widehat{\bm{x}}_i) =\widehat{\bm{x}}_i (\bm{X^TX})^{-1}\bm{X^Ty}

m为数据集个数,d为属性个数,其中X\bm{X}(md)(m*d), y\bm{y}(m1)(m*1)

现实中XTX\bm{X^TX}往往不是满秩矩阵,会出现列数对于行数,XTX\bm{X^TX}显然不满秩,此时可解出多个ω^\bm{\widehat{\omega}}, 他们都能使均方误差最小化,选择哪一个解作为输出,将有学习算法的归纳偏好决定,常见的做法是引入正则化项。

也可模型预测值逼近y的衍生物,比如示例所对应的输出标记是在指数尺度上的变化,那么可以将输出标记的对数作为线性模型逼近的目标:
lny=ωTx+bln y = \bm{\omega^Tx} + b
这就是“对数线性回归”。

更一般的,考虑单调可微函数。令

y=g1(ωTx+b)y = g^{-1}(\bm{\omega^Tx} + b)

这样得到的模型成为“广义线性模型”。

对数几率回归(逻辑回归)

上面讨论了使用线性模型进行回归学习,但如果要做的时分类任务该如何?我们现在讨论二分类。

这时候就用到逻辑回归,与线性回归不一样的是,再线性回归(z=ωTx+bz = \bm{\omega^Tx} + b)的基础上,外面包装了一个“sigmod”函数y=11+ezy = \frac{1}{ 1 + e ^ {-z}},函数图像如下。

在这里插入图片描述

若预测值z大于零判为正例,小于零判为负例,预测值为临界值则可任意判别。

  1. 将z带入sigmod函数,得y=11+e(ωTx+b)y = \frac{1}{ 1 + e ^ {-(\bm{\omega^Tx} + b)}}
  2. 然后化为 lny1y=ωTx+bln \frac{y}{1-y} = \bm{\omega^Tx} + b
  3. 若将yy视为xx作为正例的可能性,则1y1-y是其反例的可能性,两者的比值成为“几率”。

接下去的看逻辑回归

线性判别分析(LDA)

LDA的思想:给定训练集,设法将样例投影到一条直线上,是的同样类例的投影点尽可能接近、异类投影点尽可能远离;再对新样本进行分类时,将其同样投到这条直线上,再根据投影点的位置确定新样本的类别。

在这里插入图片描述

XiμiiX_i、\mu_i、\sum_i分别代表第i{0,1}i \in {\{0,1\}}类示例的集合、均值向量、协方差矩阵

  • 两类样本的中心在直线上的投影分别为ωTμ0\omega^T\mu_0ωTμ1\omega^T \mu_1;
  • 若将所有样本点都投影到直线上,则两类样本的协方差分别为ωT0ω\omega^T\sum_0\omegaωT1ω\omega^T\sum_1\omega;
  • 我们的目的是ωT0ω+ωT1ω\omega^T\sum_0\omega + \omega^T\sum_1\omega尽可能小,使ωTμ0ωTμ122||\omega^T\mu_0-\omega^T \mu_1||_2^2尽可能大;

J=ωTμ0ωTμ122ωT0ω+ωT1ω=ωT(μ0μ1)(μ0μ1)TωωT(0+1)ω\bm{J = \frac{||\omega^T\mu_0-\omega^T \mu_1||_2^2}{\omega^T\sum_0\omega + \omega^T\sum_1\omega} = \frac{\omega^T(\mu_0-\mu_1)(\mu_0-\mu_1)^T\omega}{\omega^T(\sum_0+\sum_1)\omega}}

  • 定义类内散度矩阵
    Sw=0+1=xX0(xμ0)(xμ0)T+xX0(xμ1)(xμ1)T\bm{S_w = \sum_0+\sum_1 = \sum_{x\in X_0} (x-\mu_0)(x-\mu_0)^T + \sum_{x\in X_0} (x-\mu_1)(x-\mu_1)^T}
  • 定义类间散度矩阵
    Sb=(μ0μ1)(μ0μ1)T\bm{S_b = (\mu_0-\mu_1)(\mu_0-\mu_1)^T}
    J=ωTSbωωTSwω\bm{J = \frac{\omega^TS_b\omega}{\omega^TS_w\omega}}
  • 确定ω\bm{\omega}
    minωωTSbωs.t.ωTSwω=1\bm{min_\omega \quad -\omega^TS_b\omega} \\ s.t. \quad\bm{\omega^TS_w\omega = 1}
  • 由拉格朗日乘子法,得
    Sbω=λSωω\bm{S_b\omega = \lambda S_{\omega}\omega}
  • Sbω\bm{S_b\omega}的方向恒为μ0μ1\bm{\mu_0 - \mu_1},令
    Sbω=λ(μ0μ1)\bm{S_b\omega = \lambda(\mu_0 - \mu_1)}
  • 于是带入得
    ω=Sω1(μ0μ1)\bm{\omega = S_{\omega}^{-1}(\mu_0 - \mu_1)}

多分类学习

不失一般性,考虑N 个类别C1 , C2 ,… , CN , 多分类学习的基本思路是"拆解法飞即将多分类任务拆为若干个二分类任务求解.具体来说,先对问题进行拆分,然后为拆出的每个二分类任务训练一个分类器;在测试时,对这些分类器的预测结果进行集成以获得最终的多分类结果。这里的关键是如何对多分类任务进行拆分,以及如何对多个分类器进行集成。

最经典的拆分策略有三种. “一对一” (One vs. One,简称OvO) 、“一对多” (One vs. Rest ,简称OvR)和"多对多" (Many vs. Many,简称MvM).
在这里插入图片描述

类别不平衡

加入有998个反例,2个正例,那么学习方法只需要放回一个永远将新样本预测为反例的学习器,就能达到99.8%的精度。

解决办法:

  1. 对数据过多的一方进行欠采样
  2. 对数据过少的一方进行过采样
  3. 基于原始数据集进行学习,但是在用训练好的分类器进行预测时,加入一个策略到其决策过程,成为“阈值移动”。
    y1y=y1ymm+\frac{y^{'}}{1-y^{'}} = \frac{y}{1-y} * \frac{m^-}{m^+}

mm+m^-、m^+分别为正反例数目

posted on 2018-09-27 16:37  一小白  阅读(268)  评论(0编辑  收藏  举报