机器学习实战 ——ch08.回归

一、基础知识准备:

1.线性回归:

1) 统计回归分析的任务:
根据x1,x2,x3,...,xp和观察值Y,去估计函数f,寻求变量之间近似的函数关系

2) 参数回归 & 线性回归:
我们常用的是,假定f函数的数学形式已知,其中若干个参数未知,要通过自变量和因变量的观察值去估计未知的参数值。这叫“参数回归”。其中应用最广泛的是f为线性函数的假设:

f(x1,x2,x3,...,xp)=b0+b1x1+b2x2+...+bpxp

这种情况叫做“线性回归”

3) 一元线性回归 & 多元线性回归:
自变量只有一个时,叫做一元线性回归

hθ(x)=θ0+θ1x

自变量有 多个时,叫做 多元线性回归
hθ(x)=θ0+θ1x1+θ2x2+...+θmxm(x0=1)

可简化为:
hθ(x)=i=0mθixi

4)分类(Classification) &回归(Regression):
共同点:都属于监督学习
区别:
分类用于预测有限的离散值,如是否得了癌症(0,1)或手写数字的判断,是0,1,2,3,4,5,6,7,8还是9等。分类中,预测的可能的结果是有限的,且提前给定的。
回归:用于预测实数值(连续值),如给定了房子的面积,地段,和房间数,预测房子的价格。

2.求解线性回归的方法:

1) 梯度下降法: 主要思想是,函数在沿着其梯度方向增加最快的,那么要找到该函数的最小值,可以沿着梯度的反方向来迭代寻找。也就是说,给定一个初始位置后,寻找当前位置函数减小最快的方向,加上一定步长即可到达下一位置,然后再寻找下一位置最快的方向来到达再下一个位置……,直至其收敛
这个可以参考coursera的《machine learning》课程中的讲解和一些blog:
http://www.cnblogs.com/fanyabo/p/4060498.html
http://www.cnblogs.com/jcchen1987/p/4401533.html
http://blog.sina.com.cn/s/blog_68c81f3901019hhp.html

2) 最小二乘法:核心思想是 平方误差之和最小
具体推导过程:http://www.cnblogs.com/fanyabo/p/4060498.html
推导结果:

θ=(XTX)1XTy⃗ 

3) 其他方法暂时未接触到,待补充

3 局部线性回归:

引入高斯核,用于解决线性回归的过拟合现象
高斯核权重公式:

ω(i,j)=exp(x(i)x2k2)

其中,x(i)为高斯分布的中心位置(x离x(i)越近,权重越大);k为高斯分布的范围(平坦程度,k越大,曲线分布范围越广,越平坦)

4.算法代码及注释:

from numpy import *

#打开一个用Tab键分割的文本文件(默认文件每行的最后一个值是目标值)
#返回文本文件所包含的数据集合、特征标签信息
def loadDataSet(filename):
    numFeat = len(open(filename).readline().split('\t')) -1
    dataMat =[]
    labelMat = []
    fr = open(filename)
    for line in fr.readlines():
        lineArr = []
        curLine = line.strip().split('\t')
        for i in range(numFeat):
            lineArr.append(float(curLine[i]))
        dataMat.append(lineArr)
        labelMat.append(float(curLine[-1]))
    return dataMat,labelMat

#根据"最小二乘法"公式计算最佳拟合曲线
def standRegres(xArr,yArr):
    xMat = mat(xArr)
    yMat = mat(yArr).T
    xTx = xMat.T * xMat
    if linalg.det(xTx) == 0.0: #当矩阵的行列式等于0,矩阵不可逆
        print "This matrix is singular, cannot do inverse"
    ws = xTx.I * (xMat.T * yMat)
    return ws

#局部加权线性回归函数(LWLR)
def lwlr(testPoint,xArr,yArr,k=0.0):
    xMat = mat(xArr)
    yMat = mat(yArr).T
    m = shape(xMat)[0]
    weights = mat(eye(m))
    for j in range(m):
        diffMat = testPoint - xMat[j,:]
        weights[i,j] = exp(diffMat *diffMat.T/(-2.0*k**2)) #高斯核
    xTx = xMat.T * (weights * xMat)
    if linalg.det(xTx) ==0.0:
        print "This matrix is singular, cannot do inverse"
    ws = xTx.I * (xMat.T * (weights * yMat))
    return testPoint * ws

#统计回归误差,便于对比
def resError(yArr,yHatArr):
    return ((yArr - yHatArr)**2).sum()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值