上一篇文章:线性回归(Linear regression)算法

引入:

1、线性回归:

算法的优点:

结果易于理解,计算不复杂

缺点:对非线性数据拟合不好

目标:平方误差和最小

 求解(对参数w求导等于0)的回归系数:

模型预测:

"""
函数说明:标准回归Parameters:xArr - 特征矩阵yArr -响应值Returns:ws- 回归系数Author:heda3
Blog:https://blog.csdn.net/heda3
Modify:2020-01-10
"""
def standRegres(xArr,yArr):xMat = mat(xArr); yMat = mat(yArr).TxTx = xMat.T*xMat#计算xTxif linalg.det(xTx) == 0.0:#判断行列式是否为0print("This matrix is singular, cannot do inverse")returnws = xTx.I * (xMat.T*yMat)#计算回归系数return ws

注意行列式不为零才可以计算逆矩阵

#加载测试数据 

from numpy import *def loadDataSet(fileName):      #general function to parse tab -delimited floatsnumFeat = len(open(fileName).readline().split('\t')) - 1 #get number of fields 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

数据描述:

特征:2,响应:数值型

使用线性回归预测数据并绘制散点图+计算模型的效果(相关系数计算)

 ##测试线性回归xArr,yArr=loadDataSet('ex0.txt')xArr[0:2]ws=standRegres(xArr,yArr)#计算回归系数xMat=mat(xArr)yMat=mat(yArr)#绘散点图import matplotlib.pyplot as pltfig=plt.figure()ax=fig.add_subplot(111)ax.scatter(xMat[:,1].flatten().A[0],yMat.T[:,0].flatten().A[0])#.A转变为数组xCopy=xMat.copy()xCopy.sort(0)#维度,行排序yHat=xCopy*wsax.plot(xCopy[:,1],yHat)plt.show#求预测值和真实值的相关系数yHat1=xMat*wscorrcoef(yHat1.T,yMat)

2、局部加权线性回归

Locally Weighted Linear Regression, LWLR
线性回归存在的问题是:出现欠拟合

解决方法:在估计中引入偏差,从而降低预测的均方误差

也即是通过在每一小段进行拟合,以逼近真实的数据

局部加权线性回归相比普通线性回归的问题是:每次必须在整个数据集上运行,也即是必须要保存所有的训练数据

思路:在待预测点附近的每个点赋予一定的权重

求解的回归系数:

对比线性回归:

其中的W矩阵用于给每个数据点赋予权重

权重W的选择,通过使用不同的核:

例如高斯核

需要调节的参数:一个 k

#对单点估计

"""
函数说明:局部加权线性回归Parameters:testPoint x空间的任意一点xArr - 特征矩阵yArr -响应值k 和权重有关,当k越小则使用的越少的局部数据集进行训练,k=1相当于标准线性回归Returns:某个点的预测结果  testPoint * ws - Author:heda3
Blog:https://blog.csdn.net/heda3
Modify:2020-01-10
"""
def lwlr(testPoint,xArr,yArr,k=1.0):xMat = mat(xArr); yMat = mat(yArr).Tm = shape(xMat)[0]weights = mat(eye((m)))#定义一个权值矩阵for j in range(m):                      #next 2 lines create weights matrixdiffMat = testPoint - xMat[j,:]     #x-x[i]weights[j,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")returnws = xTx.I * (xMat.T * (weights * yMat))#计算回归系数return testPoint * ws

#对多点(数据集)估计

"""
函数说明:为数据集中的每个点调用lwlrParameters:testArr 测试的数据集xArr - 特征矩阵yArr -响应值kReturns:testPoint * ws - Author:heda3
Blog:https://blog.csdn.net/heda3
Modify:2020-01-10
"""
def lwlrTest(testArr,xArr,yArr,k=1.0):  #loops over all the data points and applies lwlr to each onem = shape(testArr)[0]yHat = zeros(m)for i in range(m):yHat[i] = lwlr(testArr[i],xArr,yArr,k)#要使用之前的数据集参与预测return yHat

