机器学习实战-预测数值型数据:回归

本文介绍了回归分析在预测数值型数据中的应用,包括线性回归、局部加权线性回归(LWLR)以及解决特征过多问题的岭回归和lasso回归。线性回归通过最小化误差平方和找到最佳拟合线,LWLR通过赋予数据点权重来改进。在特征大于样本时,岭回归和lasso回归通过缩减技术减少模型复杂度。文章通过鲍鱼年龄预测和乐高价格预测举例说明了回归模型的建立和评估。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,用线性回归找到最佳拟合直线

回归的目的是预测数值型的目标值。

回归方程(regression equation)主要是求回归系数,一旦有了回归系数,在给定输入,做预测就是用回归系数乘以输入值,在将结果全部加在一起,就得到了预测值。(因为回归系数是一个向量,输入也是向量,这些运算就是求出二者的内积)

回归的一般方法:

1)收集数据:采用任意方法收集数据

2)准备数据:回归需要数值型数据,标称型数据将被转换为二值型数据

3)分析数据,二维图

4)训练算法:找到回归系数

5)测试算法:使用R^{2}或者预测值和数据的拟合度,来分析模型的效果

6)使用算法:使用回归,在给定的时候预测出一个数值

求回归方程:

假定输入数据存放在矩阵X中,而回归系数存放在向量w中。那么对于给定的数据x_{1},预测结果将会通过Y_{1}=X_{1}w给出。通过x,y数据找到回归系数向量w,一个常用的方法是找出误差最小的w。这里的误差是指预测值和真实值之间的差值。避免正差值和负差值之间相互抵消,因此采用平方误差。

平方误差可以写作

\sum_{i=1}^{m}(y_{i}-x_{i}^Tw)^2

用矩阵表示还可以写作\hat{w}=(Y-Xw)^{T}(Y-Xw),如果对w求导,得到X^{T}(Y-Xw),令其等于零,解出w

\hat{w}=(X^TX)^{-1}X^Ty

w上方的小标记表示,这事当前可以估计出的w的最优解,从现有数据上估计出的w可能并不是数据中的真实值,所以这里使用了一个"帽"符号来表示是w的一个最佳估计。注意:公式中包含(X^TX)^{-1},也就是需要对矩阵求逆,代码中需要判断矩阵的逆到底存不存在

另外还可以使用NumPy库中的矩阵方法,该方法叫OLS,意思是“普通最小二乘法”(ordinary least squares)

from numpy import *

#加载数据
def loadDataSet(fileName):      #general function to parse tab -delimited floats
    numFeat = len(open(fileName).readline().split('\t')) - 1 #get number of fields 
    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.0:# det判断行列式
        print ("This matrix is singular, cannot do inverse")
        return
    ws = xTx.I * (xMat.T*yMat)
    return ws


import matplotlib.pyplot as plt
xmat=mat(xarr)
ymat=mat(yarr)
yhat=xmat*ws
fig=plt.figure()
ax=fig.add_subplot(111)
#a是个矩阵或者数组,a.flatten()就是把a降到一维,默认是按横的方向降
# 此时的a是个矩阵,降维后还是个矩阵,矩阵.A(等效于矩阵.getA())变成了数组,A[0]就是数组里的第一个元素
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.savefig("2.png")
plt.show()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值