机器学习实战之--regression
2016-03-23 22:20
483 查看
前面主要讲到了分类问题,从这节开始,进入到回归的学习。这节主要介绍几个常用的数值回归算法。
1、线性回归
数据的线性拟合
平方误差损失函数:
回归系数:
主要算法实现:
2、局部加权线性回归
由于线性回归可能的欠拟合,引入局部加权线性回归,根据距离训练样本和预测样本之间的距离不同,而给定不同的权值。
为了表示上面的权值,引入核,常用的核为高斯核:
k取不同值时,与权重w的关系
回归系数:
主要算法实现:
3、岭回归和逐步线性回归
如果特征数>样本个数(m>n)怎么办?(此时非满秩矩阵,矩阵不能求逆),一开始为了解决这个问题而引入了缩减系数的方法,岭回归就是其中的一种。简单来说岭回归就是在矩阵X’*T后加入一个lamda*I,使之成为一个满秩矩阵。岭回归也用于在估计中加入偏差,以便能得到更好的估计。这里通过引入lamda来限制所有的w之和,通过引入该惩罚项,能够减少不重要的参数,这一技术在统计学上称为缩减技术。
回归系数:![这里写图片描述](http://img.blog.csdn.net
主要代码实现:(数据要做标准化处理,思考一下上面时候要用到数据标准化?损失函数,加权和)
向前逐步回归:
算法伪代码
4、权衡方差和偏差
能挖掘出哪些特征是重要的,哪些特征是不重要的
算法实现:
1、线性回归
数据的线性拟合
平方误差损失函数:
回归系数:
主要算法实现:
def standRegres(xArr,yArr): xMat = mat(xArr); yMat = mat(yArr).T xTx = xMat.T*xMat if linalg.det(xTx) == 0.0: print "This matrix is singular, cannot do inverse" return ws = xTx.I * (xMat.T*yMat) return ws
2、局部加权线性回归
由于线性回归可能的欠拟合,引入局部加权线性回归,根据距离训练样本和预测样本之间的距离不同,而给定不同的权值。
为了表示上面的权值,引入核,常用的核为高斯核:
k取不同值时,与权重w的关系
回归系数:
主要算法实现:
def lwlr(testPoint,xArr,yArr,k=1.0): xMat = mat(xArr); yMat = mat(yArr).T m = shape(xMat)[0] weights = mat(eye((m))) for j in range(m): #next 2 lines create weights matrix diffMat = testPoint - xMat[j,:] # 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" return ws = xTx.I * (xMat.T * (weights * yMat)) return testPoint * ws def lwlrTest(testArr,xArr,yArr,k=1.0): #loops over all the data points and applies lwlr to each one m = shape(testArr)[0] yHat = zeros(m) for i in range(m): yHat[i] = lwlr(testArr[i],xArr,yArr,k) return yHat def lwlrTestPlot(xArr,yArr,k=1.0): #same thing as lwlrTest except it sorts X first yHat = zeros(shape(yArr)) #easier for plotting xCopy = mat(xArr) xCopy.sort(0) for i in range(shape(xArr)[0]): yHat[i] = lwlr(xCopy[i],xArr,yArr,k) return yHat,xCopy
3、岭回归和逐步线性回归
如果特征数>样本个数(m>n)怎么办?(此时非满秩矩阵,矩阵不能求逆),一开始为了解决这个问题而引入了缩减系数的方法,岭回归就是其中的一种。简单来说岭回归就是在矩阵X’*T后加入一个lamda*I,使之成为一个满秩矩阵。岭回归也用于在估计中加入偏差,以便能得到更好的估计。这里通过引入lamda来限制所有的w之和,通过引入该惩罚项,能够减少不重要的参数,这一技术在统计学上称为缩减技术。
回归系数:![这里写图片描述](http://img.blog.csdn.net
主要代码实现:(数据要做标准化处理,思考一下上面时候要用到数据标准化?损失函数,加权和)
def rssError(yArr,yHatArr): #yArr and yHatArr both need to be arrays return ((yArr-yHatArr)**2).sum() def ridgeRegres(xMat,yMat,lam=0.2): xTx = xMat.T*xMat denom = xTx + eye(shape(xMat)[1])*lam if linalg.det(denom) == 0.0: print "This matrix is singular, cannot do inverse" return ws = denom.I * (xMat.T*yMat) return ws 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's xMeans = mean(xMat,0) #calc mean then subtract it off xVar = var(xMat,0) #calc variance of Xi then divide by it xMat = (xMat - xMeans)/xVar numTestPts = 30 wMat = zeros((numTestPts,shape(xMat)[1])) for i in range(numTestPts): ws = ridgeRegres(xMat,yMat,exp(i-10)) wMat[i,:]=ws.T return wMat def regularize(xMat):#regularize by columns inMat = xMat.copy() inMeans = mean(inMat,0) #calc mean then subtract it off inVar = var(inMat,0) #calc variance of Xi then divide by it inMat = (inMat - inMeans)/inVar return inMat
向前逐步回归:
算法伪代码
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 coef xMat = regularize(xMat) m,n=shape(xMat) #returnMat = zeros((numIt,n)) #testing code remove ws = zeros((n,1)); wsTest = ws.copy(); wsMax = ws.copy() for i in range(numIt): print ws.T lowestError = inf; for j in range(n): for sign in [-1,1]: wsTest = ws.copy() wsTest[j] += eps*sign yTest = xMat*wsTest rssE = rssError(yMat.A,yTest.A) if rssE < lowestError: lowestError = rssE wsMax = wsTest ws = wsMax.copy() #returnMat[i,:]=ws.T #return returnMat
4、权衡方差和偏差
能挖掘出哪些特征是重要的,哪些特征是不重要的
算法实现:
def crossValidation(xArr,yArr,numVal=10): m = len(yArr) indexList = range(m) errorMat = zeros((numVal,30))#create error mat 30columns numVal rows 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 indexList if 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) #get 30 weight vectors from ridge for k in range(30):#loop over all of the ridge estimates matTestX = mat(testX); matTrainX=mat(trainX) meanTrain = mean(matTrainX,0) varTrain = var(matTrainX,0) matTestX = (matTestX-meanTrain)/varTrain #regularize test with training params yEst = matTestX * mat(wMat[k,:]).T + mean(trainY)#test ridge results and store errorMat[i,k]=rssError(yEst.T.A,array(testY)) #print errorMat[i,k] meanErrors = mean(errorMat,0)#calc avg performance of the different ridge weight vectors 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) +meanY xMat = mat(xArr); yMat=mat(yArr).T meanX = 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)
相关文章推荐
- 输出星号图2
- 26.Elasticsearch API初步进阶
- STM32 I2C上拉电阻的选择问题
- iOS--Masonry的简单使用
- 读书笔记:第五章系统调用
- 设计模式 —— 单例
- 【MySQL】 SELECT语句 检索 排序 过滤 通配符搜索 正则表达式搜索
- java动态代理(JDK和cglib)
- linux下mysql数据库每天定时备份 --谷营中西软件科技园
- js 网页烟花效果
- 数据结构——排序(二)
- 0323复利4.0
- 第二周练习 百鸡百钱问题
- UESTC 1271(dp动态规划)
- 安装kali后的设置(持续更新)
- java socket 编程
- Android存储数据到文件
- GRASP 职责分配原则[转]
- C
- Poj 2229 Sumsets【dp】