Octave实现线性回归模型

绘制点图

单一特征的模型可以绘制点图。
输入参数:

  • x: 训练集输入变量列向量
  • y: 训练集输出变量列向量
1
2
3
4
function plotData(x, y)
plot(x, y, 'rx', 'MarkerSize', 10);
xlabel('x');
ylabel('y');

代价函数

输入参数:

  • X: 训练集输入变量矩阵
  • y: 训练集输出变量列向量
1
2
3
4
5
6
7
8
9
function J = computeCost(X, y, theta)
m = length(y);
predictions = sum(X * theta); % 假设函数在所有样本数据上进行预测
sqrErrors = (predictions - y).^2;
% J = 1/(2*m) * sum(sqrErrors);

% 另一种求解方法:向量化
J = 1/(2 * m) * (X * theta - y)' * (X * theta - y);
end

特征缩放

1
2
3
4
5
function [X_norm, mu, sigma] = featureNormalize(X)
mu = mean(X); % 平均值
sigma = std(X); % 标准差
X_norm = (X - mu) ./ sigma; % 规范化后的特征矩阵
end

梯度下降法

输入参数:

  • X: 训练集输入变量矩阵
  • y: 训练集输出变量列向量
  • theta: 初始下降梯度
  • alpha: 学习速率
  • num_iters: 迭代次数
1
2
3
4
5
6
7
8
9
function[theta, J_history] = gradientDescent(X, y,theta, alpha, num_iters)
m = length(y); % 训练样本的数量
J_history = zeros(num_iters, 1);

for iter = 1:num_iters:
theta = theta - alpha * (X' * (X * theta - y)) / m;
J_history(item) = computeCost(X, y, theta);
end
end

正规法

输入参数:

  • X: 训练集输入变量矩阵
  • y: 训练集输出变量列向量
1
2
3
function [theta] = normalEqn(X, y)
theta = pinv(X' * X) * X' * y;
end