簡單易學的機器學習演算法——嶺迴歸(Ridge Regression)
阿新 • • 發佈:2019-02-11
一、一般線性迴歸遇到的問題
在處理複雜的資料的迴歸問題時,普通的線性迴歸會遇到一些問題,主要表現在:
- 預測精度:這裡要處理好這樣一對為題,即樣本的數量和特徵的數量
- 時,最小二乘迴歸會有較小的方差
- 時,容易產生過擬合
- 時,最小二乘迴歸得不到有意義的結果
- 時,最小二乘迴歸會有較小的方差
- 模型的解釋能力:如果模型中的特徵之間有相互關係,這樣會增加模型的複雜程度,並且對整個模型的解釋能力並沒有提高,這時,我們就要進行特徵選擇。
以上的這些問題,主要就是表現在模型的方差和偏差問題上,這樣的關係可以通過下圖說明:
(摘自:機器學習實戰)
方差指的是模型之間的差異,而偏差指的是模型預測值和資料之間的差異。我們需要找到方差和偏差的折中。
二、嶺迴歸的概念
在進行特徵選擇時,一般有三種方式:
- 子集選擇
- 收縮方式(Shrinkage method),又稱為正則化(Regularization)。主要包括嶺迴歸個lasso迴歸。
- 維數縮減
,
通過確定的值可以使得在方差和偏差之間達到平衡:隨著的增大,模型方差減小而偏差增大。
對求導,結果為
令其為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