python怎么做回归 python中回归的含义_高斯拟合 vc代码

作者:Keivan Chan

回归的一些概念

1、什么是回归:

目的是预测数值型的目标值,它的目标是接受连续数据,寻找最适合数据的方程,并能够对特定值进行预测。这个方程称为回归方程,而求回归方程显然就是求该方程的回归系数,求这些回归系数的过程就是回归。

2、回归和分类的区别:

分类和回归的区别在于输出变量的类型。

定量输出称为回归,或者说是连续变量预测;

定性输出称为分类,或者说是离散变量预测。

本文将会介绍2种常见的回归模型的概念及其优缺点,更有对应的python代码;

  • 线性回归(Linear Regression)

局部加权线性回归(Locally weighted linear regression)

一、线性回归

我们做线性回归是为了得到一个最优回归系数向量w使得当我们给定一个x能够通过y=xw预测y的值。假定输入数据存放在矩阵 X 中,而回归系数存在在向量 w 中。那么对于给定的数据X1,预测结果将会通过Y1=XT1w给出。
那么怎样的w才是最优的呢?在标准线性回归中我们需要找到是误差最小的w, 即预测的y值与真实的y值之间的差值,为了避免简单累加造成的正负差值相互抵消,这里采用了平方误差:

python怎么做回归 python中回归的含义_python矩阵求逆_02

平方误差用矩阵可表示为:(y-Xw)T(y-Xw)

因为要求函数的极小值,对w求导可得:

python怎么做回归 python中回归的含义_python矩阵求逆_03

对w求导使其等于0,便可求出W的最优解:

python怎么做回归 python中回归的含义_高斯拟合 vc++代码_04

求出w

上述求w最优解的方法也叫做最小二乘法。
需要注意的是,上述公式中包含(XTX)-1,也就是需要对矩阵求逆,因此这个方程只有在逆矩阵存在的时候有用,所以我们写代码时必须需要事先确定矩阵是否可逆。

# 线性回归def standRegress(xArr, yArr):# 用mat函数转换为矩阵之后可以才进行一些线性代数的操作    xMat = mat(xArr); yMat = mat(yArr).T# XtX    xTx = xMat.T * xMat# 判断矩阵是否可逆if linalg.det(xTx) == 0:        print("This matrix is singular, cannot do inverse")return# 根据公式计算w    w_hat = xTx.I * (xMat.T * yMat)return w_hat

python怎么做回归 python中回归的含义_线性回归_05

线性回归的几个特点:1. 建模速度快,不需要很复杂的计算,在数据量大的情况下依然运行速度很快。2. 可以根据系数给出每个变量的理解和解释3. 对异常值很敏感

二、 局部加权线性回归

我们知道线性回归的一个问题就是欠拟合,将不能取得很好的预测效果。因为它是具有最小均方误差的无偏估计。解决这个问题的方法就是允许在估计中一些偏差。其中一个非常有效的方法就是局部加权线性回归(LWLR)。

Y=a1∗X1+a2∗X22+a3∗X33+...+an∗Xnn+b" role="presentation" style=" box-sizing: border-box; outline: 0px; font-family: "Microsoft YaHei", "SF Pro Display", Roboto, Noto, Arial, "PingFang SC", sans-serif; display: inline; line-height: normal; text-align: left; overflow-wrap: break-word; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; color: rgb(77, 77, 77); font-variant-ligatures: common-ligatures; background-color: rgb(255, 255, 255); ">

我们用θ表示回归系数,w表示权重, 那么平方误差的表达式就变成:

python怎么做回归 python中回归的含义_高斯拟合 vc代码_06

用矩阵可表示为:

python怎么做回归 python中回归的含义_高斯拟合 vc++代码_07

对θ求导,令其等于0求极值得:

python怎么做回归 python中回归的含义_线性回归_08

其中的W是一个矩阵,用来给每个数据点赋予权重。那我们怎么计算这个W呢?
LWLR使用“核”(与支持向量机中的核类似)来对附近的点赋予更高的权重。核的类型可以自由选择,最常用的是高斯核,高斯核对应的权重如下:

python怎么做回归 python中回归的含义_python矩阵求逆_09

通过公式可以看到如果xi距离x的距离越小,W(i)就会越大,其中参数k决定了权重的大小。k越大权重的差距就越小,k越小权重的差距就很大

# 局部加权线性回归def lwlr(testPoint, xArr, yArr, k=1.0):# 先把数组转为矩阵,方便进行线性代数操作    xMat = mat(xArr); yMat = mat(yArr).T# shape():返回矩阵的维数,是个数组    numLine = shape(xMat)[0]# eye(num): 生成一个对角矩阵(对角线全为1,其它为0)    weights = mat(eye(numLine))#计算权重for i in range(numLine):# x(i) - x        diffMat = testPoint - xMat[i, :]        weights[i, i] = exp(diffMat * diffMat.T / (-2 * k ** 2))    xTx = xMat.T * (weights * xMat)if linalg.det(xTx == 0.0): #矩阵不可逆        print("This matrix ix singular, cannot do inverse")return# 根据公式求出回归系数w    w = xTx.I * xMat.T * weights * yMatreturn testPoint * wdef lwlrTest(testArr, xArr, yArr, k=1):    numLines = shape(testArr)[0]# 初始化y值,全为0    yHat = zeros(numLines)for i in range(numLines):        yHat[i] = lwlr(testArr[i], xArr, yArr, k)return yHat

python怎么做回归 python中回归的含义_高斯拟合 vc代码_10

python怎么做回归 python中回归的含义_高斯拟合 vc代码_11

python怎么做回归 python中回归的含义_高斯拟合 vc代码_12

从结果来看 局部线性回归能很好地解决线性回归欠拟合的问题,但又可能出现过拟合。

所以参数调整影响了模型的泛化能力。选取合适参数至关重要。

虽然局部线性回归能增强模型的泛化能力。但是它也有自己的缺陷。就是对每个点的预测都必须使用整个数据集。这样大大增加了计算量。