Coursera机器学习-吴恩达
% 1.对特征进行特征缩放:
%首先读取训练集数据,有两列特征
data = load('ex1data2.txt');
X = data(:, 1:2);
y = data(:, 3);
m = length(y);
%进行特征缩放
[X mu sigma] = featureNormalize(X);
% 函数featureNormalize:
function [X_norm, mu, sigma] = featureNormalize(X)
X_norm = X;
mu = zeros(1, size(X, 2));
sigma = zeros(1, size(X, 2));
[m n] = size(X);
for i = 1:n
mu(i) = mean(X_norm(:,i)); % 算每一列的平均值
sigma(i) = std(X_norm(:,i)); % 算每一列的标准差
% 计算公式:(每个特征 - 特征的平均值) / 特征的标准差
X_norm(:,i) = (X_norm(:,i) - mu(i)) / sigma(i);
endfor
end
% 2.多元特征代价函数J:
function J = computeCostMulti(X, y, theta)
m = length(y);
J = 0;
%计算J,公式如下图:
J = 1/(2*m) * ( X * theta - y)' * (X * theta - y);
end
% 3.theta使用梯度下降算法更新:
% 选择学习速率和迭代次数
alpha = 0.01;
num_iters = 400;
% 初始化并计算theta
theta = zeros(3, 1);
[theta, J_history] = gradientDescentMulti(X, y, theta, alpha, num_iters);
% 函数gradientDescentMulti:
function [theta, J_history] = gradientDescentMulti(X, y, theta, alpha, num_iters)
m = length(y);
J_history = zeros(num_iters, 1);
for iter = 1:num_iters
% 计算J
theta = theta - alpha/m * X' * (X * theta - y);
% 每次迭代均保存代价函数J:
J_history(iter) = computeCostMulti(X, y, theta);
end
end
% 3.用图表展示代价函数J和迭代次数的关系:
plot(1:numel(J_history), J_history, '-b', 'LineWidth', 2);
xlabel('Number of iterations');
ylabel('Cost J');
% 4.预测一下,如用特征缩放处理训练集,则测试集也需要特征缩放
price = 0;
% 测试集也需特征缩放,假设函数h = X'* theta
price = [1 (1650-mu(1))/sigma(1) (3-mu(1))/sigma(1)] * theta;
fprintf(['Predicted price of a 1650 sq-ft, 3 br house ' ...
'(using gradient descent):\n $%f\n'], price);
% 5.使用正则化函数处理
data = csvread('ex1data2.txt');
X = data(:, 1:2);
y = data(:, 3);
m = length(y);
X = [ones(m, 1) X];
% 计算theta,用正则化函数
theta = normalEqn(X, y);
% 函数normalEqn:
function [theta] = normalEqn(X, y)
theta = zeros(size(X, 2), 1);
% 计算theta,正则化公式如下:
theta = pinv(X' * X) * X' * y;
end
% 6.预测一波房价
% 正则化后训练集不用特征缩放;假设函数h = X' * theta
price = 0; % You should change this
price = [1 1650 3] * theta;
fprintf(['Predicted price of a 1650 sq-ft, 3 br house ' ...
'(using normal equations):\n $%f\n'], price);