对数据进行预测+绘制散点图

 ##测试局部加权线性回归xArr,yArr=loadDataSet('ex0.txt')#对单点估计yArr[0]lwlr(xArr[0],xArr,yArr,1.0)lwlr(xArr[0],xArr,yArr,0.001)#数据集中所有点的估计yHat=lwlrTest(xArr,xArr,yArr,0.01)#绘制散点图xMat=mat(xArr)srtInd=xMat[:,1].argsort(0)xSort=xMat[srtInd][:,0,:] #等价于xMat[srtInd.flatten().A[0]]import matplotlib.pyplot as pltfig=plt.figure()ax=fig.add_subplot(111)ax.plot(xSort[:,1],yHat[srtInd])#拟合曲线ax.scatter(xMat[:,1].flatten().A[0],mat(yArr).T.flatten().A[0],s=2,c='red')#.A转变为数组plt.show()

设置参数k值为0.01

问题:

数据的特征比样本点多时,计算矩阵的(XTX)的逆出错,也即是输入数据(特征)矩阵不是满秩的矩阵

或者是数据特征之间是高度相关时也不能计算

如何减少特征数,如何减少不重要的特征?

解决方法:缩减系数

1)岭回归

2)lasso

3)LAR

4)PCA回归

5)子集选择

1)岭回归

的基础上加使得矩阵非奇异,从而能对求逆

求解的回归系数:

对比标准线性回归:

选择的参数:    可通过交叉验证确定

注意:数据需要先标准化处理(X-mean)/var

"""
函数说明:岭回归Parameters:xMat- 数据的特征 假设有n 样本个数有myMat- 响应值lam-- 调节的参数
Returns:ws-- 计算出的回归系数
Author:heda3
Blog:https://blog.csdn.net/heda3
Modify:2020-01-10
"""
def ridgeRegres(xMat,yMat,lam=0.2):xTx = xMat.T*xMat#2*2   n*ndenom = xTx + eye(shape(xMat)[1])*lam#n*nif linalg.det(denom) == 0.0:print("This matrix is singular, cannot do inverse")returnws = denom.I * (xMat.T*yMat)return ws
"""
函数说明:岭回归参数lambda调节Parameters:xArr- 特征矩阵yArr- 响应值Returns:wMat - 返回一组w(维数和特征数对应)系数
Author:heda3
Blog:https://blog.csdn.net/heda3
Modify:2020-01-10
"""
def ridgeTest(xArr,yArr):xMat = mat(xArr); yMat=mat(yArr).T#数据标准化处理yMean = mean(yMat,0)yMat = yMat - yMean     #to eliminate X0 take mean off of Y#regularize X'sxMeans = mean(xMat,0)   #calc mean then subtract it offxVar = var(xMat,0)      #calc variance of Xi then divide by itxMat = (xMat - xMeans)/xVarnumTestPts = 30#设置lambda参数迭代次数wMat = zeros((numTestPts,shape(xMat)[1]))#30*2的矩阵for i in range(numTestPts):ws = ridgeRegres(xMat,yMat,exp(i-10))wMat[i,:]=ws.Treturn wMat

2)lasso

对回归系数的约束:

3)前向逐步回归

每一步都尽可能的减少误差,通过设置初始权重为1,每一步所做的决策是对某个权重增加或减少一个很小的值

算法步骤:

通过多次迭代后得到趋于稳定的回归参数!

可调节的参数:步长和迭代次数

"""
函数说明:前向逐步线性回归Parameters:xArr- 特征矩阵yArr- 响应值eps=0.01  每次迭代需要调整的步长numIt=100 迭代次数
Returns:returnMat - 返回一组w(维数和特征数对应)系数
Author:heda3
Blog:https://blog.csdn.net/heda3
Modify:2020-01-11
"""
def stageWise(xArr,yArr,eps=0.01,numIt=100):xMat = mat(xArr); yMat=mat(yArr).T#数据的标准化yMean = mean(yMat,0)yMat = yMat - yMean     #can also regularize ys but will get smaller coefxMat = regularize(xMat)m,n=shape(xMat)returnMat = zeros((numIt,n)) #testing code removews = zeros((n,1)); wsTest = ws.copy(); wsMax = ws.copy()for i in range(numIt):print(ws.T)lowestError = inf; #一开始的误差设置很大for j in range(n):#n个特征也即是n个回归系数参与逐步回归for sign in [-1,1]:#有两种情况的迭代加或减wsTest = ws.copy()wsTest[j] += eps*sign#用于减去或增加步长yTest = xMat*wsTestrssE = rssError(yMat.A,yTest.A)#计算平方误差if rssE < lowestError:lowestError = rssEwsMax = wsTest#找到具有最小误差的回归系数ws = wsMax.copy()#迭代numIt次找到最小误差的回归系数returnMat[i,:]=ws.Treturn returnMat

