斯坦福 机器学习 ex1

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 yaxis label
xlabel('Population of City in 10,000s'); %Set the xaxis 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;

 

 

你可能感兴趣的:(机器学习)