1. 程式人生 > >機器學習經典演算法7-線性迴歸

機器學習經典演算法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. yPre = lwlrTest(xArr, xArr, yArr, 0.01) 
  96. xMat = mat(xArr) 
  97. srtInde = xMat[:,1].argsort(0) 
  98. xSort = xMat[srtInde][:,0,:] 
  99. fig = plt.figure() 
  100. ax = fig.add_subplot(111) 
  101. ax.plot(xSort[:,1], yPre[srtInde]) 
  102. ax.scatter(xMat[:,1].flatten().A[0], mat(yArr).T.flatten().A[0], s=2, c='red') 
  103. plt.show() 
  104. '''
  105. abX, abY = loadDataSet('abalone.txt')  
  106. weights, lam = ridgeTest(abX, abY)  
  107. plt.plot(weights)  
  108. plt.show()