簡單易學的機器學習演算法

2022-05-14 19:59:05 字數 1986 閱讀 1918

在處理複雜的資料的迴歸問題時,普通的線性迴歸會遇到一些問題,主要表現在:

模型的解釋能力:如果模型中的特徵之間有相互關係,這樣會增加模型的複雜程度,並且對整個模型的解釋能力並沒有提高,這時,我們就要進行特徵選擇。

以上的這些問題,主要就是表現在模型的方差和偏差問題上,這樣的關係可以通過下圖說明:

(摘自:機器學習實戰)

方差指的是模型之間的差異,而偏差指的是模型**值和資料之間的差異。我們需要找到方差和偏差的折中。

在進行特徵選擇時,一般有三種方式:

嶺迴歸(ridge regression)是在平方誤差的基礎上增加正則項

,通過確定

的值可以使得在方差和偏差之間達到平衡:隨著

的增大,模型方差減小而偏差增大。

對求導,結果為

令其為0,可求得

的值:我們去**一下取不同的

對整個模型的影響。

matlab**

主函式[plain]view plain

copy

print

?%% 嶺迴歸(ridge regression)  

%匯入資料  

data = load('abalone.txt');  

[m,n] = size(data);  

datax = data(:,1:8);%特徵  

datay = data(:,9);%標籤  

%標準化  

ymeans = mean(datay);  

for i = 1:m  

ymat(i,:) = datay(i,:)-ymeans;  

end  

xmeans = mean(datax);  

xvars = var(datax);  

for i = 1:m  

xmat(i,:) = (datax(i,:) - xmeans)./xvars;  

end  

% 運算30次  

testnum = 30;  

weights = zeros(testnum, n-1);  

for i = 1:testnum  

w = ridgeregression(xmat, ymat, exp(i-10));  

weights(i,:) = w';  

end  

% 畫出隨著引數lam  

hold on  

axis([-9 20 -1.0 2.5]);  

xlabel log(lam);  

ylabel weights;  

for i = 1:n-1  

x = -9:20;  

y(1,:) = weights(:,i)';  

plot(x,y);  

end  

嶺迴歸求迴歸係數的函式

[plain]view plain

copy

print

?function [ w ] = ridgeregression( x, y, lam )  

xtx = x'*x;  

[m,n] = size(xtx);  

temp = xtx + eye(m,n)*lam;  

if det(temp) == 0  

disp('this matrix is singular, cannot do inverse');  

end  

w = temp^(-1)*x'*y;  

end