一、基本知识

1、岭回归:从公式看,加入正则化项(2范数)。

回归系数的计算公式为:

问题引入:若给定数据集X,如果XTX的逆存在,可以使用常规的线性回归方法。但是,

1)数据样本数比特征数少的情况,矩阵的逆不能直接计算;

(2)即使样本数多于特征数,若特征高度相关,XTX的逆依然无法计算。

此时,可以考虑岭回归。

另,岭回归是有偏估计回归方法,引入lamda来限制所有系数之和,通过引入该惩罚项(从需要最小化的平方误差函数可以看出),能够减少不重要的参数;它是缩减法的一种,增大模型的偏差,从而达到更好的估计效果,还可以用于挖掘大量数据的内容在规律,根据系数的大熊啊可以得到最重要的一个或几个特征。

书籍:《机器学习实战》中文版
IDE:PyCharm Edu 4.02
环境:Adaconda3  python3.6from numpy import *
# 自适应数据加载函数
# 不必指定特征数目,
def loadDataSet(fileName):     #general function to parse tab -delimited floatsnumFeat = len(open(fileName).readline().split('\t'))-1   #get number of fieldsdataMat = [];labelMat = []with open(fileName) as fr: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       # 返回列表
# 岭回归
# 参数xMat和yMat是矩阵格式
def ridgeRegres(xMat,yMat,lam=0.2):xTx = xMat.T * xMatdenom = xTx + eye(shape(xMat)[1])*lamif linalg.det(denom) == 0.0:print("This matrix is singular, cannot do inverse")returnws = denom.I * (xMat.T * yMat)return ws
def ridgeTest(xArr,yArr):xMat = mat(xArr)yMat = mat(yArr).T# 数据标准化 可以使用regularize()函数yMean = mean(yMat,0)yMat = yMat-yMeanxMeans = mean(xMat,0)xVar = var(xMat,0)xMat = (xMat-xMeans)/xVarnumTestPts =30   #设置岭参数lam的取值范围wMat = zeros((numTestPts,shape(xMat)[1]))for i in range(numTestPts):ws = ridgeRegres(xMat,yMat,exp(i-10))wMat[i,:] = ws.T       #每一行是一个lam对应的回归系数return wMat
# 岭回归交叉验证
def rssError(yArr,yHatArr): #yArr and yHatArr both need to be arraysreturn ((yArr-yHatArr)**2).sum()
def crossValidation(xArr,yArr,numVal=10):m = len(yArr)indexList = list(range(m))errorMat = zeros((numVal,30))for i in range(numVal):trainX=[];trainY=[]testX=[];testY=[]random.shuffle(indexList)  #混洗for j in range(m):   #create training set based on first 90% of values in indexListif j < m*0.9:trainX.append(xArr[indexList[j]])trainY.append(yArr[indexList[j]])else:testX.append(xArr[indexList[j]])testY.append(yArr[indexList[j]])wMat = ridgeTest(trainX,trainY) #wMat每一行是一组回归系数;numTestPts=30每组系数的个数for k in range(30): #loop over all of the ridge estimatesmatTestX = mat(testX);matTrainX = mat(trainX)meanTrain = mean(matTrainX,0)varTrain = var(matTrainX,0)matTestX = (matTestX-meanTrain)/varTrain   #regularize test with training paramsyEst = matTestX * mat(wMat[k,:]).T + mean(trainY)errorMat[i,k] = rssError(yEst.T.A,array(testY))meanErrors = mean(errorMat,0)minMean = float(min(meanErrors))bestWeights = wMat[nonzero(meanErrors==minMean)]#can unregularize to get model#when we regularized we wrote Xreg = (x-meanX)/var(x)#we can now write in terms of x not Xreg:  x*w/var(x) - meanX/var(x) +meanYxMat = mat(xArr)yMat = mat(yArr).TmeanX = mean(xMat,0)varX = var(xMat,0)unReg = bestWeights/varX   #???不懂为什么需要除以方差print("the best model from Ridge Regression is:\n",unReg)print("with constant term: ",-1*sum(multiply(meanX,unReg)) + mean(yMat))
# 鲍鱼数据集验证岭回归
abX,abY = loadDataSet('abalone.txt')
print(crossValidation(abX,abY))运行结果:
the best model from Ridge Regression is:[[  0.05915723  -3.07364169  14.96227846  11.73052929   8.92101407-20.08279615  -9.68807653   9.33245255]]
with constant term:  3.14629495468
None

2、loss回归、前向逐步回归

loss回归(缩减法之一):加入正则化项——绝对值形式。但计算复杂,因此使用计算简单的前向逐步回归,可以达到与loss回归相同的效果。

前向逐步回归属于一种贪心算法,每一步都尽可能减少误差。

# 前向逐步回归
def stageWise(xArr,yArr,eps=0.01,numIt=100):xMat = mat(xArr);yMat = mat(yArr).T# 数据标准化yMean = mean(yMat,0)yMat = yMat-yMeanxMat = regularize(xMat)m,n = shape(xMat)returnMat = zeros((numIt,n))ws=zeros((n,1));wsTest=ws.copy();wsBest=ws.copy()for i in range(numIt):lowestError = inffor j in range(n):for sign in [-1,1]:wsTest = ws.copy()   #备份ws,以判断到底是增加还是减小系数wsTest[j] += eps*signyTest = xMat*wsTestrssE = ((yMat.A-yTest.A)**2).sum()if rssE < lowestError:lowestError = rssEwsBest = wsTestws = wsBest.copy()returnMat[i,:] = ws.Treturn returnMat
weightsStageWise = stageWise(abX,abY)
print(weightsStageWise)

