机器学习-线性回归

线性回归

简介:之前的文章中介绍过一种回归算法,梯度下降算法,这里再看看另外一个回归算法,线性回归,主要的内容包括简单的线性回归和局部加权回归算法。

在回归里面需要考虑的问题就是,我如何通过一堆训练数据求出回归方程?例如通过房间的面积,体积,地理位置等信息预测房间的售价。在训练数据中 面积、体积、地理位置我们统称为特征值使用 X 表示通常情况下X都为一个矩阵,最终房间的售价 Y 。针对预测结果中的某条数据 X1 预测结果将会通过 y1=XT1w 计算得到,这里的 w 叫回归系数,通过训练数据我们需要找出误差(得到的w使得测试y和真实y之前的差值)最小的 w ,一种简单有效的方式是采用平方差:

i=1m(yixTiw)2(1)
对w求导,得到 XT(yXw) ,令其等于零,得到 w=(XTX)1XTy

简单的线性回归

通过上面的推导得到的公式 w=(XTX)1XTy ,我们便能通过代码实现从训练集合中找到最优的回归系数w。
具体算法:

from numpy import *

#xArr 为 m x n 的一个数组
#yArr 为 1 x m 的一个数组
def standRegres(xArr, yArr):
    xMat = mat(xArr); yMat = mat(yArr).T
    xTx = xMat.T * xMat
    if linalg.det(xTx) == 0.0 : ##说明xTx不可逆
        return
    ws = xTx.I * (xMat.T * yMat)

    return ws

局部加权线性回归

上述的线性回归方法的一个问题是可能会出现欠拟合现象,它求的是最小误差的估计,针对的是全局最小误差,如果说模型本身就是一个欠拟合模型则不能通过上述方法取得最好的预测效果。为了解决这个问题引出了局部加权线性回归,在这个算法中我们给待预测点附近的每个点赋予一定的权重值,然后再选出的附近子集的基础上采用最小方差进行回归 w=(XTWX)1XTWy 这里面的W为每个点权重,是一个矩阵,W的计算公式可以自由选择,但是常见的使用高斯函数 W(i,i)=exp(|x(i)x|2k2) ,k为用户指定的的参数,k决定了给附近点赋予多大的权重,当k值越小那么邻近的点拥有越大的权重,而越远的点权重比越小。
算法实现

def lwlr(testPoint, xArr, yArr, k=1.0):
    xMat = mat(xArr); yMat = mat(yArr).T
    m = shape(xMat)[0]
    ##构造一个对角矩阵
    weights = mat(eys((m)))

    for j in range(m):
        diffMat = testPoint - xMat[j:]
        weights[j,j] = exp(diffMat * diffMat.T/(-2.0*k**2))

    xTx = xMat.T * (weights * xMat)
    if linalg.det(xTx) ==0.0:
        return 

    ws = xTx.I * (xMat.T * (weights * yMat))

    return testPoint * ws

局部加权需要通过不断调整k值,是预测结果尽量准确,不同的k值对预测结果影响很大,另外通过上面的算法实现可以看出局部加权线性回归存在一个问题即,在每次预测目标值时都需要回归整个训练数据集,所以计算量很大。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值