zoukankan      html  css  js  c++  java
  • 机器学习之线性递归

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

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

       设训练样本数为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
    ',...
    4     predict1*10000);
    5 predict2 = [1, 7] * theta;
    6 fprintf('For population = 70,000, we predict a profit of %f
    ',...
    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('	heta_0'); ylabel('	heta_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('	heta_0'); ylabel('	heta_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)

  • 相关阅读:
    【GIT-精讲】从零玩转Git-基础理论
    【fmjava】 面试题突击训练-Java基础语法篇01
    【笔记】springSecurity-OAuth2.0-授权模式演示
    【难受】SpirngCloud-Alibaba-nacos跨服务器访问接口的问题
    Python编程题汇总(持续更新中……)
    Python编程题14--随机分配礼物
    Python编程题13--判断两个升序列表,其中一个是另外一个的子集
    Python编程题12--列表中比前面元素都大,比后面元素都小的数
    Python编程题11--找出100以内的质数
    Python编程题10--找出和为N的两个数
  • 原文地址:https://www.cnblogs.com/jinee/p/4132058.html
Copyright © 2011-2022 走看看