案例1:预测鲍鱼年龄

问题出发点是:鲍鱼的年龄是通过贝壳的年轮计数确定,此方法耗时费力,如何依据其它的一些参数来推测鲍鱼的年龄?

数据集来源:UCI Machine Learning Repository: Abalone Data Set

数据集的描述:

上述的数据集给出的8个特征属性

Name / Data Type / Measurement Unit / Description 
----------------------------- 
Sex / nominal / -- / M, F, and I (infant) 
Length / continuous / mm / Longest shell measurement 
Diameter / continuous / mm / perpendicular to length 
Height / continuous / mm / with meat in shell 
Whole weight / continuous / grams / whole abalone 
Shucked weight / continuous / grams / weight of meat 
Viscera weight / continuous / grams / gut weight (after bleeding) 
Shell weight / continuous / grams / after being dried

响应值:

构建模型预测

1)使用标准线性回归模型预测鲍鱼年龄

 ##使用标准线性回归模型ws=standRegres(abX[0:99],abY[0:99])yHat=mat(abX[100:199])*wsrssError(abY[100:199],yHat.T.A)

新数据上表现平方误差=518.6

2)使用局部线性加权线性回归模型预测鲍鱼年龄

 ##使用局部加权线性回归abX,abY=loadDataSet('abalone.txt')yHat01=lwlrTest(abX[0:99],abX[0:99],abY[0:99],0.1)yHat1=lwlrTest(abX[0:99],abX[0:99],abY[0:99],1)yHat10=lwlrTest(abX[0:99],abX[0:99],abY[0:99],10)#平方误差和rssError(abY[0:99],yHat01.T)rssError(abY[0:99],yHat1.T)rssError(abY[0:99],yHat10.T)#测试集表现yHat01=lwlrTest(abX[100:199],abX[100:199],abY[100:199],0.1)yHat1=lwlrTest(abX[100:199],abX[100:199],abY[100:199],1)yHat10=lwlrTest(abX[100:199],abX[100:199],abY[100:199],10)x1=rssError(abY[100:199],yHat01.T)print(x1)x2=rssError(abY[100:199],yHat1.T)print(x2)x3=rssError(abY[100:199],yHat10.T)print(x3)

在不同的参数k下的效果,以及在训练集和测试集上的表现:

平方误差结果:

训练集下:

测试集下:

在未知数据上比较效果才可以很好的选择模型,10折交叉验证

3)岭回归模型预测鲍鱼年龄

 ##使用岭回归abX,abY=loadDataSet('abalone.txt')ridgeWeights=ridgeTest(abX,abY)#得到不同lambda下计算出的回归系数#绘制回归系数import matplotlib.pyplot as pltfig=plt.figure()ax=fig.add_subplot(111)ax.plot(ridgeWeights)plt.show()

横坐标为lambda值,y轴为各回归系数

通过上图看看出哪些变量对结果的预测具有影响力

为定量找到最佳参数值lambda,需要进行交叉验证获得误差最小的lambda

使用10折交叉验证计算得出最佳的岭回归系数,参与预测新的数据

在岭回归中要求数据要标准化再参与计算,那么在训练完成后新的数据如何进行预测?这个新的数据怎么利用训练的数据进行标准化?

解决方法是:利用在训练数据中得出的回归参数,通过变换实现变相的在新数据预测时的标准化

新的数据一般预测过程:

数据标准化:XT=(XTest-mean(XTrain))/Var(XTrain)

预测:Ytest=XT*Ws+mean(YTrain)

将上述的公式变换:

Ytest=((XTest-mean(XTrain))/Var(XTrain))*Ws+mean(YTrain)

UnReg=Ws/Var(XTrain)

constantTerm=-mean(XTrain)*Ws/Var(XTrain)+mean(YTrain)

Ytest=XTest*UnReg+constantTerm(现在的新变换后的预测过程)

