当前位置: 首页>编程语言>正文

pycharm的偏最小二乘回归代码 python最小二乘回归





pycharm的偏最小二乘回归代码 python最小二乘回归,pycharm的偏最小二乘回归代码 python最小二乘回归_pycharm的偏最小二乘回归代码,第1张


回归的一些概念

1、什么是回归:

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

2、回归和分类的区别:

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

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

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

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

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

一、线性回归

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


pycharm的偏最小二乘回归代码 python最小二乘回归,pycharm的偏最小二乘回归代码 python最小二乘回归_数据_02,第2张


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

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


pycharm的偏最小二乘回归代码 python最小二乘回归,pycharm的偏最小二乘回归代码 python最小二乘回归_python 最小二乘回归 高斯核_03,第3张


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


pycharm的偏最小二乘回归代码 python最小二乘回归,pycharm的偏最小二乘回归代码 python最小二乘回归_python 最小二乘回归 高斯核_04,第4张


求出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


pycharm的偏最小二乘回归代码 python最小二乘回归,pycharm的偏最小二乘回归代码 python最小二乘回归_数据_05,第5张


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

二、 局部加权线性回归

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

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


pycharm的偏最小二乘回归代码 python最小二乘回归,pycharm的偏最小二乘回归代码 python最小二乘回归_权重_06,第6张


用矩阵可表示为:


pycharm的偏最小二乘回归代码 python最小二乘回归,pycharm的偏最小二乘回归代码 python最小二乘回归_pycharm的偏最小二乘回归代码_07,第7张


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


pycharm的偏最小二乘回归代码 python最小二乘回归,pycharm的偏最小二乘回归代码 python最小二乘回归_线性回归_08,第8张


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


pycharm的偏最小二乘回归代码 python最小二乘回归,pycharm的偏最小二乘回归代码 python最小二乘回归_线性回归_09,第9张


通过公式可以看到如果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 * yMat
return testPoint * w

def 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


pycharm的偏最小二乘回归代码 python最小二乘回归,pycharm的偏最小二乘回归代码 python最小二乘回归_python 最小二乘回归 高斯核_10,第10张


pycharm的偏最小二乘回归代码 python最小二乘回归,pycharm的偏最小二乘回归代码 python最小二乘回归_数据_11,第11张


pycharm的偏最小二乘回归代码 python最小二乘回归,pycharm的偏最小二乘回归代码 python最小二乘回归_python 最小二乘回归 高斯核_12,第12张


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

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

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


https://www.xamrdz.com/lan/5jh1924845.html

相关文章: