機器學習python縮減係數

2021-08-15 09:43:22 字數 3306 閱讀 2340

如果特徵比樣本點多,那麼對於用矩陣求解的方式就不可行,因為矩陣不可逆,這時候可以通過嶺回歸的方法,在矩陣xtx上加乙個λr,使得矩陣可逆,那麼回歸係數w

= (x

tx+λi)-1x

ty,i是單位矩陣,lam是自己定義的乙個係數,同時嶺回歸還可以用在估計中加入偏差,從而限制w的和,通過加入這個引數,可以減少不重要的引數。

這是不同的幾個回歸係數,橫座標是ln(lam)的值,縱座標是回歸係數,通過引進不同的lam,得到的回歸係數不同,而隨著lam的增大,w將衰減為0

另一種方法是lasso,限制條件是w的絕對值求和<=lam,在lam足夠小的時候,一些係數會縮減到0,這裡是用前向回歸演算法,它是通過談心的思想,每一次迭代,盡可能減少誤差。在每一次迭代中,對每乙個係數,增大或縮小,然後重新計算新w的誤差,如果誤差小於當前最小誤差,更新w

演算法偽**:

資料標準化,滿足0均值和單位方差

在每輪的迭代過程中:

設定當前最小誤差lowesterror為正無窮

對每個特徵:

增大或縮小:

改變乙個係數得到乙個新的w

計算新w下的誤差

如果誤差error小於當前最小誤差lowesterror:設定wbest等於當前w

將w設定為新的wbest

如果用於測試,該演算法每迭代100次就可以構建乙個模型,可以通過類似10折交叉驗證的方法比較這些模型,選擇誤差比較小的

這兩種方法都是增加了偏差,減小了模型的方差。

from numpy import *

def loaddataset(filename):

numfeat = len(open(filename).readline().split('\t')) - 1

datamat =

labelmat =

fr = open(filename)

for line in fr.readlines():

linearr =

curline = line.strip().split('\t')

for i in range(numfeat):

return datamat,labelmat

def ridgeregress(xmat,ymat,lam=0.2):

xtx = xmat.t * xmat

demon = xtx + eye(shape(xmat)[1]) * lam

if linalg.det(demon) == 0.0:

print("error")

return

ws = demon.i * (xmat.t * ymat)

return ws

#嶺回歸

def ridgetest(xarr,yarr):

xmat = matrix(xarr)

ymat = mat(yarr).t

ymean = mean(ymat,0)

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 = ridgeregress(xmat,ymat,exp(i-10))

wmat[i,:] = ws.t

return wmat

def rsserror(yarr,yhatarr):

return ((yarr-yhatarr)**2).sum()

def regularize(xmat):#regularize by columns

inmat = xmat.copy()

inmeans = mean(inmat,0)

invar = var(inmat,0)

inmat = (inmat - inmeans)/invar

return inmat

def stagewise(xarr,yarr,eps=0.01,numit=100):

xmat = mat(xarr)

ymat = mat(yarr).t

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

abx,aby = loaddataset('abalone.txt')

a = stagewise(abx,aby,0.005,1000)

rw = ridgetest(abx,aby)

# print(shape(rw))

import matplotlib.pyplot as plt

fig = plt.figure(1)

ax = fig.add_subplot(111)

ax.plot(a)

fig = plt.figure(2)

ax = fig.add_subplot(111)

ax.plot(rw)

plt.show()

回歸(二) 縮減係數

回歸演算法中不管是用線性回歸找到最佳擬合直線,還是加權的線性回歸演算法,我們都是直接用矩陣相乘的方式,直接計算出對應的 係數,這都是對應訓練資料組成的矩陣是可逆的,換句話說x矩陣是滿秩的,而對於某些屬性個數多餘樣本個數的樣本 樣本資料組成矩陣後列數多於行數 組成的矩陣是不滿秩,計算 xtx 1的時候...

機器學習之線性回歸縮減維度

參考文獻 如上圖 前面 我們求解線性回歸的時候 列舉的乙個例子。這個例子中 房子的面積,房間的數量 樓間距,離學校的距離 我們的資料 從這四個維度取例 也稱為資料的維度 用d表示。下面的每一行 表示乙個 房子的樣本 樣本可以有n 多個。當我們資料的維度 大於 樣本的數量的時候 我們稱為 維數膨脹 在...

python機器 python機器學習

熱詞系列 打卡 mark一下,以後看 每天打卡學習 1 python 基礎 bv1lt4y1u7un 2 python 高階 bv1jz411b7dh 3 python 資料庫 bv1pg4y1a7a7 4 python gui與坦克大戰 bv1je411f72o 5 python numpy bv...