###交叉验证--岭回归
ridgeWs,ridgeunReg,ridgeConstantTerm=crossValidation(abX[0:99],abY[0:99],10)#目的是找出最佳的岭回归系数
##测试均方误差
####和标准线性回归的比较
xMat=mat(abX[100:199])
yMat=mat(abY[100:199]).T
ridgeyHat=xMat*ridgeunReg.T+ridgeConstantTerm#岭回归预测
rssError(abY[100:199],ridgeyHat.T.A)#误差计算

换种写法:

###交叉验证--岭回归
ridgeWs,ridgeunReg,ridgeConstantTerm=crossValidation(abX[0:99],abY[0:99],10)#目的是找出最佳的岭回归系数
##测试均方误差
####和标准线性回归的比较
xMat=mat(abX[100:199])
yMat=mat(abY[100:199])
ridgeyHat=xMat*ridgeunReg.T+ridgeConstantTerm#岭回归预测
rssError(yMat.A,ridgeyHat.T.A)#误差计算
xxx=yMat.A
yyy=ridgeyHat.T.A
"""
函数说明:交叉验证测试岭回归Parameters:xArr - 特征yArr - 标签numVal=10 - 交叉验证的次数Returns: bestWeights 最佳的岭回归参数为了和标准线性回归比较unReg,constantTerm 数据标准化还原后的特征参数和常量参数
Author:heda3
Blog:https://blog.csdn.net/heda3
Modify:2020-01-28
"""
def crossValidation(xArr,yArr,numVal=10):m = len(yArr)#样本点个数                           indexList = list(range(m))errorMat = zeros((numVal,30))#create error mat 30columns numVal rowsfor i in range(numVal):#交叉验证trainX=[]; trainY=[]testX = []; testY = []random.shuffle(indexList)#随机打乱样本索引#训练集和测试集的划分 90%训练  10%测试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)    #30*特征数 get 30 weight vectors from ridge#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)#test ridge results and storeerrorMat[i,k]=rssError(yEst.T.A,array(testY))#print errorMat[i,k]#计算所有这些误差值的均值meanErrors = mean(errorMat,0)#errorMat为 10*30   30个岭回归参数  10次交叉验证  按照把轴向数据求平均  得到每列数据的平均值,也即是10折交叉验证的平均   calc avg performance of the different ridge weight vectorsminMean = 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/varXprint("the best model from Ridge Regression is:\n",unReg)#标准化后数据还原constantTerm=-1*sum(multiply(meanX,unReg)) + mean(yMat)print("with constant term: ",constantTerm)return bestWeights,unReg,constantTerm

平方误差结果:

4)前向逐步回归模型预测鲍鱼年龄

 ##使用逐步回归xArr,yArr=loadDataSet('abalone.txt')returnMat1=stageWise(xArr,yArr,0.01,200)#出现来回震荡情况,原因是步长太大?原因是系数已经饱和需要调小系数#对比更小的步长returnMat2=stageWise(xArr,yArr,0.001,200)#绘制回归系数import matplotlib.pyplot as pltfig=plt.figure()ax=fig.add_subplot(111)ax.plot(returnMat2)plt.show()

参数:步长和迭代次数

基于上图可以较好的发现重要特征

定量的选择模型参数:使用类似交叉验证方法

实验结果:

##数据训练
returnMat2=stageWise(xArr,yArr,0.001,5000)
###预测
####数据标准化
xMat = mat(xArr); yMat=mat(yArr).T
xMean=mean(xMat,0)
VarX=var(xMat,0)
yMean = mean(yMat,0)Xtest=(mat(xArr[100:199])-xMean)/VarX#标准化后的测试数据
yMat=mat(yArr[100:199])#实际标签数据Ytest=Xtest*mat(returnMat2[4999,:]).T+yMean
rssError(yMat.A,Ytest.T.A)#.A转变为数组

均方误差:

参考:

《机器学习实战》

