Coursera-MachineLearning-LogisticRegression-Regularization

Coursera機器學習-吳恩達

線性迴歸和邏輯迴歸解決過擬合:
1.減少特徵數量:
	1.手動選擇要保留的特徵,剔除一些特徵
	2.使用模型選擇算法
2.正則化(Regularization):
	1.保留所有特徵,但減少參數 theta 的大小;
	2.有許多稍微有用的特徵時,正則化很有效。
% 1.讀取訓練集,並打印正負樣本
data = load('ex2data2.txt');
X = data(:, [1, 2]); 
y = data(:, 3);
plotData(X, y);
hold on;
xlabel('Microchip Test 1')
ylabel('Microchip Test 2')
legend('y = 1', 'y = 0')
hold off;

% 函數plotData:
function plotData(X, y)
figure; 
hold on;
% 打印正樣本和負樣本
positive = find(y == 1);
negative = find(y == 0);
plot(X(positive, 1), X(positive, 2), 'k+', 'LineWidth', 2, 'MarkerSize', 7);
plot(X(negative, 1), X(negative, 2), 'ko', 'MarkerFaceColor', 'y', 'MarkerSize', 7);
hold off;
end

在這裏插入圖片描述

% 2.邏輯迴歸正則化:(原理見3)

% 特徵映射,(Feature Mapping):
% 使用兩個特徵(x1,x2)組合出更多的特徵如x1x2, x1^2, x2^2, x1*x2^3等
X = mapFeature(X(:,1), X(:,2));

% 函數 mapFeature:
function out = mapFeature(X1, X2)
degree = 6;
out = ones(size(X1(:,1)));
for i = 1:degree
    for j = 0:i
        out(:, end+1) = (X1.^(i-j)).*(X2.^j);
    end
end
end

% 初始化擬合參數
initial_theta = zeros(size(X, 2), 1);

% 設置正則化參數爲1
lambda = 1;

% 計算初始 theta 的代價函數和梯度
[cost, grad] = costFunctionReg(initial_theta, X, y, lambda);
fprintf('Cost at initial theta (zeros): %f\n', cost);
fprintf(' %f \n', grad(1:5));

% with all-ones theta and lambda = 10
test_theta = ones(size(X,2),1);

% 計算全1 theta 的代價函數和梯度
[cost, grad] = costFunctionReg(test_theta, X, y, 10);
fprintf('Cost at initial theta (zeros): %f\n', cost);
fprintf(' %f \n', grad(1:5));


% 函數 costFunctionReg:
function [J, grad] = costFunctionReg(theta, X, y, lambda)
m = length(y); 
J = 0;
grad = zeros(size(theta));

[J, grad] = costFunction(theta, X, y);

% 經過正規化的代價函數
J = J + lambda / (2 * m) * (sum(theta .^ 2) - theta(1) ^ 2);
grad = grad + lambda / m * theta;
grad(1) = grad(1) - lambda / m * theta(1);
end

在這裏插入圖片描述

% 3.正規化原理:
% 3.1 爲何需要正規化:解決過擬合

前面我們使用 mapFeature 函數生成了很多特徵項,有 x1^2, x2^4, x1^2 * x2^5等等
那麼這些高次冪的特徵會導致函數過擬合
而太少特徵項的次冪則導致欠擬合:

在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述

% 3.1 正規化原理:
原理是要把後面這些高次冪的 theta 對函數的影響消除掉,在不去掉它的情況下;

如何消除,因爲代價函數我們需要求它的最小值,
因此我們只需在代價函數後加上一個常數 * 需要消除影響的theta;

在求代價函數最小值時,由於後面加了個 常數 * theta,
那麼只有theta越小,常數 * theta 纔會越小,才能求到 J 的最小值;

這就間接消除了theta在代價函數的作用,因爲它很小了。

在這裏插入圖片描述
在這裏插入圖片描述

% 3.2 正規化的實際實現:

由於我們並不知道那個 theta 對函數影響,因此我們對所有 theta 均採取正規化,
除了 theta0 。
前面乘的常數就是 lambda 
lambda 太大,theta 對 J 的影響就很小,導致欠擬合;
lambda 太小,theta 對 J 的影響就很大,導致過擬合;

邏輯迴歸:
在這裏插入圖片描述
在這裏插入圖片描述
線性迴歸:
在這裏插入圖片描述
在這裏插入圖片描述

% 4.使用高級優化算法求最小 theta ,並在訓練集上驗證準確率

initial_theta = zeros(size(X, 2), 1);

% 設置lambda,需手動調整
lambda = 1;

options = optimset('GradObj', 'on', 'MaxIter', 400);

%求 theta
[theta, J, exit_flag] = ...
	fminunc(@(t)(costFunctionReg(t, X, y, lambda)), initial_theta, options);

% Plot Boundary 打印
plotDecisionBoundary(theta, X, y);
hold on;
title(sprintf('lambda = %g', lambda))
xlabel('Microchip Test 1')
ylabel('Microchip Test 2')
legend('y = 1', 'y = 0', 'Decision boundary')
hold off;

% 驗證準確率
p = predict(theta, X);

fprintf('Train Accuracy: %f\n', mean(double(p == y)) * 100);

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章