在處理複雜的資料的迴歸問題時,普通的線性迴歸會遇到一些問題,主要表現在:
模型的解釋能力:如果模型中的特徵之間有相互關係,這樣會增加模型的複雜程度,並且對整個模型的解釋能力並沒有提高,這時,我們就要進行特徵選擇。
以上的這些問題,主要就是表現在模型的方差和偏差問題上,這樣的關係可以通過下圖說明:
(摘自:機器學習實戰)
方差指的是模型之間的差異,而偏差指的是模型**值和資料之間的差異。我們需要找到方差和偏差的折中。
在進行特徵選擇時,一般有三種方式:
嶺迴歸(ridge regression)是在平方誤差的基礎上增加正則項
,通過確定
的值可以使得在方差和偏差之間達到平衡:隨著
的增大,模型方差減小而偏差增大。
對求導,結果為
令其為0,可求得
的值:我們去**一下取不同的
對整個模型的影響。
matlab**
主函式[plain]view plain
copy
?%% 嶺迴歸(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
?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