標籤:最小 lin 解決 分類方法 特徵 估計 差分 cannot can
線性迴歸
優點:結果易於理解,計算上不複雜
缺點:對非線性資料擬合不好
適用資料類型:數值型和標稱型資料
horse=0.0015*annualSalary-0.99*hoursListeningToPulicRadio
這就是所謂的迴歸方程,其中的0.0015和-0.99稱作迴歸係數,
求這些迴歸係數的過程就是迴歸。一旦有了這些迴歸係數,再給定輸入,做預測就非常容易了
具體的做法就是用迴歸係數乘以輸入值,再將結果全部加在一起,就得到了預測值
迴歸的一般方法
(1)收集資料:採用任意方法收集資料
(2)準備資料:迴歸需要數值型資料,標稱型資料將被轉成二值型資料(3)分析資料:繪出資料的可視化二維圖將有助於對資料做出理解和分析,在採用縮減法球的新迴歸係數之後,
可以將新擬合線繪在圖上作為對比
(4)訓練演算法:找到迴歸係數
(5)測試演算法:適用R2或者預測值和資料的擬合度,來分析模型的效果
(6)使用演算法:使用迴歸,可以在給定輸入的時候預測出一個數值,這是對分類方法的提升,
因為這樣可以預測連續型資料而不僅僅是離散的類別標籤
應當怎樣從一大堆資料中求出迴歸方程呢?嘉定輸入資料存放在舉著呢X中,而迴歸係數存放在向量w中,那麼對於
給定的資料x1,預測結果將會通過y1=x1^T *W給出。現在的問題是,手裡有些x和對應的y值,怎樣才能找到W呢?
一個常用的方法就是找出使誤差最小的w。這裡的誤差是指預測y值和真實y值之間的差值,使用該誤差的簡單累加
將使得正差值和負差值相互抵消,所以我們採用平方誤差
1 from numpy import * 2 3 def loadDataSet(fileName): #general function to parse tab -delimited floats 4 numFeat = len(open(fileName).readline().split(‘\t‘)) - 1 #get number of fields 5 dataMat = []; labelMat = [] 6 fr = open(fileName) 7 for line in fr.readlines(): 8 lineArr =[] 9 curLine = line.strip().split(‘\t‘)10 for i in range(numFeat):11 lineArr.append(float(curLine[i]))12 dataMat.append(lineArr)13 labelMat.append(float(curLine[-1]))14 return dataMat,labelMat15 16 def standRegres(xArr,yArr):17 xMat = mat(xArr); yMat = mat(yArr).T18 xTx = xMat.T*xMat19 if linalg.det(xTx) == 0.0:20 print("This matrix is singular, cannot do inverse")21 return22 ws = xTx.I * (xMat.T*yMat)23 return ws
線性迴歸的一個問題是有可能出現欠擬合現象,因為它求的是具有最小均方誤差的無偏估計。
顯而易見,如果模型欠擬合將不能取得較好的預測結果。所以有些方法允許在估計中引入一些偏差,
從而降低預測的均方誤差。
其中一個方法是局部加權線性迴歸(LWLR)。在該演算法中,我們給待預測點附近的每個點賦予一定的權重;
1 def lwlr(testPoint,xArr,yArr,k=1.0): 2 xMat = mat(xArr); yMat = mat(yArr).T 3 m = shape(xMat)[0] 4 weights = mat(eye((m))) 5 for j in range(m): #next 2 lines create weights matrix 6 diffMat = testPoint - xMat[j,:] # 7 weights[j,j] = exp(diffMat*diffMat.T/(-2.0*k**2)) 8 xTx = xMat.T * (weights * xMat) 9 if linalg.det(xTx) == 0.0:10 print("This matrix is singular, cannot do inverse")11 return12 ws = xTx.I * (xMat.T * (weights * yMat))13 return testPoint * ws
如果資料的特徵比樣本點還多應該怎麼辦?是否可以使用線性迴歸和之前的方法來做預測?
答案是否定的,即不能再使用前面介紹的方法,這是因為在計算(x^T*x)^-1的時候會出錯
如果特徵比樣本點還多(n>m),也就是說輸入資料的矩陣x不是滿秩矩陣,非滿秩矩陣在求逆
的時會出現問題,為解決這個問題,專家引入了嶺迴歸的概念。簡單來說,嶺迴歸就是在矩陣
X^T*X上加一個λI從而使得矩陣非奇異,進而能對x^T*x+λI求逆。其中I是單位矩陣,λ是使用者定
義的一個數值。
嶺迴歸是縮減法的一種,相當於對迴歸係數的大小施加了限制。另一種很好的縮減法是lasso。Lasso難以求解,但可以使用計算簡便的逐步線性迴歸方法來求得近似的結果
縮減法還可以看作是對一個模型增加偏差的同時減少方差。偏差方差分析折中是一個重要的概念,可以協助我們理解現有規模並做出改進,從而得到更好的模型
線性迴歸 python小範例