线性回归以及局部加权回归

原创 2017年08月02日 18:20:56

0 回归的含义

回归 英文:regress
用了倒推的含义,利用了数学的归纳思想,回归系数*数据求和得到估值(后话)

1 线性回归

  • 线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。(源自百度)

1-1 数学公式

  • 一次方程 y = ax + b
  • 回归方程 y^=ax+b 其中求回归系数的过程就是回归

1-2 误差以及公式(最小二乘法)

  • 因为正负误差加和会引起抵消
  • 所以误差分析应用了最小二乘法(就是平方误差)
  • error = ni=0(yixiW)
  • 矩阵转换 error = (YXiW)2=(YXiW)T(YXiW)
  • 求导 XT(YXW) 令其等于零求极值得到 w^=(XTX)1XTy

1-3 伪代码

'''
计算xTx
if 行列式==0
   报错处理不能后续计算
else:
   计算ws = xTx.I * xTy
返回回归参数ws
'''

1-4 代码 见下文2-4

1-5 图像以及结果

线性回归

1-6 优缺点与改进

  • 优点 : 简单,易于理解(数学部分不算)
  • 缺点 : 很明显 对非线性拟合不好
  • 改进 : 局部加权回归

2. 局部加权回归

  • 简单来说,这个过程其实是在先拟合出一条曲线,然后再用这个曲线去预测需要预测的点。(源自百度)
  • 为什么改进要用加权回归呢? 很简单,因为非线性拟合出直线误差会很大,这里的局部加权类似于knn算法的权重,即距离中心点越近的权重越大,对拟合曲线的影响也就越大,所以也有了局部加权这一名词。

2-1 数学公式 图像 以及 思想

  • 在线性回归中 w^=(XTX)1XTy
  • 体现出加权(weight)的思想 , 则有w^=(XTWX)1XTWy
  • 权重是越靠近核的权重越高,这个核最常用的就是高斯核了,高斯核对应的权重为 w(i,i)=exp(|xix|22k2) , 下面给出高斯核函数的几个小图像便于理解

k = 1

k = 0.5

k = 0.1

其中,橙色星号点代表着核(中心点),而k就是他的宽度系数了,宽度在图像上很好体现,k越大对核影响越大,反之越小,在本文局部加权回归中高斯核函数是应用于所有点的,所以所有点都要当作一次”核”来计算”局部”权重。

2-2 伪代码

'''
传入参数:系数k,核坐标(中心点坐标)
建立单位矩阵
    for 所有点
        计算点与中心点差值根据高斯核函数 更新权值w
    求xTWx
    判断行列式是否为0
    计算ws = xTxW.I * xWTy
返回point*ws (预测值)
'''

2-3 代码 (包含本文所有代码)

# coding:utf-8

import datetime
from numpy import *
import pylab as pl

# 加载数据集
def loadData(fileName):
    dataMat = []
    labelMat = []
    with open(fileName) as txtFile:
        for line in txtFile.readlines():
            labelMat.append(map(float, line.split())[-1])
            dataMat.append(map(float, line.split())[0:-1])
    return dataMat, labelMat


# 线性回归
def standRegres(dataSet, labelSet):
    xMat = mat(dataSet)
    yMat = mat(labelSet).T
    xTx = xMat.T * xMat
    if linalg.det(xTx) is 0.0:
        print "Warning !!!"
        return
    ws = xTx.I * (xMat.T * yMat)
    return ws # 回归系数

# 局部加权回归
def lwlr(testPoint, xArr, yArr, k):
    m = shape(xArr)[0]
    weight = eye((m))
    for i in range(m):
        error = xArr[i, :] - testPoint
        weight[i, i] = exp((error * error.T) / (-2.0 * k ** 2)) # 高斯核函数
    xTWx = xArr.T * (weight * xArr)
    if linalg.det(xTWx) is 0.0:
        print "Warning !!!"
        return
    ws = xTWx.I * (xArr.T * (weight * yArr))
    return testPoint * ws # 预测值

