【机器学习】线性回归+代码实现

本文介绍了线性回归的基础,包括标准线性回归和局部加权线性回归,并探讨了过拟合问题,提出了岭回归、lasso回归和前向逐步回归作为解决方案。通过示例和代码实现,展示了如何在模型复杂性和泛化能力之间找到平衡。
摘要由CSDN通过智能技术生成

参考:《机器学习实战》
源码地址以及数据:https://github.com/JieruZhang/MachineLearninginAction_src

1. 标准线性回归(LR)

y = X w + b \mathbf{y} = \mathbf{X}w + b y=Xw+b
平 方 误 差 : ∑ i = 1 N ( y i − x i T w ) 2 平方误差:\sum_{i=1}^N (y_i - x_i^Tw)^2 i=1N(yixiTw)2
导 数 为 零 求 得 : w ^ = ( X T X ) − 1 X T y 导数为零求得:\hat{w} = (\mathbf{X}^T\mathbf{X})^{-1}\mathbf{X}^Ty w^=(XTX)1XTy
目标:最小平方误差
注意,需要先判断矩阵是否可逆,判断方法:行列式不为零。

from numpy import *
import matplotlib.pyplot as plt

#读取数据
def loadDataSet(filename):
    numFeat = len(open(filename).readline().split('\t'))-1
    dataMat = []; labelMat = []
    fr = open(filename)
    for line in fr.readlines():
        lineArr = []
        curLine = line.strip().split('\t')
        for i in range(numFeat):
            lineArr.append(float(curLine[i]))
        dataMat.append(lineArr)
        labelMat.append(float(curLine[-1]))
    return dataMat, labelMat

#标准线性回归函数
def standRegres(xArr, yArr):
    xMat = mat(xArr)
    yMat = mat(yArr).T
    xTx = xMat.T * xMat
    #判断行列式为零,则无法求逆
    if linalg.det(xTx) == 0:
        print('the matrix is singular, cannot do inverse')
        return
    ws = (xTx).I * (xMat.T*yMat)
    return ws

#拟合数据
xArr, yArr = loadDataSet('ex0.txt')
ws = standRegres(xArr, yArr)
xMat = mat(xArr)
yMat = mat(yArr)
yHat = xMat*ws
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(xMat[:,1].flatten().A[0], yMat.T[:,0].flatten().A[0])
xCopy = xMat.copy()
xCopy.sort(0)
yHat = xCopy*ws
ax.plot(xCopy[:,1], yHat)
plt.show()

在这里插入图片描述

计算 y ^ \hat{y} y^ y y y 之间的相关系数,用来判断预测值和实际值的匹配程度。

yHat = xMat*ws
corrcoef(yHat.T, yMat)
array([[1.        , 0.97223133],
       [0.97223133, 1.        ]])

2. 局部加权线性回归(LWLR)

标准线性回归依据最小均方误差(MSE),则可能会导致欠拟合。因此可以在估计中加入偏差,降低预测的均方误差。
局部加权线性回归:给待遇测点附近每个点赋予一定的权重,然后继续进行最小均方差回归。设置一个权重矩阵 W W W,给每个数据点赋予一个权重。可以使用 来给附近的点赋予更大的权值,常用的是高斯核:
w ( i , i ) = e x p ( ∣ x ( i ) − x ∣ − 2 k 2 ) w(i,i) = exp(\frac{|x^(i) - x|}{-2k^2}) w(i,i)=exp(

  • 11
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值