回归分析及实际案例:预测鲍鱼年龄相关推荐

  1. 回归综合案例——利用回归模型预测鲍鱼年龄

    回归综合案例--利用回归模型预测鲍鱼年龄 1 数据集探索性分析 首先将鲍鱼数据集abalone_dataset.csv读取为pandas的DataFrame格式. import pandas as p ...

  2. 《机器学习实战》8.2 线性回归基础篇之预测鲍鱼年龄

    <机器学习实战>8.2 线性回归基础篇之预测鲍鱼年龄 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多人工智能.机器学习干货 csdn:https://blo ...

  3. 线性回归实例-----预测鲍鱼年龄

    预测鲍鱼年龄 前言   线性回归是监督学习的一个方向,用来预测连续的数值型数据.比如房价预测.销量预测等等. 优点:计算简单,易于理解 缺点:只使用与线性数据,对于非线性数据使用非线性回归模型 使用条 ...

  4. 鲍鱼数据集案例分析-预测鲍鱼年龄(线性回归/梯度下降法实操)

    数据集来源UCI Machine Learning Repository: Abalone Data Set 目录 一.数据集探索性分析 二.鲍鱼数据预处理 1.对sex特征进行OneHot编码,便于 ...

  5. 基于Python的机器学习之预测鲍鱼年龄数据集

    用于训练的数据集: 1.000000    0.067732    3.176513 1.000000    0.427810    3.816464 1.000000    0.995731     ...

  6. 使用线性回归,岭回归,Lasso回归预测鲍鱼年龄

    实验目的 掌握数据预处理方法 掌握线性回归预测基本原理与实现. 实验问题背景 鲍鱼的年龄可以通过鲍鱼壳的"环数"来判断,但是获取这个"环数"是十分耗时的,需要锯 ...

  7. 十一、加权线性回归案例:预测鲍鱼的年龄

    加权线性回归案例:预测鲍鱼的年龄 点击文章标题即可获取源代码和笔记 数据集:https://download.csdn.net/download/weixin_44827418/12553408 1. ...

  8. 预测算法-线性回归(鲍鱼年龄预测)

    预测算法-线性回归 面对可逆矩阵 线性回归(模型,策略,算法) 模型: h(x)=WTx+b h ( x ) = W T x + b h(x) = W^T x + b 损失函数: J(θ)=∑i=1N ...

  9. 线性回归实战---Abalone鲍鱼年龄预测

    线性回归实现Abalone鲍鱼年龄预测 文章目录 线性回归实现Abalone鲍鱼年龄预测 一.环境准备 数据集简介 二.线性回归基础知识 什么是线性回归? "最小二乘法" 求解线性 ...

最新文章

  1. 什么是分布式计算系统?—Vecloud微云
  2. vb检测电脑温度_电脑硬件温度多少正常?如何查看电脑硬件温度?
  3. js+php在线截图 jquery fileupload.js,另一种图片上传 jquery.fileupload.js
  4. 一些加快 程序运行速度的方法
  5. 解决使用pip无法安装rasa与无限依赖告警:INFO: This is taking longer than usual. You might need to provide the....
  6. OpenShift 4 之Service Mesh教程(3)- 访问流量管理
  7. vsftp虚拟用户权限问题
  8. 一根柱状图表示两种数据_柱状图不好看,那就换个坐标轴
  9. c# winForm使用Aspose.Cells读取CSV文件中文乱码问题
  10. LeetCode刷题——279. 完全平方数
  11. visio2003 FK
  12. 【揭秘】过于真实,培训机构那些不为人知的秘密(二)
  13. 一位全减器逻辑电路图_用74ls138实现一位全减器 - 数字电路图
  14. Win10系统中耳机插入前后面板均没有声音
  15. VUE项目学习(三):win10版nginx部署vue项目
  16. java 补齐字符串_使用String.format()格式化字符串,java自动补全自增长字符串
  17. 微信开发者工具更换默认用户存储目录(User Data)方法
  18. oracle数据库的数据日增量怎么统计
  19. 【学习 记录】狄克斯特拉算法 - Java
  20. 总结了这67个pandas函数,完美解决数据处理,拿来即用!

热门文章

  1. blender中文三维立体文字制作方法
  2. Shopify开店建站营销推广卖家平台后台中文指南 – Test orders / 测试订单
  3. 【DEBUG】2021-03-15 不定期的自我检讨001
  4. Linux中,显示当前目录位置、列出当前目录下的目录和文件、切换或进入目录。
  5. 智能与人机融合智能的思考
  6. TeamViewer远程工具使用安装方法图解
  7. 前端终端组件xterm.js的使用(转)
  8. 支持向量机(SVM)的数学原理
  9. 交通银行计算机设备实物管理,酷!AI助力交通银行提升风险管理能力
  10. 阿里巴巴的“旺信”上线