# 对每个点进行高斯函数求值
def lwlrTest(xArr, yArr, k=1):
    yPre = zeros(shape(xArr)[0])
    # print "k is:", k
    len = shape(xArr)[0]
    for i in range(len):
        yPre[i] = lwlr(xArr[i], xArr, yArr, k)
    return yPre # yPre是预测值

# 打印图像
def outPic(xArr, yArr, yPre, theta, k):
    # 线性回归
    theta = theta.tolist()
    pl.xlim(-0.1, 1.1, 0.1)
    pl.ylim(2.5, 5, 0.1)
    pl.scatter(xArr[:, -1], yArr, s=8, color='red', alpha=1)
    x = arange(-0.1, 1.1, 0.1)
    yHat = theta[0] + theta[1] * x  # 方程 y=ax+b
    pl.plot(x, yHat, '-')
    pl.show()
    # 局部加权回归
    pl.scatter(xArr[:, 1], yArr, s=8, color='red', alpha=1)
    xArr = mat(xArr)
    srtInd = xArr[:, 1].argsort(0)
    xSort = xArr[srtInd][:, 0, :]
    pl.plot(xSort[:, 1], yPre[srtInd], '-') 
    pl.xlabel("k = %.2f" % k)
    pl.show()


if __name__ == '__main__':
    # 时间开始
    past = datetime.datetime.now()
    xArr, yArr = loadData("ex0.txt")
    theta = standRegres(xArr, yArr)  # 为了与下面的权重区分 用了theta -> 'θ'
    xArr = mat(xArr)
    yArr = mat(yArr).T
    k = 0.03  # 高斯核函数中的宽度系数
    yPre = lwlrTest(xArr, yArr, k)  # 每个点进行高斯核函数
    # outPic(xArr, yArr, yPre, theta, k) # 打印图像,可选
    # 打印耗时
    print "耗时为:", datetime.datetime.now() - past

2-4 图像以及分析

k = 1

k = 0.03

k = 0.01

可以看见 当k=1的时候就’是’线性回归
k=0.01 似乎是有点过于拟合,噪点太多
k=0.03 在三者中效果最好

附 测试数据

