机器学习之预测数值型数据: 回归

来源:互联网 发布:mac qq 讨论组 删除人 编辑:程序博客网 时间:2024/05/21 00:20

    本文主要记录本人在学习机器学习过程中的相关代码实现,参考《机器学习实战》

from numpy import *import matplotlib.pyplot as pltdef loadDataSet(fileName):    numFeat=len(open(fileName).readline().split('\t'))-1    with open(fileName) as fr:        #~ numFeat=len(fr.readline().split('\t'))-1        dataMat=[];labelMat=[]        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,labelMatdef 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#~ xArr,yArr=loadDataSet('ex0.txt')#~ print(xArr[0:2])#~ ws=standRegres(xArr,yArr)#~ print(ws)#~ xMat=mat(xArr)#~ yMat=mat(yArr)#~ yHat=xMat*ws#~ fig=plt.figure()#~ ax=fig.add_subplot(111)#~ ax.scatter(xMat[:,1].flatten().A[0],yMat.T[:,0].flatten().A[0])#faltten()是将其合并转化为一行的array,.A[0]表示取第0行#~ xCopy=xMat.copy()#~ xCopy.sort(0)#~ yHat=xCopy*ws#~ ax.plot(xCopy[:,1],yHat)#~ plt.show()#~ xArr,yArr=loadDataSet('ex0.txt')#~ ws=standRegres(xArr,yArr)#~ xMat=mat(xArr)#~ yMat=mat(yArr)#~ yHat=xMat*ws#~ co=corrcoef(yHat.T,yMat)#~ print(co)def lwlr(testPoint,xArr,yArr,k=1.0):    xMat=mat(xArr);yMat=mat(yArr).T    m=shape(xMat)[0]    #~ 第三个参数:默认情况下输出的是对角线全“1”,其余全“0”的方阵,如果k为正整数,则在右上方第k条对角线全“1”其余全“0”,k为负整数则在左下方第k条对角线全“1”其余全“0”    weights=mat(eye((m)))    for j in range(m):        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('cannot do inverse')        return    ws=xTx.I*(xMat.T*(weights*yMat))    return testPoint*wsdef lwlrTest(testArr,xArr,yArr,k=1.0):    m=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')#~ print(lwlr(xArr[0],xArr,yArr,1.0))#~ yHat=lwlrTest(xArr,xArr,yArr,0.003)def rssError(yArr,yHatArr):    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('cannot do inverse')        return    ws=denom.I*(xMat.T*yMat)    return wsdef ridgeTest(xArr,yArr):    xMat=mat(xArr);yMat=mat(yArr).T    yMean=mean(yMat,0)    yMat=yMat-yMean    xMeans=mean(xMat,0)    xVar=var(xMat,0)    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#~ abX,abY=loadDataSet('abalone.txt')#~ ridgeWeights=ridgeTest(abX,abY)#~ fig=plt.figure()#~ ax=fig.add_subplot(111)#~ ax.plot(ridgeWeights)#~ plt.show()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 inMatdef stageWise(xArr,yArr,eps=0.01,numIt=100):    xMat=mat(xArr);yMat=mat(yArr).T    #~ mean()函数功能:求取均值    #~ 经常操作的参数为axis,以m * n矩阵举例:    #~ axis 不设置值,对 m*n 个数求均值,返回一个实数    #~ axis = 0:压缩行,对各列求均值,返回 1* n 矩阵    #~ axis =1 :压缩列,对各行求均值,返回 m *1 矩阵    yMean=mean(yMat,0)    yMat=yMat-yMean    xMat=regularize(xMat)    m,n=shape(xMat)    returnMat=zeros((numIt,n))    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 returnMatxArr,yArr=loadDataSet('abalone.txt')print(stageWise(xArr,yArr,0.01,200))


阅读全文
0 0
原创粉丝点击