1 Simple Octave/MATLAB function
在warmUpExercise.m,中,添加代码
A = eye(5);%定义5*5的对角矩阵
运行ex1.m后结果为:
Running warmUpExercise ...
5x5 Identity Matrix:
ans =
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
Program paused. Press enter to continue.
2 Linear regression with one variable
ex1data1.txt中包含了线性回归问题的数据,第一列,表示城市的人口;第二列表示收益,负值为缺失数据。
数据如下:
6.1101,17.592
5.5277,9.1302
8.5186,13.662
7.0032,11.854
5.8598,6.8233
8.3829,11.886
7.4764,4.3483
8.5781,12
6.4862,6.5987
5.0546,3.8166
2.1 Plotting the Data
完成plotData.m,添加代码
plot(x, y, 'rx', 'MarkerSize', 10);% Plot the data
ylabel('Profit in $10,000s'); %Set the y−axis label
xlabel('Population of City in 10,000s'); %Set the x−axis label
运行 ex1.m 得到如下图像:
2.2 Gradient Descent
这部分,需要找到合适的θ,来适应数据集。
2.2.1 Update Equations
在矩阵X中,每一行存储一条数据,注意截距θ0,在X中添加新的一列,全部置为1。
2.2.2 Implementation
在ex1.m中,已经确立了线性回归的数据,对X和theta都设置了初始值。
X添加值为1的一列,设置theta(2行1列)的值为0,学习速率为0.01。
X = [ones(m, 1), data(:,1)]; % Add acolumn of ones to x
theta = zeros(2, 1); % initialize fittingparameters
iterations = 1500;
alpha = 0.01;
2.2.3 Computing the cost J(θ)
在computeCost.m中,填写代码来计算J(θ).
代码为:
J = (X*theta-y)' *(X*theta-y)/(2*m);
分析:
函数为:
function J = computeCost(X, y, theta)
传进来的实参为:
矩阵X的值为:
X =
1.0000 6.1101
1.0000 5.5277
1.0000 8.5186
1.0000 7.0032
1.0000 5.8598
1.0000 8.3829
1.0000 7.4764
1.0000 8.5781
1.0000 6.4862
1.0000 5.0546
y =
17.5920
9.1302
13.6620
11.8540
6.8233
11.8860
4.3483
12.0000
6.5987
3.8166
theta =
0
0
J = (X*theta-y)' *(X*theta-y)/(2*m);
要计算h(x)-y的平方,对每个x和theta相乘,乘积求和。
2.2.4 Gradient descent
梯度下降的公式:
梯度下降函数:
function [theta, J_history] = gradientDescent(X, y, theta, alpha,num_iters)
函数中的参数介绍:
X:m*2的矩阵
y:m*1的矩阵,这个为真实值
theta 为2*1的向量,所以xij为第i个训练样本的第j个特征。
num_iters:迭代次数
X*theta-y得到m*1的向量
X’*(X*theta-y)得到2*1的向量
xij分别取的是X中的第一列和第二列,要将其转置。
theta = theta-X'*(X*theta-y)*alpha/m;
J_history 存储每次迭代后的J(theta)的值。
Optional Exercises
3 Linear regression with multiple variables
数据集:ex1data2.txt
第一列:房屋面积
第二列:卧房的数目
第三列:房屋价格
2104,3,399900
1600,3,329900
2400,3,369000
1416,2,232000
3000,4,539900
1985,4,299900
1534,3,314900
1427,3,198999
1380,3,212000
1494,3,242500
首先进行特征缩放
3.1 Feature Normalization
我们要做的工作是在featureNormaize.m中完成如下代码:
1. 每个特征中的值减去它们的均值
2. 当减去均值之后,通过除去相应的标准差来进行特征缩放。
填充代码:
[i,j]=size(X)
M=ones(i,j);
mu=mean(X);
for m=1:j
M(:,m)=X(:,m)-mu(:,m);
end
sigma = sqrt((1/i)*sum(M.^2));
for m=1:j
X_norm(:,m)=M(:,m)./[ones(i,1)*sigma(:,m) ];
end
解析:
featureNormalize.m中的代码:
mu = zeros(1, size(X, 2));
size(X,2)代表计算X的列数,size(X,1)计算行数
mu为一个一行两列均为0的向量。
sigma = zeros(1, size(X, 2));
sigma相似。
mu中存储均值,sigma存储标准差。
[i,j]=size(X)%i,j分别存储X的行数和列数
M=ones(i,j);%一个i行j列的矩阵
mu=mean(X);%得到X每列的均值
%结果是:2000.7 3.2
%下面代码是每列的值减去均值
for m=1:j
M(:,m)=X(:,m)-mu(:,m);
end
sigma = sqrt((1/i)*sum(M.^2));%计算标准差
%注意,如果直接调用std(X(:,1))得到的是第一列标准差,这是除以n-1,如果加上参数,std(X(:,1),1)则是除以n.
%用每列的值除以标准差,进行特征缩放
for m=1:j
X_norm(:,m)=M(:,m)./[ones(i,1)*sigma(:,m) ];
end
3.2 Gradient Descent
同单变量的情况。
3.3 Normal Equations
直接写公式就可:
theta = inv(X'*X)*X'*y;