優點:結果易於理解,計算上不複雜
缺點:對非線性的資料擬合不好
適用資料型別:數值型和標稱型
基本步驟:
收集資料
準備資料
分析資料
訓練演算法
測試演算法
使用演算法
平方誤差的計算公式:su
m[1,
m]=(
yi−x
it×w
)2( .t在這裡代表矩陣的轉置,是python中常用的語法)
w最優解公式:w最
優=(x
t×x)
−1×x
t×y
(.i同樣是python中的語法,表示對矩陣求逆)
具體的訓練實現**比較簡單,在這裡略過,但有一點需要說明,即x.t*x的行列式應當不為零,原因如下:
設有矩陣a,由行列式定理可知,a.i=1/|a|*a^*,即a的逆等於a的行列式分之伴隨矩陣,故矩陣a行列式不可以為零。矩陣行列式可直接呼叫python內linalg.det()進行計算。
最佳擬合直線方法將資料視為直線進行建模,具有十分不錯的表現。但問題是很可能會出現欠擬合的現象。由此我們引入區域性加權線性回歸。
區域性加權線性回歸
在該演算法中,我們給**點附近的每個點賦予一定的權重,在這個子集上基於最小均方差來進行普通的回歸。公式如下:w最
優=(x
.t×w
×x)i
×xt×
w×y
其中的w是乙個矩陣,來給每個資料點賦予權重。
我們使用「核」來對附近的點賦予更高的權重。核的型別可以自由選擇,最常用的核就是高斯核,公式如下: w(
i,i)
=exp
(|xi
−x|)
−2×k
2
def lwlr(testpoint,xarr,yarr,k=1.0):
xmat = mat(xarr) ; ymat=mat(yarr).t
m = shape(xmat)[0]
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 "this matrix is singular, 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
區域性加權線性回歸存在的問題是計算量,因為它對每個點做**時都必須使用整個資料集。
縮減係數來「理解」資料
如果資料的特徵比樣本點還多怎麼辦?是否還可以使用線性回歸和之前的方法來做**?答案是否定的,即不能再使用前面介紹的方法。這是因為在計算(x.t*x).i時會出錯。因為特徵比樣本點還多,則輸入矩陣不是滿執矩陣,其行列式為零,因此無法求解。
為了解決這個問題,在這裡引入嶺回歸的概念。
嶺回歸簡單來說,嶺回歸就是在矩陣x^t* x
上加乙個lambada* x從而使得矩陣非奇異,進而能求逆。其中矩陣x式乙個m\times m的單位矩陣,對角線上元素全為1,其他元素全為0。此時,回歸係數的計算公式將變為: w最
優=(x
t×x+
lamb
da×i
)−1×
xt×y
嶺回歸最先用來處理特徵數多於樣本數的情況,現在也用於在估計中加入偏差,從而得到更好的估計。這裡用過引入lambda來限制了所有w之和,通過引入該懲罰項,能夠減少不重要的引數,這個技術在統計學中也叫縮減。
嶺回歸的**和普通線性回歸**類似,在這裡就不贅述了。
向前逐步回歸
向前逐步回歸演算法可以得到與lasso差不多的效果,但更加簡單。它屬於一種貪心演算法,即每一步都盡可能地減少誤差。一開始,所有的權重都設為1,然後每一步所做的決策是對某個權重增加或者減少乙個很小的值。
該演算法的為**如下所示:
資料標準化,使其分布滿足0均值和單位方差
在每輪迭代過程中:
設定當前最小誤差lowesterror為正無窮
對每個特徵:
增大或減小得到乙個新的w
計算新w下的誤差
如果誤差error小於當前最小誤差:
設定wbest等於當前w
將w設定為新的wbest
以上就是線性回歸的基本內容了,其中還有lasso回歸沒有講到,據說該演算法較為複雜,我自己也還沒有掌握,在這裡就不多說了。 線性回歸中的對於「線性」的理解
所謂 線性 回歸,那當然一定是 線性 才能用的回歸。如果你的自變數和因變數之間的關係都不是 線性 關係,那還叫什麼 線性 回歸?假設x是自變數,y是因變數,且滿足如下線性關係 y i beta 0 beta 1xi nu i 其實線性假定並不要求初始模型都呈上述的嚴格線性關係,可以通過對自變數和因變...
RSA 數學原理
提起rsa大家一定不陌生,在開發中經常使用,也經常聽同事說道。話說很久以前,人們就懂的了加密這個技術。在戰爭時期,間諜就會拿著密文和密匙來對資訊就行傳遞。這種簡單的密文 密匙 key 就是對稱加密 加密 明文 密匙 解密 密文 密匙 由於這種加密方式過於簡單,所以後來引入了數學演算法。rsa就是由特...
補碼的數學原理
計算機是用n位0和1來表示數字的,這樣很容易表示正數,但是怎麼表示負數呢?人類聰明的大腦想到了用第一位來表示符號,0代表正數,1代表負數。這種表示方法最好理解,叫做原碼。但是計算機在計算的時候,為了簡化,需要把減法當做加法運算。這個很簡單,負數不就是幹這個的嗎?比如2 1 2 1 但是負數如果按照原...