版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/love__live1/article/details/82869338
C++实现线性回归
线性模型
f(x)=ω1x1+ω2x2+ω3x3+...+ωdxd+b
f(x)=ωTx+b
其中
ω=(ω1;ω2;ω3;....;ωd),x=(x1;x2;...;xd)T
线性回归
线性回归试图学得
f(xi)=ωxi+b
使得
f(xi)≃yi
如何求得
ω和
b,关键在于衡量
f(xi)≃yi,他们之间相差越小,结果越好,于是有
(ω∗,b∗)=ω,bargmini=1∑m(f(xi)−yi)2=ω,bargmini=1∑m(yi−ωxi−b)2
化为一般式:
ω
∗=ωargmin(y−Xω
)T(y−Xω
)
对上式的
ω和
b求导,当
XTX为满秩矩阵或者正定矩阵式,令其等于零得到
ω
∗=(XTX)−1XTy
最后求的线性回归模型为:
f(x
i)=x
i(XTX)−1XTy
m为数据集个数,d为属性个数,其中
X为
(m∗d),
y为
(m∗1)
现实中
XTX往往不是满秩矩阵,会出现列数对于行数,
XTX显然不满秩,此时可解出多个
ω
, 他们都能使均方误差最小化,选择哪一个解作为输出,将有学习算法的归纳偏好决定,常见的做法是引入正则化项。
也可模型预测值逼近y的衍生物,比如示例所对应的输出标记是在指数尺度上的变化,那么可以将输出标记的对数作为线性模型逼近的目标:
lny=ωTx+b
这就是“对数线性回归”。
更一般的,考虑单调可微函数。令
y=g−1(ωTx+b)
这样得到的模型成为“广义线性模型”。
对数几率回归(逻辑回归)
上面讨论了使用线性模型进行回归学习,但如果要做的时分类任务该如何?我们现在讨论二分类。
这时候就用到逻辑回归,与线性回归不一样的是,再线性回归(
z=ωTx+b)的基础上,外面包装了一个“sigmod”函数
y=1+e−z1,函数图像如下。
若预测值z大于零判为正例,小于零判为负例,预测值为临界值则可任意判别。
- 将z带入sigmod函数,得
y=1+e−(ωTx+b)1
- 然后化为
ln1−yy=ωTx+b
- 若将
y视为
x作为正例的可能性,则
1−y是其反例的可能性,两者的比值成为“几率”。
接下去的看逻辑回归
线性判别分析(LDA)
LDA的思想:给定训练集,设法将样例投影到一条直线上,是的同样类例的投影点尽可能接近、异类投影点尽可能远离;再对新样本进行分类时,将其同样投到这条直线上,再根据投影点的位置确定新样本的类别。
令
Xi、μi、∑i分别代表第
i∈{0,1}类示例的集合、均值向量、协方差矩阵
- 两类样本的中心在直线上的投影分别为
ωTμ0和
ωTμ1;
- 若将所有样本点都投影到直线上,则两类样本的协方差分别为
ωT∑0ω和
ωT∑1ω;
- 我们的目的是
ωT∑0ω+ωT∑1ω尽可能小,使
∣∣ωTμ0−ωTμ1∣∣22尽可能大;
J=ωT∑0ω+ωT∑1ω∣∣ωTμ0−ωTμ1∣∣22=ωT(∑0+∑1)ωωT(μ0−μ1)(μ0−μ1)Tω
- 定义类内散度矩阵
Sw=0∑+1∑=x∈X0∑(x−μ0)(x−μ0)T+x∈X0∑(x−μ1)(x−μ1)T
- 定义类间散度矩阵
Sb=(μ0−μ1)(μ0−μ1)T
J=ωTSwωωTSbω
- 确定
ω
minω−ωTSbωs.t.ωTSwω=1
- 由拉格朗日乘子法,得
Sbω=λSωω
-
Sbω的方向恒为
μ0−μ1,令
Sbω=λ(μ0−μ1)
- 于是带入得
ω=Sω−1(μ0−μ1)
多分类学习
不失一般性,考虑N 个类别C1 , C2 ,… , CN , 多分类学习的基本思路是"拆解法飞即将多分类任务拆为若干个二分类任务求解.具体来说,先对问题进行拆分,然后为拆出的每个二分类任务训练一个分类器;在测试时,对这些分类器的预测结果进行集成以获得最终的多分类结果。这里的关键是如何对多分类任务进行拆分,以及如何对多个分类器进行集成。
最经典的拆分策略有三种. “一对一” (One vs. One,简称OvO) 、“一对多” (One vs. Rest ,简称OvR)和"多对多" (Many vs. Many,简称MvM).
类别不平衡
加入有998个反例,2个正例,那么学习方法只需要放回一个永远将新样本预测为反例的学习器,就能达到99.8%的精度。
解决办法:
- 对数据过多的一方进行欠采样
- 对数据过少的一方进行过采样
- 基于原始数据集进行学习,但是在用训练好的分类器进行预测时,加入一个策略到其决策过程,成为“阈值移动”。
1−y′y′=1−yy∗m+m−
m−、m+分别为正反例数目