zoukankan      html  css  js  c++  java
  • 《机器学习实战》笔记——regression

    本章介绍了不同场景下使用的线性回归方法

    一般情况:简单的线性回归

    欠拟合:局部加权线性回归

    特征数大于样本数:岭回归 或 lasso法

    最后引出交叉验证,用来定量地找到最佳参数值

      1 # _*_ coding:utf-8_*_
      2 
      3 # 8-1 标准回归函数和数据导入函数
      4 from numpy import *
      5 # 将数据格式化
      6 def loadDataSet(fileName):
      7     numFeat = len(open(fileName).readlines()[0].split('	')) - 1
      8     dataMat = []
      9     labelMat = []
     10     fr = open(fileName)
     11     for line in fr.readlines():
     12         lineArr = []
     13         curLine = line.strip().split('	')
     14         for i in range(numFeat):    # float()不能将整个list中的元素进行类型转换,所以用一个循环,一个元素一个元素地转换
     15             lineArr.append(float(curLine[i]))
     16         dataMat.append(lineArr)
     17         labelMat.append(float(curLine[-1]))
     18     return dataMat, labelMat
     19 
     20 # 计算系数向量w的最佳估计,其中要求xTx的逆,所以先要判断它是否为满秩矩阵(行列式不为0),
     21 # 若否,则不能进一步计算。这里并没有提供伪逆矩阵的做法
     22 def standRegres(xArr, yArr):    # 矩阵相乘要把结构改成matrix,否则array的*只能对元素进项相乘
     23     xMat = mat(xArr)
     24     yMat = mat(yArr).T
     25     xTx = xMat.T * xMat
     26     if linalg.det(xTx) == 0.0:  # numpy提供了一个线性代数库linalg(linear algebra),
     27                                 # 其中包含计算行列式(determinant)的方法det(),
     28                                 # 为什么可以用==比较浮点数?????????????
     29         print "This matrix is singular, cannot do inverse"
     30         return
     31     ws = xTx.I * (xMat.T * yMat)
     32     return ws
     33 
     34 # 效果
     35 
     36 xArr,yArr = loadDataSet('ex0.txt')
     37 print xArr[0:2]
     38 
     39 ws = standRegres(xArr,yArr)
     40 
     41 xMat=mat(xArr)
     42 yMat=mat(yArr)
     43 yHat=xMat*ws    #y的预测值
     44 
     45 import matplotlib.pyplot as plt
     46 fig = plt.figure()
     47 ax = fig.add_subplot(111)
     48 ax.scatter(xMat[:,1].flatten().A[0],yMat.T[:,0].flatten().A[0],10)    # flatten()方法能将matrix的元素变成一维的,
     49                                     # .A能使matrix变成array  .A[0]能少一个[] 虽然我不明白到底什么意思,以后注意一下
     50                                     # 另外,为什么前两个参数需要转变成array?明明matrix也能画出来
     51 print (corrcoef(yHat.T, yMat))
     52 
     53 xCopy = xMat.copy()
     54 xCopy.sort(0)
     55 yHat = xCopy *ws
     56 ax.plot(xCopy[:,1],yHat,'red')
     57 
     58 
     59 plt.show()
     60 
     61 
     62 # 8-2 局部加权线性回归函数
     63 def lwlr(testPoint, xArr, yArr, k=1.0): # 参数k控制衰减速度; testPoint为输入,函数返回根据加权线性回归得出的预测值
     64     xMat = mat(xArr)
     65     yMat = mat(yArr).T
     66     m = shape(xMat)[0]
     67     weights = mat(eye(m))
     68     for j in range(m):
     69         diffMat = testPoint - xMat[j,:]
     70         weights[j,j] = exp(diffMat*diffMat.T/(-2.0*k**2))
     71     xTx = xMat.T*(weights*xMat)
     72     if linalg.det(xTx) == 0.0:
     73         print "this matrix is singular, cannot do inverse"
     74         return
     75     ws = xTx.I*(xMat.T*(weights*yMat))
     76     return testPoint * ws
     77 
     78 def lwlrTest(testArr, xArr, yArr, k=1.0):
     79     m = shape(testArr)[0]
     80     yHat = zeros(m)
     81     for i in range(m):
     82         yHat[i] = lwlr(testArr[i], xArr, yArr, k)
     83     return yHat
     84 
     85 xArr,yArr = loadDataSet('ex0.txt')
     86 yHat = lwlrTest(xArr, xArr, yArr, 0.01)
     87 xMat = mat(xArr)
     88 srtInd = xMat[:,1].argsort(0)   # argsort()方法返回的是排序后个元素排序前的下标
     89 xSort = xMat[srtInd][:,0,:] # 这个功能看懂了 但是语法没搞懂???????
     90 
     91 import matplotlib.pyplot as plt
     92 fig = plt.figure()
     93 ax = fig.add_subplot(111)
     94 ax.plot(xSort[:,1], yHat[srtInd])
     95 ax.scatter(xMat[:,1].flatten().A[0], mat(yArr).T.flatten().A[0], s=2, c='red')
     96 plt.show()
     97 
     98 
     99 # 8-3 岭回归(xTx肯定不是满秩矩阵,加上一个lam*I使其变为满秩的,I是单位矩阵)
    100 
    101 def ridgeRegres(xMat, yMat, lam=0.2):
    102     xTx = xMat.T * xMat
    103     denom = xTx+lam*eye(len(xTx[0]))
    104     if linalg.det(denom) == 0.0:
    105         print "this matrix is not singular, cannot do inverse"
    106         return
    107     ws = denom.I * (xMat.T*yMat)
    108     return ws
    109 
    110 # 先对特征进行标准化处理,是每维特征具有相同重要性,这里的做法是所有特征减去各自的均值并处理方差
    111 def ridgeTest(xArr, yArr):
    112     xMat = mat(xArr)
    113     yMat = mat(yArr).T
    114     yMean = mean(yMat,0)
    115     yMat = yMat - yMean
    116     xMeans = mean(xMat,0)
    117     xVar = var(xMat, 0)
    118     xMat = (xMat - xMeans)/xVar
    119     numTestPts = 30 # 在30个不同的lambda下调用ridgeRegres()函数
    120     wMat = zeros((numTestPts, shape(xMat)[1]))
    121     for i in range(numTestPts):
    122         ws = ridgeRegres(xMat, yMat, exp(i-10)) # lambda以指数级变化,这样能看出lambda在去非常小的值时和取非常大的值时对结果造成的影响
    123         wMat[i,:]=ws.T
    124     return wMat
    125 
    126 # 8-4 前向逐步线性回归
    127 
    128 # 标准化特征(书上漏了这部分)
    129 def regularize(xMat):
    130     inMat = xMat.copy()
    131     inMeans = mean(inMat,0)
    132     inVar = var(inMat,0)
    133     inMat = (inMat - inMeans)/inVar
    134     return inMat
    135 
    136 def rssError(yArr, yHatArr):
    137     return ((yArr-yHatArr)**2).sum()
    138 
    139 # 对每个特征,将他的系数从一个初始值开始以特定步长增大或减少,一旦误差变小就用lowestError来记录最小误差,用wsMax来记录最优权重。
    140 def stageWise(xArr, yArr, eps=0.01, numIt=100): # eps表示每次迭代需要调整的步长
    141     xMat = mat(xArr)
    142     yMat = mat(yArr).T
    143     yMean = mean(yMat,0)
    144     yMat = yMat - yMean
    145     xMat = regularize(xMat)
    146     m,n = shape(xMat)
    147     returnMat = zeros((numIt,n))
    148     ws = zeros((n,1))
    149     wsTest = ws.copy()
    150     wsMax = ws.copy()
    151     for i in range(numIt):
    152         print ws.T
    153         lowestError = inf
    154         for j in range(n):
    155             for sign in [-1,1]:
    156                 wsTest = ws.copy()
    157                 wsTest[j] += eps*sign
    158                 yTest = xMat * wsTest
    159                 rssE = rssError(yMat.A, yTest.A)
    160                 if rssE < lowestError:
    161                     lowestError = rssE
    162                     wsMax = wsTest
    163         ws =wsMax.copy()
    164         returnMat[i,:] = ws.T
    165     return returnMat
  • 相关阅读:
    JDBC的初步了解及使用
    HTML+CSS的小实例
    java接口与抽象类
    java类的继承(基础)
    java中求质数(素数)的问题
    对HTML5标签的认识(四)
    对HTML5标签的认识(三)
    对HTML5标签的认识(三)
    SublimeText2 快捷键一览表
    Node开发项目管理工具 Grunt 对比 Gulp
  • 原文地址:https://www.cnblogs.com/DianeSoHungry/p/7092440.html
Copyright © 2011-2022 走看看