基本概念
线性回归,顾名思义就是用线性函数去拟合观测数据。以 X X X表示样本数据的特征, y y y表示样本数据的目标值, m m m表示观测数据的个数, n n n表示观测数据特征数,则 X X X是一个 m ∗ n m*n m∗n的矩阵, y y y是 m m m维列向量。把 y y y表示成 X X X的线性组合,即是线性回归。
模型
我们想用
X
X
X的线性组合来表示
y
y
y,那么问题来了,无论参数选的多好,
y
y
y通常不可能严格等于
X
X
X的线性组合,怎么办呢?自然是让他们越接近越好。
线性回归模型
h
θ
=
X
∗
θ
h_\theta=X*\theta
hθ=X∗θ
参数
θ
\theta
θ是一个列向量。问题归结为,如何选参数
θ
\theta
θ使
h
θ
h_\theta
hθ与
y
y
y最接近。一个最直观的评价“远近”的方式就是欧式距离,自然想到用
J
θ
=
1
2
m
(
h
θ
−
y
)
T
∗
(
h
θ
−
y
)
J_\theta=\frac{1}{2m}(h_\theta-y)^T*(h_\theta-y)
Jθ=2m1(hθ−y)T∗(hθ−y)来评价回归结果
h
θ
h_\theta
hθ与目标值
y
y
y之间的差异。
J
θ
J_\theta
Jθ身份很高,意义重大,所有它有好多名字,代价函数(Cost function)、损失函数(Loss function)等等,whatever,它就是回归结果与目标值之间的一种距离度量,距离越近,模型大概率(还有过拟合情况)越好。
求解
问题最终归结为找使 J θ J_\theta Jθ达到全局最小值的 θ \theta θ,这个问题解法很多,数值计算领域,基于梯度的解法最为常见,如梯度下降法。其思路就是以某个位置 θ 0 \theta_0 θ0为出发点,沿着其梯度的反方向 − ∂ J θ ∂ θ ( θ 0 ) -\frac{\partial J_\theta}{\partial\theta}(\theta_0) −∂θ∂Jθ(θ0)是函数值下降最快的方向,具体计算公式为 θ = θ − α X T ∗ ( h θ − y ) \theta=\theta-\alpha X^T*(h_\theta-y) θ=θ−αXT∗(hθ−y)其中, α \alpha α是一个步长控制系数,使迭代步长不至于太长以错过最优解,也不至于太短以至迟迟达不到终点,实际操作中 α \alpha α可以试几个之后选定一个比较合适的值。另外还有比梯度下降更好的算法,如共轭梯度,本人尚未做深入研究,不再深入,但需知道这些算法可以更快收敛,且不需要操心如何选择 α \alpha α。
收敛技巧
实际问题中,数据特征往往不止一个,且特征之间存在数量级差异,这种情况会降低算法收敛速度,可以先将数据进行标准化处理,再用梯度下降算法进行求解。 μ i = s u m ( X ( : , i ) ) m , s i = m a x ( X ( : , i ) ) − m i n ( X ( : , i ) ) \mu_i=\frac{sum(X(:,i))}{m},s_i=max(X(:,i))-min(X(:,i)) μi=msum(X(:,i)),si=max(X(:,i))−min(X(:,i))分别表示第 i i i个特征的均值和“规模”,将该特征标准化为 X ( : , i ) = X ( : , i ) − μ i s i X(:,i)=\frac{X(:,i)-\mu_i}{s_i} X(:,i)=siX(:,i)−μi每个特征都进行标准化之后,能帮助梯度下降更快收敛。
关于线性
线性回归的“线性”很容易误导,让人以为这种方法只能解决线性问题,其实不然。这里的线性,应该理解为 θ \theta θ的线性,而不应该理解成特征 X X X的线性。因为总可以增加特征的高阶项,甚至 s i n sin sin项、 l o g log log项、指数项等,来拟合非线性问题。比如 X = ( x 1 ) X=(x_1) X=(x1)只有一个特征,而通过观察发现 X X X与 y y y不是线性关系,有点像抛物线关系,那就可以扩充 X = ( x 1 , x 1 ⋅ x 1 ) X=(x_1,x_1\cdot x_1) X=(x1,x1⋅x1),把问题看成有两个特征,从而更好地拟合数据。