您的位置:首页 > 其它

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

2017-07-06 10:35 423 查看
    本文主要记录本人在学习机器学习过程中的相关代码实现,参考《机器学习实战》

from numpy import *
import matplotlib.pyplot as plt
def 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,labelMat

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

#~ 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*ws

def 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 ws

def 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=ridgeT
9840
est(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 inMat

def 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 returnMat

xArr,yArr=loadDataSet('abalone.txt')
print(stageWise(xArr,yArr,0.01,200))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: