1. 程式人生 > >簡單易學的機器學習演算法——嶺迴歸(Ridge Regression)

簡單易學的機器學習演算法——嶺迴歸(Ridge Regression)

一、一般線性迴歸遇到的問題

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

  • 預測精度:這裡要處理好這樣一對為題,即樣本的數量和特徵的數量
    • 時,最小二乘迴歸會有較小的方差
    • 時,容易產生過擬合
    • 時,最小二乘迴歸得不到有意義的結果
  • 模型的解釋能力:如果模型中的特徵之間有相互關係,這樣會增加模型的複雜程度,並且對整個模型的解釋能力並沒有提高,這時,我們就要進行特徵選擇。

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


(摘自:機器學習實戰)

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

二、嶺迴歸的概念

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

  • 子集選擇
  • 收縮方式(Shrinkage method),又稱為正則化(Regularization)。主要包括嶺迴歸個lasso迴歸。
  • 維數縮減
    嶺迴歸(Ridge Regression)是在平方誤差的基礎上增加正則項

,

通過確定的值可以使得在方差和偏差之間達到平衡:隨著的增大,模型方差減小而偏差增大。

    對求導,結果為


令其為0,可求得的值:


三、實驗的過程

    我們去探討一下取不同的對整個模型的影響。


MATLAB程式碼

主函式

%% 嶺迴歸(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

嶺迴歸求迴歸係數的函式
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