机器学习之线性递归

、先弄清楚机器学习的几个概念:

  • 训练集:训练样本,每个样本都由表示要学习的特征集(输入变量)和目标(输出变量)

   设训练样本数为m

  •   输入特征\变量input : x  其中每个样本用 表示(第i个样本),样本中每个特征/输入用表示(第i个样本中的第j个特征)
  •   输出特征/变量output : y     其中每个样本用 表示(第i个样本),每个样本只有一个输出。
  •   更新参数/权值 weight : theat   每个输入x对应一个theta, 用表示

  因此第i个样本集用表示。

监督的机器学习算法主要分为这三个部分:

  1. 假设函数:(无法直接插入公式啊,就不费劲了,这些公式网上很容易找到)

  2. 花费函数:以参数theta为自变量,根据假设函数求出训练集的每对数据的值与真实值的差值做比较,依据某一标准函数,最小化这个花费函数

    最小二乘法(min square): 差值的平方和最小(最常用的方法),  因为它是一个碗状的凹进去的误差曲面,花费函数即是误差函数的另一种表达

  3. 优化方法:不同的优化方法有不同的权值更新,通过权值更新来更新假设函数,从而使花费函数最小化

    梯度下降法:沿着误差曲线或曲面的梯度方向,更新权值, 即权值的更新是基于梯度更新的。用公式表示为:。其中表示误差曲面的梯度,表示下降速度(学习速度)。在多维向量中,梯度也是一个向量,有方向和大小,这个公式说明权值就沿着这个方向,大小与学习速度成正比。如下图权值的更新方向看出它始终沿着梯度相反方向改变。 

  因此权值的更新方程为:

  标量形式表示每个参数分量的更新分别与其对应的偏导。

例子:

假设你打算在某个城市开一所饭馆,只考虑人口对收益的影响,现在有关于人口与收益的数据,能否根据那个城市的人口预测出收益。

这里因为只考虑人口这一因素,设人口为X,收益为Y,  则Matlab的花费代码如下:

1 function J = computeCost(X, y, theta)
2 m = length(y); % number of training examples
3 J = 0;
4 H = X * theta;
5 J = 1.0 ./ (2 * m) * sum( (H - y) .^ 2);
6 End

梯度计算代码:

 1 function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters)
 2 %GRADIENTDESCENT Performs gradient descent to learn theta
 3 %   theta = GRADIENTDESENT(X, y, theta, alpha, num_iters) updates theta by 
 4 %   taking num_iters gradient steps with learning rate alpha
 5 % Initialize some useful values
 6 m = length(y); % number of training examples
 7 J_history = zeros(num_iters, 1);
 8 for iter = 1:num_iters
 9      H = X * theta;
10     theta = theta - (alpha * 1.0) / m .* (X' * (H - y));
11     J_history(iter) = computeCost(X, y, theta);
12 end

预测结果代码:

1 % Predict values for population sizes of 35,000 and 70,000
2 predict1 = [1, 3.5] *theta;
3 fprintf('For population = 35,000, we predict a profit of %f\n',...
4     predict1*10000);
5 predict2 = [1, 7] * theta;
6 fprintf('For population = 70,000, we predict a profit of %f\n',...
7     predict2*10000);

绘制误差曲面:

 1 % Grid over which we will calculate J
 2 theta0_vals = linspace(-10, 10, 100);
 3 theta1_vals = linspace(-1, 4, 100);
 4  
 5 % initialize J_vals to a matrix of 0's
 6 J_vals = zeros(length(theta0_vals), length(theta1_vals));
 7  
 8 % Fill out J_vals
 9 for i = 1:length(theta0_vals)
10     for j = 1:length(theta1_vals)
11       t = [theta0_vals(i); theta1_vals(j)];    
12       J_vals(i,j) = computeCost(X, y, t);
13     end
14 end
15 % Because of the way meshgrids work in the surf command, we need to 
16 % transpose J_vals before calling surf, or else the axes will be flipped
17 J_vals = J_vals';
18 % Surface plot
19 figure;
20 surf(theta0_vals, theta1_vals, J_vals)
21 xlabel('\theta_0'); ylabel('\theta_1');

绘制等高线和最后计算的权值:

1 % Plot J_vals as 15 contours spaced logarithmically between 0.01 and 100
2  contour(theta0_vals, theta1_vals, J_vals, logspace(-2, 3, 20))
3  xlabel('\theta_0'); ylabel('\theta_1');
4  hold on;
5  plot(theta(1), theta(2), 'rx', 'MarkerSize', 10, 'LineWidth', 2);

原始数据和计算出来回归函数下图:

误差曲面图:

等高线图:

可见,最后权值所在全局最小值处。

 对特征值归一化:

 求平均值和标准差:

1 mu = mean(X);
2 sigma = std(X);
3 X_norm = [X(:,1) / sigma(1), X(:,2) / sigma(2)];

 

 

 

             (1)

 

posted @ 2014-11-29 21:47  嫣儿  阅读(1971)  评论(0编辑  收藏  举报