利用回归预测数值型数据

  1. 线性回归

        线性回归中的数学知识

在线性回归中,最重要的莫过于在一大堆的数据中找回归方程

比较简单的方法是,可以利用最小二乘法寻找误差最小的那条直线.

利用最小二乘法计算loss可以写为:

        104809_GdBm_3264690.png

为了找到loss最小的那条直线,我们可以对w求导,得到

        001848_RPCz_3264690.png

        001901_86Qp_3264690.png

因此求回归方程转变为求参数w.

        实现代码

def standRegres(xArr,yArr):
    xMat=np.mat(xArr)
    yMat=np.mat(yArr).T
    xTx=xMat.T*xMat
    if np.linalg.det(xTx)==0.0:
        print('error')
        return
    ws=xTx.I*(xMat.T*yMat)
    return ws

求出参数w

        将回归直线去拟合实际数据

import matplotlib.pyplot as plt
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()

可以看到虽然直线显示了大概的趋势,但并不能很好的去拟合数据,下面介绍一种强大的回归--""局部加权线性回归"",可解决上面这个拟合度不够的问题.

    2. 局部加权线性回归

        局部加权线性回归中的数学知识

相对于线性回归 , 局部加权的意思是对于每一个特征 , 都给添加一个权重 , 然后基于普通的最小均方差来进行回归.

这里使用高斯核进行计算每一个点的权重

        003025_DCov_3264690.png

对于w^的计算和上面类似,只是添加了权重w

        003119_ybKW_3264690.png

        实现代码

def lwlr(testPoint,xArr,yArr,k=1.0):
    xMat=np.mat(xArr)
    yMat=np.mat(yArr).T
    m=np.shape(xMat)[0]
    weights=np.mat(np.eye((m)))
    for j in range(m):
        diffMat=testPoint-xMat[j,:]
        weights[j,j]=np.exp(diffMat*diffMat.T/(-2.0*k**2))
    xTx=xMat.T*(weights*xMat)
    if np.linalg.det(xTx)==0.0:
        print("error")
        return
    ws=xTx.I*(xMat.T*(weights*yMat))
    return testPoint*ws
def lwlrTest(testArr,xArr,yArr,k=1.0):
    m=np.shape(testArr)[0]
    yHat=np.zeros(m)
    for i in range(m):
        yHat[i]=lwlr(testArr[i],xArr,yArr,k)
    return yHat

        拟合效果

    

import matplotlib.pyplot as plt
fig=plt.figure()
ax=fig.add_subplot(111)
ax.plot(xSort[:,1],yHat[srtInd])
ax.scatter(xMat[:,1].flatten().A[0],np.mat(yArr).T.flatten().A[0],s=2,c='red')
plt.show()

代码和数据均已上传到,有需要的朋友可以下载..

GitHub

码云

转载于:https://my.oschina.net/u/3264690/blog/1592376

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值