您的位置:首页 > 其它

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

2017-08-02 18:20 295 查看

0 回归的含义

回归 英文:regress

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

1 线性回归

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

1-1 数学公式

一次方程 y = ax + b

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

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

因为正负误差加和会引起抵消

所以误差分析应用了最小二乘法(就是平方误差)

error = ∑ni=0(yi−xiW)

矩阵转换 error = (Y−XiW)2=(Y−XiW)T⋅(Y−XiW)

求导 XT⋅(Y−XW) 令其等于零求极值得到 w^=(XTX)−1⋅XTy

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)−1⋅XTy

体现出加权(weight)的思想 , 则有w^=(XTWX)−1⋅XTWy

权重是越靠近核的权重越高,这个核最常用的就是高斯核了,高斯核对应的权重为 w(i,i)=exp(|xi−x|2−2⋅k2) , 下面给出高斯核函数的几个小图像便于理解







其中,橙色星号点代表着核(中心点),而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.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-1 数学公式

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

1-3 伪代码

1-4 代码 见下文2-4

1-5 图像以及结果

1-6 优缺点与改进

局部加权回归
2-1 数学公式 图像 以及 思想

2-2 伪代码

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

2-4 图像以及分析

附 测试数据
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数学 数据 测试