# ex0.txt 200*3
'''
1.000000    0.067732    3.176513
1.000000    0.427810    3.816464
1.000000    0.995731    4.550095
1.000000    0.738336    4.256571
1.000000    0.981083    4.560815
1.000000    0.526171    3.929515
1.000000    0.378887    3.526170
1.000000    0.033859    3.156393
1.000000    0.132791    3.110301
1.000000    0.138306    3.149813
1.000000    0.247809    3.476346
1.000000    0.648270    4.119688
1.000000    0.731209    4.282233
1.000000    0.236833    3.486582
1.000000    0.969788    4.655492
1.000000    0.607492    3.965162
1.000000    0.358622    3.514900
1.000000    0.147846    3.125947
1.000000    0.637820    4.094115
1.000000    0.230372    3.476039
1.000000    0.070237    3.210610
1.000000    0.067154    3.190612
1.000000    0.925577    4.631504
1.000000    0.717733    4.295890
1.000000    0.015371    3.085028
1.000000    0.335070    3.448080
1.000000    0.040486    3.167440
1.000000    0.212575    3.364266
1.000000    0.617218    3.993482
1.000000    0.541196    3.891471
1.000000    0.045353    3.143259
1.000000    0.126762    3.114204
1.000000    0.556486    3.851484
1.000000    0.901144    4.621899
1.000000    0.958476    4.580768
1.000000    0.274561    3.620992
1.000000    0.394396    3.580501
1.000000    0.872480    4.618706
1.000000    0.409932    3.676867
1.000000    0.908969    4.641845
1.000000    0.166819    3.175939
1.000000    0.665016    4.264980
1.000000    0.263727    3.558448
1.000000    0.231214    3.436632
1.000000    0.552928    3.831052
1.000000    0.047744    3.182853
1.000000    0.365746    3.498906
1.000000    0.495002    3.946833
1.000000    0.493466    3.900583
1.000000    0.792101    4.238522
1.000000    0.769660    4.233080
1.000000    0.251821    3.521557
1.000000    0.181951    3.203344
1.000000    0.808177    4.278105
1.000000    0.334116    3.555705
1.000000    0.338630    3.502661
1.000000    0.452584    3.859776
1.000000    0.694770    4.275956
1.000000    0.590902    3.916191
1.000000    0.307928    3.587961
1.000000    0.148364    3.183004
1.000000    0.702180    4.225236
1.000000    0.721544    4.231083
1.000000    0.666886    4.240544
1.000000    0.124931    3.222372
1.000000    0.618286    4.021445
1.000000    0.381086    3.567479
1.000000    0.385643    3.562580
1.000000    0.777175    4.262059
1.000000    0.116089    3.208813
1.000000    0.115487    3.169825
1.000000    0.663510    4.193949
1.000000    0.254884    3.491678
1.000000    0.993888    4.533306
1.000000    0.295434    3.550108
1.000000    0.952523    4.636427
1.000000    0.307047    3.557078
1.000000    0.277261    3.552874
1.000000    0.279101    3.494159
1.000000    0.175724    3.206828
1.000000    0.156383    3.195266
1.000000    0.733165    4.221292
1.000000    0.848142    4.413372
1.000000    0.771184    4.184347
1.000000    0.429492    3.742878
1.000000    0.162176    3.201878
1.000000    0.917064    4.648964
1.000000    0.315044    3.510117
1.000000    0.201473    3.274434
1.000000    0.297038    3.579622
1.000000    0.336647    3.489244
1.000000    0.666109    4.237386
1.000000    0.583888    3.913749
1.000000    0.085031    3.228990
1.000000    0.687006    4.286286
1.000000    0.949655    4.628614
1.000000    0.189912    3.239536
1.000000    0.844027    4.457997
1.000000    0.333288    3.513384
1.000000    0.427035    3.729674
1.000000    0.466369    3.834274
1.000000    0.550659    3.811155
1.000000    0.278213    3.598316
1.000000    0.918769    4.692514
1.000000    0.886555    4.604859
1.000000    0.569488    3.864912
1.000000    0.066379    3.184236
1.000000    0.335751    3.500796
1.000000    0.426863    3.743365
1.000000    0.395746    3.622905
1.000000    0.694221    4.310796
1.000000    0.272760    3.583357
1.000000    0.503495    3.901852
1.000000    0.067119    3.233521
1.000000    0.038326    3.105266
1.000000    0.599122    3.865544
1.000000    0.947054    4.628625
1.000000    0.671279    4.231213
1.000000    0.434811    3.791149
1.000000    0.509381    3.968271
1.000000    0.749442    4.253910
1.000000    0.058014    3.194710
1.000000    0.482978    3.996503
1.000000    0.466776    3.904358
1.000000    0.357767    3.503976
1.000000    0.949123    4.557545
1.000000    0.417320    3.699876
1.000000    0.920461    4.613614
1.000000    0.156433    3.140401
1.000000    0.656662    4.206717
1.000000    0.616418    3.969524
1.000000    0.853428    4.476096
1.000000    0.133295    3.136528
1.000000    0.693007    4.279071
1.000000    0.178449    3.200603
1.000000    0.199526    3.299012
1.000000    0.073224    3.209873
1.000000    0.286515    3.632942
1.000000    0.182026    3.248361
1.000000    0.621523    3.995783
1.000000    0.344584    3.563262
1.000000    0.398556    3.649712
1.000000    0.480369    3.951845
1.000000    0.153350    3.145031
1.000000    0.171846    3.181577
1.000000    0.867082    4.637087
1.000000    0.223855    3.404964
1.000000    0.528301    3.873188
1.000000    0.890192    4.633648
1.000000    0.106352    3.154768
1.000000    0.917886    4.623637
1.000000    0.014855    3.078132
1.000000    0.567682    3.913596
1.000000    0.068854    3.221817
1.000000    0.603535    3.938071
1.000000    0.532050    3.880822
1.000000    0.651362    4.176436
1.000000    0.901225    4.648161
1.000000    0.204337    3.332312
1.000000    0.696081    4.240614
1.000000    0.963924    4.532224
1.000000    0.981390    4.557105
1.000000    0.987911    4.610072
1.000000    0.990947    4.636569
1.000000    0.736021    4.229813
1.000000    0.253574    3.500860
1.000000    0.674722    4.245514
1.000000    0.939368    4.605182
1.000000    0.235419    3.454340
1.000000    0.110521    3.180775
1.000000    0.218023    3.380820
1.000000    0.869778    4.565020
1.000000    0.196830    3.279973
1.000000    0.958178    4.554241
1.000000    0.972673    4.633520
1.000000    0.745797    4.281037
1.000000    0.445674    3.844426
1.000000    0.470557    3.891601
1.000000    0.549236    3.849728
1.000000    0.335691    3.492215
1.000000    0.884739    4.592374
1.000000    0.918916    4.632025
1.000000    0.441815    3.756750
1.000000    0.116598    3.133555
1.000000    0.359274    3.567919
1.000000    0.814811    4.363382
1.000000    0.387125    3.560165
1.000000    0.982243    4.564305
1.000000    0.780880    4.215055
1.000000    0.652565    4.174999
1.000000    0.870030    4.586640
1.000000    0.604755    3.960008
1.000000    0.255212    3.529963
1.000000    0.730546    4.213412
1.000000    0.493829    3.908685
1.000000    0.257017    3.585821
1.000000    0.833735    4.374394
1.000000    0.070095    3.213817
1.000000    0.527070    3.952681
1.000000    0.116163    3.129283
'''

