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

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

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

Faster R-CNN学习笔记

R-CNN学习笔记:http://blog.csdn.NET/xzzppp/article/details/51345742 Fast R-CNN学习笔记:http://blog.csdn.net/...

Area poj1265 (pick公式+网格)

Area Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6457   Accepted: 2823 D...

[机器学习]斯坦福公开课-第3课-局部加权线性回归和logistic回

紧接着上一节公开课,第三节老师在线性回归算法的基础上讲了局部加权回归(LOESS)和logistic回归 首先,我们明确几个概念: (1)欠拟合 过拟合 (2)非参数学习算法:参数的数量会随着m的增多...

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

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

局部加权线性回归算法

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

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

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

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

局部线性回归(备忘)

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

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

局部加权线性回归(内含代码)

在之前的博客中我们已经简单讨论过一些回归的算法,如使用假设和梯度下降法的单变量线性回归和多变量线性回归以及采用正规方程的线性回归,这次我们简单讨论一下局部加权线性回归(Local Weighted L...

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

局部加权线性回归Locally weighted linear regression
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线性回归以及局部加权回归
举报原因:
原因补充:

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