C++实现线性回归
f ( x ) = ω 1 x 1 + ω 2 x 2 + ω 3 x 3 + . . . + ω d x d + b f(\bm{x}) = \omega_1x_1 + \omega_2x_2 + \omega_3x_3 + ... + \omega_dx_d + b f(x)=ω1x1+ω2x2+ω3x3+...+ωdxd+b
f ( x ) = ω T x + b f(\bm{x}) = \bm{\omega^Tx} + b f(x)=ωTx+b
其中 ω = ( ω 1 ; ω 2 ; ω 3 ; . . . . ; ω d ) , x = ( x 1 ; x 2 ; . . . ; x d ) T \bm{\omega} = (\omega_1;\omega_2;\omega_3;....;\omega_d), \bm{x} = (x_1;x_2;...;x_d)^T ω=(ω1;ω2;ω3;....;ωd),x=(x1;x2;...;xd)T
线性回归试图学得
f ( x i ) = ω x i + b f(\bm{x_i}) = \bm{\omega x_i} + b f(xi)=ωxi+b
使得
f ( x i ) ≃ y i f(\bm{x_i}) \simeq y_i f(xi)≃yi
如何求得 ω \omega ω和 b b b,关键在于衡量 f ( x i ) ≃ y i f(\bm{x_i}) \simeq y_i f(xi)≃yi,他们之间相差越小,结果越好,于是有
( ω ∗ , b ∗ ) = arg ω , b m i n ∑ i = 1 m ( f ( x i ) − y i ) 2 = arg ω , b m i n ∑ i = 1 m ( y i − ω x i − b ) 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 (ω∗,b∗)=ω,bargmini=1∑m(f(xi)−yi)2=ω,bargmini=1∑m(yi−ωxi−b)2
化为一般式:
ω ^ ∗ = arg ω m i n ( y − X ω ^ ) T ( y − X ω ^ ) \widehat{\bm{\omega}}^* = \arg \limits_{\bm{\omega}} min (\bm{y - X\widehat{\omega}})^T(\bm{y - X\widehat{\omega}}) ω ∗=ωargmin(y−Xω )T(y−Xω )
对上式的 ω \bm{\omega} ω和 b b b求导,当 X T X \bm{X^TX} XTX为满秩矩阵或者正定矩阵式,令其等于零得到
ω ^ ∗ = ( X T X ) − 1 X T y \widehat{\bm{\omega}}^* = (\bm{X^TX})^{-1}\bm{X^Ty} ω ∗=(XTX)−1XTy
最后求的线性回归模型为:
f ( x ^ i ) = x ^ i ( X T X ) − 1 X T y f(\widehat{\bm{x}}_i) =\widehat{\bm{x}}_i (\bm{X^TX})^{-1}\bm{X^Ty} f(x i)=x i(XTX)−1XTy
m为数据集个数,d为属性个数,其中 X \bm{X} X为 ( m ∗ d ) (m*d) (m∗d), y \bm{y} y为 ( m ∗ 1 ) (m*1) (m∗1)
现实中 X T X \bm{X^TX} XTX往往不是满秩矩阵,会出现列数对于行数, X T X \bm{X^TX} XTX显然不满秩,此时可解出多个 ω ^ \bm{\widehat{\omega}} ω , 他们都能使均方误差最小化,选择哪一个解作为输出,将有学习算法的归纳偏好决定,常见的做法是引入正则化项。
也可模型预测值逼近y的衍生物,比如示例所对应的输出标记是在指数尺度上的变化,那么可以将输出标记的对数作为线性模型逼近的目标:
l n y = ω T x + b ln y = \bm{\omega^Tx} + b lny=ωTx+b
这就是“对数线性回归”。
更一般的,考虑单调可微函数。令
y = g − 1 ( ω T x + b ) y = g^{-1}(\bm{\omega^Tx} + b) y=g−1(ωTx+b)
这样得到的模型成为“广义线性模型”。
上面讨论了使用线性模型进行回归学习,但如果要做的时分类任务该如何?我们现在讨论二分类。
这时候就用到逻辑回归,与线性回归不一样的是,再线性回归( z = ω T x + b z = \bm{\omega^Tx} + b z=ωTx+b)的基础上,外面包装了一个“sigmod”函数 y = 1 1 + e − z y = \frac{1}{ 1 + e ^ {-z}} y=1+e−z1,函数图像如下。
若预测值z大于零判为正例,小于零判为负例,预测值为临界值则可任意判别。
接下去的看逻辑回归
LDA的思想:给定训练集,设法将样例投影到一条直线上,是的同样类例的投影点尽可能接近、异类投影点尽可能远离;再对新样本进行分类时,将其同样投到这条直线上,再根据投影点的位置确定新样本的类别。
令 X i 、 μ i 、 ∑ i X_i、\mu_i、\sum_i Xi、μi、∑i分别代表第 i ∈ { 0 , 1 } i \in {\{0,1\}} i∈{0,1}类示例的集合、均值向量、协方差矩阵
J = ∣ ∣ ω T μ 0 − ω T μ 1 ∣ ∣ 2 2 ω T ∑ 0 ω + ω T ∑ 1 ω = ω 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}} J=ωT∑0ω+ωT∑1ω∣∣ωTμ0−ωTμ1∣∣22=ωT(∑0+∑1)ωωT(μ0−μ1)(μ0−μ1)Tω
不失一般性,考虑N 个类别C1 , C2 ,… , CN , 多分类学习的基本思路是"拆解法飞即将多分类任务拆为若干个二分类任务求解.具体来说,先对问题进行拆分,然后为拆出的每个二分类任务训练一个分类器;在测试时,对这些分类器的预测结果进行集成以获得最终的多分类结果。这里的关键是如何对多分类任务进行拆分,以及如何对多个分类器进行集成。
最经典的拆分策略有三种. “一对一” (One vs. One,简称OvO) 、“一对多” (One vs. Rest ,简称OvR)和"多对多" (Many vs. Many,简称MvM).
加入有998个反例,2个正例,那么学习方法只需要放回一个永远将新样本预测为反例的学习器,就能达到99.8%的精度。
解决办法:
m − 、 m + m^-、m^+ m−、m+分别为正反例数目