版权声明:有错误麻烦赐教,感激不尽~~~(转载留言哦~)

相关文章推荐

(斯坦福机器学习课程笔记)局部加权线性回归练习

题目如下import numpy as np import random import matplotlib.pyplot as plt F64='float64' def gen_sin_dot_s...

Locally weighted linear regression局部加权线性回归

局部加权线性回归Locally weighted linear regression

局部加权线性回归

通常情况下的线性拟合不能很好地预测所有的值,因为它容易导致欠拟合(under fitting),比如数据集是 一个钟形的曲线。而多项式拟合能拟合所有数据,但是在预测新样本的时候又会变得很糟糕,因...

机器学习—局部加权线性回归

局部线性回归(备忘)

机器学习中的局部加权线性回归

看下面三幅图,x 轴是房间面积,y 轴是房价。 左图是 y = θ0 + θ1x 拟合数据集的结果。可以看到数据并不贴靠在直线上,所以拟合并不好。 中图是 y = θ0 + θ1x + θ2x...

局部加权线性回归算法

http://blog.csdn.net/hujingshuang/article/details/46274723感谢这位博主无私分享思路,本人结合他的思路利用梯度下降法进行实现主要思路如下: ...

LWLR 局部加权线性回归---Python实现

局部加权线性回归 — LWLR算法介绍线性回归的一个问题是可能出现欠拟合,因为它求的是具有最小均方误差的无偏估计,可以通过引入一些偏差,从而降低均方误差。 LWLR: 算法中给待预测点附近的每个点都...

【机器学习】机器学习(三):局部加权线性回归算法、Logistic回归算法

STANFORD机器学习课程(Andrew Ng主讲),第3课学习笔记。在本节中,介绍局部加权线性回归算法(Loess/LWR)和Logistic回归算法。

局部加权线性回归及岭回归之Python实现

这里主要讨论下广义回归中的经典算法~局部加权线性回归和岭回归以及如何用Python代码实现算法。内容上虽然不是学术论文,但同样遵循学术的严谨性,因此可能会有部分数理知识。本人也很讨厌成篇的理论推导,不...

【线性回归笔记】局部加权回归

【问题】线性回归就是为了预测,我们需要知道大量训练数据并全部加入运算计算出合适的拟合函数,但如果我们的目标是只需要X0一处或几处的值,且计算能力有限无法支持全部数据量的运算,也就是全局线性回归无法实现...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)