关闭

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

标签: 数学数据测试
127人阅读 评论(0) 收藏 举报
分类:

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
'''

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:26029次
    • 积分:1424
    • 等级:
    • 排名:千里之外
    • 原创:111篇
    • 转载:2篇
    • 译文:0篇
    • 评论:4条
    博客专栏