数学推导
基本概念
在整个线性回归的学习中,求得一组最优的权重是我们的目的。
权重W是一维向量,记作W=[w1 w2 .... wn].一般的,权重为n行的列向量。
特征X是一维向量,记作X=[x1 x2 x3 .....xn],一般的,特征为n行的列向量。
在二维空间中,我们有y = ax+b,现在,我们将其拓展到n维空间,则有y = w0 + w1x1 w2x2 +.....+wnxn,其中,w0称为偏置。整体记作y = (w.T)X + ε
中心极限定理
中心极限定理是概率论中随机变量分布渐进于正态分布,而ε服从正态分布。
最大似然估计(MLE)
给定一个概率分布,已知其概率密度函数或者概率质量函数f,以及分布参数θ,我们可以从这个分布中抽出一个具有n个值的采样,利用f计算其似然函数。记作
L(θ|x1,x2....xn) = f(θ)(x1,x2....xn)
即给定分布参数后出现样本组的概率。
其中,最常见的连续概率分布是正态分布
所以正态分布的线性回归的最大似然为
假设误差服从正态分布,符合中心定理,将μ置零,同时σ为常数。事件相互独立,所以可以写成
=
又因为 =
带入得到
我们要求的便是当L(θ)最大时所对应的θ*
对数似然函数
J(θ)称为损失函数,当其最小时,对应的θ为所求
解析解求法
因为等价于一个长度为m的向量乘以他自己,但是向量相乘在矩阵中要为行向量乘列向量,所以要转置其中一个。
根据转置的性质
得到
梯度
方向导数
设二元函数上有一点P(x0,y0),那么以P点为起的射线
f(x,y)在(x0,y0)可微,那么方向导数存在,
那么
记,其中,记作梯度。
即梯度是某点下降最快的方向导数。
最优解
最优解一定是一个驻点,但驻点不一定是最优解,这时我们用Hessian矩阵的半正定来判断。
Hessian矩阵
Hessian矩阵是由目标函数在X处的二阶偏导数所构成的对称矩阵。
半正定:特征值全部大于等于0
正定:特征值全部大于0
这相当于把X中的元素平方相加,结果肯定大于等于0。所以目标函数的黑塞矩阵半正定,所以函数是凸函数,驻点即为最优解。
目标函数求导
矩阵求导的性质
所以
令其等于0,得到
至此,解析解求解完成。
代码实现
import numpy as np
import matplotlib.pyplot as plt
X1 = 2 * np.random.rand(100,1)#创建一百行一列的列向量
X2 = 3 * np.random.rand(100,1)
#这里的y是真实值,等于y_hat+error
y = 5 + 4*X1 + 3*X2 + np.random.randn(100,1)#error服从正态分布
X_b = np.c_[np.ones((100,1)),X1,X2]
print(X_b)
theta = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
print(theta)
#使用模型进行预测
X_new = np.array([[0,0],
[2,3]])
X_new_b = np.c_[np.ones((2,1)),X_new]
print(X_new)
y_predict = X_new_b.dot(theta)
print(y_predict)
可视化
fig = plt.figure()
ax3d = fig.add_subplot(projection='3d')
ax3d.plot(X1,X2,y,'b.')
x1 = X_new[:,0]
x2 = X_new[:,1]
Z = y_predict[:,0]
print(x1)
print(x2)
print(Z)
ax3d.plot(x1,x2,Z,color='black')
plt.show()