说明:贪心算法在所有特征上运行两次for循环,分别计算增加或减少该特征对误差的影响。

即当一次外循环(i)结束后才改变系数ws,而内循环(j)的每个值记录在wsBest中但每次运行时仍是未改变的ws,在每一次外循环中(i):

先判断第一个特征应该增加还是减少系数值,然后判断第二个特征,

此时第一个特征值并未改变,因此代码中每次循环前需要复制一份 wsTest = ws.copy()

关于引用、copy()的使用,参见:http://blog.csdn.net/ckzhb/article/details/78659449

机器学习实战——岭回归、缩减法相关推荐

  1. 机器学习实战-逻辑回归-19

    机器学习实战-逻辑回归-用户流失预测 import numpy as np train_data = np.genfromtxt('Churn-Modelling.csv',delimiter=',' ...

  2. 【人工智能】机器学习:岭回归与LASSO回归(Ridge/LASSO Regression)

    机器学习:岭回归与LASSO回归 (Ridge / LASSO Regression) 文章目录 机器学习:岭回归与LASSO回归 (Ridge / LASSO Regression) 1. Ridg ...

  3. [机器学习-5]岭回归及python实现(Ridge Regression)

    [机器学习-5]岭回归[L2正则化]及python实现(Ridge Regression)[L2] 前言 题目 岭回归(Ridge Regression) k-fold validation skle ...

  4. 机器学习实战--Logistic回归与实例:从疝病症预测病马的死亡率

    声明 本文参考了<机器学习实战>书中代码,结合该书讲解,并加之自己的理解和阐述 机器学习实战系列博文 机器学习实战--k近邻算法改进约会网站的配对效果 机器学习实战--决策树的构建.画图与 ...

  5. 机器学习实战——Logistic回归

    书籍:<机器学习实战>中文版 IDE:PyCharm Edu 4.02 环境:Adaconda3  python3.6 关键词:sigmoid函数.批梯度上升法.随机梯度上升法 from ...

  6. sklearn机器学习:岭回归Ridge

    在sklearn中,岭回归由线性模型库中的Ridge类来调用: Ridge类的格式 sklearn.linear_model.Ridge (alpha=1.0, fit_intercept=True, ...

  7. 【机器学习】岭回归和LASSO回归详解以及相关计算实例-加利福尼亚的房价数据集、红酒数据集

    文章目录 一,岭回归和LASSO回归 1.1 多重共线性 1.2 岭回归接手 1.3 线性回归的漏洞(线性系数的矛盾解释) 1.4 Ridge Regression 1.5 岭回归实例(加利福尼亚的房 ...

  8. 机器学习基础-岭回归-06

    岭回归Ridge Regression 标准方程法-岭回归 import numpy as np from numpy import genfromtxt import matplotlib.pypl ...

  9. 【机器学习】岭回归(L2正则在干嘛!)

    在之前我们有介绍过贝叶斯线性回归,贝叶斯线性回归利用了最大后验估计(MAP)加上权重的高斯分布先验推导出带有L2正则项的线性回归. 其实这就是岭回归,即     岭回归=MAP+高斯先验. 推导就参见 ...

最新文章

  1. Qt程序启动画面播放(gif与swf两种动画格式)
  2. (一)Cisco DHCP Snooping原理(转载)
  3. Android onPause()和onStop()区别
  4. 2018前端常见问题整理
  5. 程序员发现 Bug 的时候是怎样一种心境?
  6. c++容器共性机制研究
  7. 微软程序员利用测试账户套现千万美元,或面临 20 年监禁
  8. 智联招聘基于Apache Pulsar打造企业级事件中心
  9. js实现select动态添加option,默认为选中状态
  10. CMOS模拟集成电路笔记(第一部分)
  11. 《计算机组网试验-DNS服务器安装配置 》杭州电子科技大学
  12. 用计算机弹起风了歌词,《起风了》歌词
  13. Ipad IOS 蓝牙键盘快捷键
  14. 【面试总结】JNI层MediaScanner的分析,挥泪整理面经
  15. uniapp微信浏览器H5授权微信登录
  16. 中国定制家具市场营销态势与盈利前景预测报告(2022-2028年)
  17. HttpWebRequest 介绍
  18. 国产开源数据库:腾讯云TBase在分布式HTAP领域的探索与实践
  19. Android开发循序渐进实例5--网络访问例子
  20. c语言最新版,【整理】C语言的各种版本:C89,AMD1,C99,C11 – 在路上

热门文章

  1. mysql.8.0.13ZIP安装教程_关于mysql 8.0.13zip包安装方法
  2. 高中二年级会考计算机考试试题,高中二年级学考是怎么回事 和会考的区别是什么...
  3. “unzip”不是内部或外部命令,也不是可运行的程序或批处理文件
  4. 像素越多越好?像元的面积越小越好?
  5. 服装色差的识别成因与预防
  6. 机器视觉光源亮度应如何选择
  7. 不了解这些“高级货”,活该你面试当炮灰。。。【石杉的架构笔记】
  8. ThinkJS 和 Sprite.js 服务端渲染实践
  9. 【Java并发】Runnable、Callable、Future、FutureTask
  10. mysql导入超大sql文件时mysql服务重启