分類
模型如下:
- 回歸問題:學習的結果是連續的,比如房價等等
- 分類問題:學習的結果是非連續的,分成某幾個類
梯度下降
例子:
:
條件:
- 對于輸入X有n個特征值。X = { x1,x2,x3,x4,.......,xn x 1 , x 2 , x 3 , x 4 , . . . . . . . , x n }
- 一共有m組輸入。 X1,X2,......,Xm X 1 , X 2 , . . . . . . , X m
結果:
- 根據給出的資料得到函數 hθ h θ (x),關于 θ θ 的一個函數
假設:
- J(θ) J ( θ ) 主要用來描述該方程在樣本點的逼近程度
特點:
- 都具有局部最小值
- 最後的結果并不一定是總體的最小值
1.批梯度下降:
-
思路:
先初始化 θ θ = 0向量,然後通過學習,不斷改變 θ θ 使 Jθ J θ 不斷減小,緻使方程不斷在學習點逼近真值。(至于為什麼要選擇最小二乘法和為什麼這個值有極限,稍後給出證明)
- 疊代方程: 其中:
- α α 決定下降速度
- 推導方程: 疊代算法:
- 注意:
- 該算法每次疊代檢視了所有樣本,知道 θ θ 收斂
- 收斂的意思是:誤差在允許的範圍内就沒有繼續發生變化了
2.增量梯度下降:
- 疊代算法:
- 注意:
- 每次疊代隻用到了第 i i 個樣本
正規方程組
1.矩陣導數
-
表示:
對矩陣A的導數,函數ff是一個由矩陣到實數的映射
- 矩陣的迹:
- 相關的性質:
- 交換性,要就矩陣的乘法有意義:
2.最小二乘法
令 J(θ) J ( θ ) 偏導為 0 我們可以直接求出 θ θ , 推導過程:
機率論解釋
1.問題:
為什麼線上性回歸中我們要用最小二乘作為誤差項,而不用三次方,四次方之類的。
2.解答:
- 設: ϵ(i) ϵ ( i ) 是誤差項, ϵ(i) ϵ ( i ) ~ N(0,σ2) N ( 0 , σ 2 )
- 是以: 即: y(i) y ( i ) | x(i);θ x ( i ) ; θ ~ N(θTx(i),σ2) N ( θ T x ( i ) , σ 2 )
- 用最大概然法:
-
了解:
我們把輸入X,X = { x1,x2,x3,x4,.......,xn x 1 , x 2 , x 3 , x 4 , . . . . . . . , x n }看做一組樣本,而 Y Y 是一組樣本對應的觀測值,而且由前面的推導我們可以知道該事件是符合y(i)y(i)| x(i);θ x ( i ) ; θ ~ N(θTx(i),σ2) N ( θ T x ( i ) , σ 2 ) 。是以利用最大似然法我們可以求出未知參數 θ θ ,即最大化 L(θ) L ( θ ) 。
- 在梯度下降中。最大化 L(θ) L ( θ ) ,就是最小化 即 J(θ) J ( θ ) ,是以我們讓 J(θ) J ( θ ) 的偏導作為增量更新 θ θ ,最後 J(θ) J ( θ ) 的偏導近似為0時,我們認為疊代結束。
- 在上面最小二乘法中。最大化 L(θ) L ( θ ) ,也就是令 l(θ) l ( θ ) 的偏導為0,是以我們可以直接求 l(θ) l ( θ ) 的偏導為0,求出 θ θ .
代碼實作:
主要檔案:
- test1相當于主要檔案
- GradientDecent主要是梯度下降更新 θ θ
- ComputeCost主要用來根據給出的 θ θ 計算出代價 J J <script type="math/tex" id="MathJax-Element-39">J</script>
test1函數:
%% part0; 裝載資料
data = load('ex1data1.txt');
x = data(:,);
y = data(:,);
m = length(y);
%% part1: 初始化,畫出離散的點
plot(x,y,'rx','Markersize',);
ylabel('profit in $10,000s');
xlabel('population in $10,000s');
pause;
%% part2:run gradient descent,view theta
x = [ones(m,), data(:,)];
theta = zeros(,);
iterations = ;
alpha = ;
computeCost(x, y, theta)
theta = gradientDescent(x, y, theta, alpha, iterations);
x2 = :;
y2 = theta(,) + theta(,) * x2;
plot(x(:,),y,'rx',x2,y2,'blu','Markersize',);
ylabel('profit in $10,000s');
xlabel('population in $10,000s');
pause;
%% Part 4: Visualizing J(theta_0, theta_1)
%給出相應的theta0,theta1的連續值100個,組成100*100的theta矩陣,根據每個theta組合算出cost J形成一個三維圖形
%theta0, theta1, J。友善檢視J的下降方向
fprintf('Visualizing J(theta_0, theta_1) ...\n')
% Grid over which we will calculate J
theta0_vals = linspace(-, , );
theta1_vals = linspace(-, , );
% initialize J_vals to a matrix of 0's
J_vals = zeros(length(theta0_vals), length(theta1_vals));
% Fill out J_vals
for i = :length(theta0_vals)
for j = :length(theta1_vals)
t = [theta0_vals(i); theta1_vals(j)];
J_vals(i,j) = computeCost(x, y, t);
end
end
% Because of the way meshgrids work in the surf command, we need to
% transpose J_vals before calling surf, or else the axes will be flipped
J_vals = J_vals';
% Surface plot
figure;
surf(theta0_vals, theta1_vals, J_vals)
xlabel('\theta_0'); ylabel('\theta_1');
% Contour plot
figure;
% Plot J_vals as 15 contours spaced logarithmically between 0.01 and 100
contour(theta0_vals, theta1_vals, J_vals, logspace(-, , ))
xlabel('\theta_0'); ylabel('\theta_1');
hold on;
plot(theta(), theta(), 'rx', 'MarkerSize', , 'LineWidth', );
GradientDecent函數:
function [theta,J_history] = gradientDescent(x, y, theta, alpha, num_iters)
%GRADIENTDESCENT Performs gradient descent to learn theta
% theta = GRADIENTDESENT(X, y, theta, alpha, num_iters) updates theta by
% taking num_iters gradient steps with learning rate alpha
% Initialize some useful values
m = length(y); % number of training examples
J_history = zeros(num_iters, );
thetas = zeros(num_iters,);
for iter = :num_iters
% ====================== YOUR CODE HERE ======================
% Instructions: Perform a single gradient step on the parameter vector
% theta.
%
% Hint: While debugging, it can be useful to print out the values
% of the cost function (computeCost) and gradient here.
%
for j = :
dec = ;
for i = :m
dec = dec + (x(i,:)*theta - y(i,)) * x(i,j);
end
theta(j,) = theta(j,) - alpha*dec/m;
end
% ============================================================
% Save the cost J in every iteration
J_history(iter) = computeCost(x, y, theta);
end
end
ComputeCost 函數:
function J = computeCost(x, y, theta)
%COMPUTECOST Compute cost for linear regression
% J = COMPUTECOST(X, y, theta) computes the cost of using theta as the
% parameter for linear regression to fit the data points in X and y
% Initialize some useful values
m = length(y); % number of training examples
% You need to return the following variables correctly
J = ;
% ====================== YOUR CODE HERE ======================
% Instructions: Compute the cost of a particular choice of theta
% You should set J to the cost.
for i= : m
J = J + (y(i,:)- x(i,:)*theta)^;
end
J = J /(*m);
% =========================================================================
end
代碼
百度雲下載下傳
其它平台隻是資訊轉發(留言可能看不到),歡迎同學們到個人blog交流:https://faiculty.com/