【吳恩達 機器學習】 邏輯迴歸演算法Matlab實現
阿新 • • 發佈:2019-02-16
一,假設函式:
1) 邏輯迴歸(Logistic Regression),Logistic function, Sigmoid function是同一個意思,函式形式(假設函式形式)如下:
邏輯迴歸是二分類演算法,(, 即),則。
2) 決策邊界(Decision Boundary)
邏輯函式分為正類和負類時的邊界,即即為邊界函式。
上圖假定引數已經學好, 根據上一張圖知為正類,為負類,則邊界為,此時邊界為
3) 非線性決策邊界
假設已經使用訓練集訓練邏輯迴歸模型,得到引數,於線性邊界一樣,則非線性決策邊界為,如下
二,引數學習
1) 損失函式,學習引數,首先需要定義損失函式,線性迴歸的損失函式可以是均方誤差
,但邏輯迴歸的損失函式不能使用均方誤差函式,因為邏輯迴歸函式,也叫Sigmoid function作為假設函式,此函式是非線性的,會導致均方誤差函式為non-convex(函式的二階導數大於等於零,那麼這個函式就是凸函式損失函式另一種表達方式是:
所有樣本的損失值之和:
2) 使用梯度下降演算法,找到損失值最小時的引數,預測某個樣本時,利用得到的引數代入假設函式(邏輯迴歸函式,Sigmoid函式),即可求得預測值:
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, '-')
效果圖,畫決策邊界(