Week2 Exercise 1: Linear Regression
part 4: Visualizing J
目的:繪製cost function J(θ \theta θ 0 , θ \theta θ 1 )隨自變量θ \theta θ 0 ,θ \theta θ 1 的變化情況。
整體思路:
先生成座標向量theta0_vals、theta1_vals,代表θ \theta θ 0 、θ \theta θ 1 的取值
然後由座標向量theta0_vals、theta1_vals中的θ \theta θ 0 ,θ \theta θ 1 ,由computeCost(X, y, t)函數計算出對應的cost function J(θ \theta θ 0 , θ \theta θ 1 )的值
最後繪製出圖象
代碼詳解:
% ============= Part 4: Visualizing J(theta_0, theta_1) =============
theta0_vals = linspace(-10, 10, 100);
theta1_vals = linspace(-1, 4, 100);
y = linspace(x1,x2,n) 生成 n 個點。這些點的間距爲 (x2-x1)/(n-1)。n默認爲100。
比如y1 = linspace(-5,5,7)
y1 = 1×7
-5.0000 -3.3333 -1.6667 0 1.6667 3.3333 5.0000**
J_vals = zeros(length(theta0_vals), length(theta1_vals));
for i = 1:length(theta0_vals)
for j = 1:length(theta1_vals)
t = [theta0_vals(i); theta1_vals(j)];
J_vals(i,j) = computeCost(X, y, t);
end
end
注意matlab數組下標從1開始,而不是0
由computeCost(X, y, t)函數計算出對應的cost function J(θ \theta θ 0 , θ \theta θ 1 )的值
J_vals = J_vals';
figure;
surf(theta0_vals, theta1_vals, J_vals)
xlabel('\theta_0'); ylabel('\theta_1');
由於surf函數的特性,需要將J_vals轉置。
figure 創建一個新的圖窗窗口
figure 相關用法:
figure(‘Color’,‘white’) 將背景色設置爲白色。
figure(‘Name’,‘Measured Data’);創建一個圖窗並指定 Name 屬性。默認情況下,生成的標題包含圖窗編號。
figure(‘Name’,‘Measured Data’,‘NumberTitle’,‘off’);生成的標題不包含圖窗編號.
surf(X,Y,Z) 創建一個三維曲面圖。該函數將矩陣 Z 中的值繪製爲由 X 和 Y 定義的 x-y 平面中的網格上方的高度。函數還對顏色數據使用 Z,因此顏色與高度成比例。
figure;
contour(theta0_vals, theta1_vals, J_vals, logspace(-2, 3, 20))
xlabel('\theta_0'); ylabel('\theta_1');
hold on;
plot(theta(1), theta(2), 'rx', 'MarkerSize', 10, 'LineWidth', 2)
前面J_vals已將轉置過了
logspace函數將區間[10-2 ,103 ]分成20等份,返回1*20矩陣
用法:y = logspace(a,b,n) 在 10 的冪 10^a 和 10^b之間生成 n 個點。
contour(X,Y,Z,levels) 將 levels 指定爲單調遞增值的向量時,可在某些特定高度繪製等高線。要在一個高度 (k) 繪製等高線,要將 levels 指定爲二元素行向量 [k k]。
‘\theta_0’和’\theta_1’ 用了轉義字符
hold on 當前軸及圖形不被刷新,準備接受後續圖形繪製
hold off 結束當前圖形不被刷新的性質
MarkSize指定符號大小,LineWidth指定線寬