主要参照这篇
Multiple features(多维特征)
将预测函数向量化表示 : hθ=θTx
Gradient descent for multiple variables(梯度下降在多变量线性回归中的应用)
这里方便计算给x加上一个
x0
,在octave中的代码是
x = [ones(m, 1), x];
其中m是样本个数,注意在octave中向量下标是从1开始的,试验中给出的样本中每一列是一个特征,每一行是一个样本,注意这里逗号也可以没有
note:水平方向拼接:c=[a b]或c=[a,b];垂直方向拼接:c=[a;b];
对应的代价函数
J = (X*theta-y)'*(X*theta-y)/(2*m);
其中theta = zeros(n, 1); n是特征数+1
Feature Scaling 特征归一化
让
−1≤xj≤1
因为是近似落在这个范围内,所以只要接近的范围基本上都可以接受,例如:
0<=x1<=3, -2<=x2<=0.5, -3 to 3, -1/3 to 1/3 都ok;
Mean Normalization(均值归一化)
(x-均值)/特征的取值范围(最大值-最小值)or 标准差(standard deviation).
function [X_norm, mu, sigma] = featureNormalize(X)
X_norm = X;
mu = zeros(1, size(X, 2));
sigma = zeros(1, size(X, 2));
for i = 1:size(X,2)
mu(i) = mean(X(:,i));
sigma(i) = std(X(:,i));
X_norm(:,i) = (X(:,i) - mu(i))./sigma(i);
end
Learning rate 步长
1)如果α太小,就会收敛很慢;
2)如果α太大,就不能保证每一次迭代J(θ)都减小,也就不能保证J(θ)收敛;
如何选择α-经验的方法:约3倍于前一个数。
…, 0.001, 0.003, 0.01, 0.03, 0.1, 0.3, 1…
Features and polynomial regression(特征及多项式回归)
当线性回归不能很好地拟合样本的时候,选择多项式回归,可以引入n次方的特征项或者开根号的特征项
note:在后续提到的,欠拟合的情况下增加特征的时候,也有用类似平方立方某个特征或者多个特征加减乘除来增加特征个数的方法。
Normal equation(正规方程-区别于迭代方法的直接解法)
公式:
Θ=(XTX)−1XTy
原理参考“最小二乘法” TBC
对应的Octave公式非常简洁:pinv(X’ * X) * X’ * y
梯度下降vs Normal Equation
梯度下降需要选择合适的learning rate α;需要很多轮迭代;但是即使n很大的时候效果也很好;
Normal Equation:不需要选择α;不需要迭代,一次搞定;但是需要计算(XTX)−1,其时间复杂度是O(n3),如果n很大,就非常慢
assignment 主要关注plot
先把样本画出来
plot(x, y, ‘rx’, ‘MarkerSize’, 10);
第三个参数设置的是线型和颜色,第四、五个参数设置的标记形状的大小
其中第三个参数可选
字母 颜色 标点 线型
m 粉红 • 点线
r 大红 + +字线
y 黄色 ○ 圈线
g 绿色 × ×线
c 亮蓝 - 实线
b 蓝色 * 星形线
w 白色 : 虚线
k 黑色 -• (--) 点划线
然后 再同一张图上画出 线性拟合
hold on; % keep previous plot visible
plot(X(:,2), X*theta, '-')
legend('Training data', 'Linear regression')
hold off % don't overlay any more plots on this figure
这里的legend 用来给两个图做标记,
还可以用LEGEND(…,’Location’,LOC) 来指定图例标识框的位置
例如legend(…,’location’,’northwest’)可以将标识框放置在图的左上角
接下来给代价函数画图
theta0_vals = linspace(-10, 10, 100);
theta1_vals = linspace(-1, 4, 100);
%linspace(a1,a2,N)用来生成a1与a2之间等距的数组,间距d=(a2-a1)/(N-1)
% 略去J_vals 的计算,注意J_vals是length(theta1_vals)×length(theta0_vals)
figure; %画平面
surf(theta0_vals, theta1_vals, J_vals)
xlabel('\theta_0'); ylabel('\theta_1');
figure; % 画等高线 contours
% Plot J_vals as 15 contours spaced logarithmically between 0.01 and 100
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);
% 把global optima画出来