机器学习经典算法7-线性回归

1.简单介绍

        分类处理的是离散预测,而对于连续的值类型则可以利用回归进行预测,这里对主要的几个线性回归方法进行初步介绍。这里也有训练集和测试集。

2.单变量线性回归的参数求解



3.多变量线性回归


4.利用矩阵进行参数求解


5.局部加权线性回归


6.岭回归


7.编程实现

     这里standMaReg实现的是利用矩阵分解进行最基本的线性回归参数求解;而standBaGradReg中是利用梯度下降的batch方式进行参数求解,这里设定了iter_num循环求解的次数,每次都基于m个训练集数据进行参数更新,这里对参数weights进行更新时没有考虑参数m、对参数alpha也没有考虑变速而是固定值;lwlr函数实现的是局部加权线性回归,求解采用的是矩阵方式;ridgeRegres实现的是岭回归,这里的lamda默认设定是0.2。
[python]  view plain  copy
 print ?
  1. from numpy import *  
  2. import matplotlib.pyplot as plt  
  3. def loadDataSet(filename):  
  4.     numFeat = len(open(filename).readline().split('\t'))-1  
  5.     dataMat = []  
  6.     labelMat = []  
  7.     fr = open(filename)  
  8.     for line in fr.readlines():  
  9.         lineArr = []  
  10.         curLine = line.strip('\n').split('\t')  
  11.         for i in range(numFeat):  
  12.             lineArr.append(float(curLine[i]))  
  13.         dataMat.append(lineArr)  
  14.         labelMat.append(float(curLine[-1]))  
  15.     return dataMat, labelMat  
  16. def standMaReg(xArr, yArr):  
  17.     xMat = mat(xArr)  
  18.     yMat = mat(yArr).T  
  19.     xTx  = xMat.T*xMat  
  20.     if linalg.det(xTx)==0.0:  
  21.         print 'This matrix is singular, connot do inverse'  
  22.         return  
  23.     ws = xTx.I*(xMat.T*yMat)  
  24.     return ws  
  25. def standBaGradReg(xArr, yArr, alpha=0.001, iter_num=15):  
  26.     xMat = mat(xArr)  
  27.     yMat = mat(yArr).T  
  28.     m,n=shape(xMat)  
  29.     weights = mat(ones((n,1)))  
  30.     for i in range(iter_num):  
  31.         yPredict = mat(xMat*weights)  
  32.         tmp=mat(zeros((n,1)))  
  33.         for j in range(n):  
  34.             tmp[j,:] += alpha*sum(multiply((yMat-yPredict),xMat[:,j]))  
  35.         weights = weights + tmp  
  36.     return weights  
  37. def lwlr(testPoint, xArr, yArr, k=1.0):  
  38.     xMat = mat(xArr)  
  39.     yMat = mat(yArr).T  
  40.     m = shape(xMat)[0]  
  41.     weights = mat(eye((m)))  
  42.     for j in range(m):  
  43.         diffMat = testPoint - xMat[j,:]  
  44.         weights[j,j] = exp(diffMat*diffMat.T/(-2.0*k**2))  
  45.     xTx = xMat.T*(weights*xMat)  
  46.     if linalg.det(xTx) == 0.0:  
  47.         print "This matrix is singular, cannot do inverse"  
  48.         return  
  49.     ws = xTx.I*(xMat.T*(weights*yMat))  
  50.     return testPoint*ws  
  51. def lwlrTest(testArr, xArr, yArr, k=1.0):  
  52.     m = shape(testArr)[0]  
  53.     yPre = zeros(m)  
  54.     for i in range(m):  
  55.         yPre[i] = lwlr(testArr[i], xArr, yArr, k)  
  56.     return yPre  
  57. def ridgeRegres(xMat, yMat, lam=0.2):  
  58.     xTx = xMat.T*xMat  
  59.     denom = xTx + eye(shape(xMat)[1])*lam  
  60.     if linalg.det(denom) == 0.0:  
  61.         print "This matrix is singular, cannot do inverse"  
  62.     ws = denom.I*(xMat.T*yMat)  
  63.     return ws  
  64. def ridgeTest(xArr, yArr, numIter=30):  
  65.     xMat = mat(xArr)  
  66.     yMat = mat(yArr).T  
  67.     yMean = mean(yMat,0)  
  68.     yMat = yMat - yMean  
  69.     xMeans = mean(xMat, 0)  
  70.     xVar = var(xMat, 0)  
  71.     xMat = (xMat - xMeans)/xVar  
  72.     wMat = zeros((numIter,shape(xMat)[1]))  
  73.     lamList = []  
  74.     for i in range(numIter):  
  75.         lamList.append(exp(i-10))  
  76.         ws = ridgeRegres(xMat, yMat, exp(i-10))  
  77.         wMat[i,:]=ws.T  
  78.     return wMat, lamList  
  79. def plotReg(weights, xArr, yArr, xIndex=0):  
  80.     xMat = mat(xArr)  
  81.     yMat = mat(yArr)  
  82.     fig = plt.figure()  
  83.     ax = fig.add_subplot(111)  
  84.     ax.scatter(xMat[:,xIndex].flatten().A[0], yMat.T[:,0].flatten().A[0])  
  85.     yPredict = xMat*weights  
  86.     ax.plot(xMat[:,xIndex], yPredict)  
  87.     plt.show()  
  88. xArr, yArr = loadDataSet("ex0.txt")  
  89. ''''' 
  90. ws1 = standMaReg(xArr, yArr) 
  91. print "ws1", ws1 
  92. plotReg(ws1, xArr, yArr, 1) 
  93. ws2 = standBaGradReg(xArr, yArr, 0.001, 1000) 
  94. print "ws2", ws2 
  95.  
  96. yPre = lwlrTest(xArr, xArr, yArr, 0.01) 
  97. xMat = mat(xArr) 
  98. srtInde = xMat[:,1].argsort(0) 
  99. xSort = xMat[srtInde][:,0,:] 
  100. fig = plt.figure() 
  101. ax = fig.add_subplot(111) 
  102. ax.plot(xSort[:,1], yPre[srtInde]) 
  103. ax.scatter(xMat[:,1].flatten().A[0], mat(yArr).T.flatten().A[0], s=2, c='red') 
  104. plt.show() 
  105. '''  
  106. abX, abY = loadDataSet('abalone.txt')  
  107. weights, lam = ridgeTest(abX, abY)  
  108. plt.plot(weights)  
  109. plt.show()  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值