Coursera-MachineLearning-LinearRegression-MultipleVariables

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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值