一、什么是线性回归
有一样本 ,包含d个属性,可以表示为 ,其中的 表示 在第 i 个属性上的取值,线性回归模型企图学得一个通过属性的线性组合来进行预测的函数,即:
,一般用向量写成,在学习获得 和 从而找到最佳拟合各个样本的直线的过程就是线性回归。
二、怎样确定 和
我们可以认为,当总体来说预测值 与实际标签 的差别最小时,即误差最小时,我们就获得了最佳拟合直线,如何衡量误差,可以用均方误差,最小化均方误差时,我们解得的 和 就是最优的。
基于均方误差最小化来进行模型求解的方法称为最小二乘法。
在线性回归中,最小二乘法就是试图找到一条直线,使所有样本到直线上的欧氏距离之和最小。
容易知道,当时,损失降到最小。
我们令,可得,
可得,令,可得。若满秩,那么可逆,
有。若样本有p个特征,那么X有p+1列,有p+1行,p+1列。有n个样本,当p+1<=n时,满秩。
简单的线性回归
def standRegres(xArr,yArr):
"""
xArr:特征向量;yArr:标签向量
"""
xMat = np.mat(xArr);
yMat = np.mat(yArr).T;
xTx = xMat.T*xMat;
if(np.linalg.det(xTx)==0): #行列式值为0
print('这个矩阵不是满秩矩阵')
return
w = xTx.I*(xMat.T*yMat)
yHat = xMat*w;
# print(yHat,yMat)
return w
三、局部加权线性回归(Locally Weighted Linear Regression)
局部加权线性回归就是给待遇测点附近的每个点都赋予一定的权重,用该种方法得:
,其中,W 为一个矩阵,用于给每个点赋予权重。LWLR 使用核函数来给附近的点增加权重,高斯核对应的权重为:,构建一个只有对角元素的权重矩阵,其中 为被侧点 的附近的点,两点越近,权重就会越大。k 值决定了要赋予附近的点多大的权重,k过大会欠拟合,过小会过拟合。
def lwlr(testPoint,xArr,yArr,k=1.0):
"""
参数分别为 待测点、特征向量、标签向量,核的值
"""
xMat = np.mat(xArr); yMat = np.mat(yArr).T
m = xMat.shape[0]
weights = np.eye(m)
for i in range(m):
diffMat = testPoint - xMat[i,:]
weights[i,i] = np.exp(-diffMat*diffMat.T/(2.0*k**2))
xTx = xMat.T*(weights*xMat)
if(np.linalg.det(xTx)==0):
print('这个矩阵不是满秩矩阵')
ws = xTx.I*(xMat.T*(weights*yMat))
return testPoint*ws