1. 程式人生 > >【吳恩達 機器學習】 邏輯迴歸演算法Matlab實現

【吳恩達 機器學習】 邏輯迴歸演算法Matlab實現

一,假設函式:

1) 邏輯迴歸(Logistic Regression),Logistic function, Sigmoid function是同一個意思,函式形式(假設函式形式)如下:

邏輯迴歸是二分類演算法,hθ(x)>=0.5z>=0, 即θTx>=0),則y=1

2) 決策邊界(Decision Boundary)
邏輯函式分為正類和負類時的邊界,即hθ(x)=0.5即為邊界函式。

上圖假定引數θ已經學好, 根據上一張圖知θTx>=0為正類,θ

Tx<0為負類,則邊界為θTx=0,此時邊界為x1+x2=3

3) 非線性決策邊界
假設已經使用訓練集訓練邏輯迴歸模型,得到引數θ,於線性邊界一樣,則非線性決策邊界為θTx=0,如下

二,引數學習

1) 損失函式,學習引數,首先需要定義損失函式,線性迴歸的損失函式可以是均方誤差

J(θ)=1mi=1m(hθ(xi)yi)2,但邏輯迴歸的損失函式不能使用均方誤差函式,因為邏輯迴歸函式hθ(x)=11+exp(θTx),也叫Sigmoid function作為假設函式,此函式是非線性的,會導致均方誤差函式為non-convex(函式的二階導數大於等於零,那麼這個函式就是凸函式
),有許多區域性最小值。所有需要定義新的損失函式,如下:

損失函式另一種表達方式是:

Cost(hθ(x),y)=ylog(hθ(x))(1y)log(1hθ(x))
所有樣本的損失值之和:J(θ)=1/mi=1mCost(hθ(x),y)

2) 使用梯度下降演算法,找到J損失值最小時的引數θ,預測某個樣本x時,利用得到的引數θ代入假設函式(邏輯迴歸函式,Sigmoid函式),即可求得預測值:

hθ(
x)=11+exp(θTx)

3) 梯度下降法,損失函式偏導具體推導過程參考連結

前面已經確定了三要素:假設函式,損失函式,梯度下降

三,Matlab實現

資料集下載:百度雲連結 密碼:tb4p

假設一所高中有一個數據集,代表40名學生被錄取進入大學,40名學生未被錄取。訓練樣本包含兩個標準化考試的學生成績和學生是否被錄取的標籤。

任務是建立一個二元分類模型,根據學生在兩次考試中的分數來估計大學錄取的機會。

ex4x.dat:X陣列的第一列代表所有的測試1分數,第二列代表所有的測試2分數。
ex4y.dat:Y向量使用“1”來標記被錄取和“0”以標記未錄取的學生。

資料分佈

Matlab程式碼

clear;
clc;
% 1,讀入資料
load('D:\Code\Data\ex4Data\ex4x.dat');
load('D:\Code\Data\ex4Data\ex4y.dat');
x = ex4x;
y = ex4y;

% 2,顯示資料,檢視分佈
pos = find(y == 1); neg = find(y == 0);
plot(x(pos, 1), x(pos,2), '+'); hold on
plot(x(neg, 1), x(neg, 2), 'o')

% 3, 引數設定
iteration = 10000;
sample_num = length(x); % 樣本個數
x = [ones(sample_num, 1), x];
theta = zeros(size(x, 2), 1); % 引數
alpha = 0.1;

% 4,特徵歸一化
x(:,2) = (x(:,2)- mean(x(:,2)))./ std(x(:,2));
x(:,3) = (x(:,3)- mean(x(:,3)))./ std(x(:,3));

% 5,迭代,尋找最佳引數
for i = 1:iteration
    h = 1 ./ (1 + exp(-x * theta)); % 通過假設函式得到預測值
    J(i,1) = -1/sample_num * (y' * log(h+eps) + (1-y)'*log(1-h+eps)); % 當前引數下的損失值
    theta(1,1) = theta(1,1) - alpha * sum((h - y) .* x(:,1));  % 更新引數
    theta(2,1) = theta(2,1) - alpha * sum((h - y) .* x(:,2));
    theta(3,1) = theta(3,1) - alpha * sum((h - y) .* x(:,3));
    %theta = theta - alpha * x'*(h-y); % 同時更新所有引數
end

figure,
plot(x(pos, 2), x(pos,3), '+'); hold on
plot(x(neg, 2), x(neg, 3), 'o')

% 6,邊界為Theta'x = 0; theta_1 + theta_2*x_2 + theta_3*x_3 = 0
max_value = max(x(:,2));
min_value = min(x(:,2));
X = min_value:0.001:max_value;
Y = -(theta(1,1) + theta(2,1) * X) / theta(3,1);
plot(X, Y, '-')

效果圖,畫決策邊界(