机器学习之线性递归

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

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

   设训练样本数为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)

时间: 2024-08-11 07:35:41

机器学习之线性递归的相关文章

尾递归和线性递归

1.递归的定义 函数直接或间接的调用自己 使用递归时,必须有明确的结束递归的条件 2.递归的适用场合 数据的定义按照递归定义(比如求n!) 问题的解法适用于使用递归 数据的结构是按递归定义的(比如二叉树) 3.线性递归 也就是普通递归,下一次递归数据的计算要依赖于上一次递归的结果和参数,当数据量较小时执行效率与尾递归几乎没区别,但当数据量较大,迭代次数较多时,由于每次递推都要在内存中开辟一个栈空间,用来存储上次递推的结果和参数,这样的算法将导致严重的内存开销,甚至造成内存溢出,抛出java.la

线性递归和尾递归

线性递归,就是大家平常说的递归,线性递归函数的最后一步操作不是递归操作,将最终条件代入计算.在每次递归调用时,递归函数中的参数,局部变量等都要保存在栈中,当数据量很大的时候,会造成栈溢出. 尾递归,也就是线性迭代,尾递归函数的最后一步操作是递归,也即在进行递归之前,把全部的操作先执行完,这样的好处是,不用花费大量的栈空间来保存上次递归中的参数.局部变量等,这是因为上次递归操作结束后,已经将之前的数据计算出来,传递给当前的递归函数,这样上次递归中的局部变量和参数等就会被删除,释放空间,从而不会造成

机器学习 - 3 - 线性分类

机器学习 - 3 - 线性分类 符号约定 贝叶斯分类器 基于最小错误率的决策 符号约定: 样本 $ \bold{x} \in R^d$ 状态(类) \(w = {w_1,w_2,\dots}\) 先验概率 \(P(w_1),P(w_2)\) 样本分布密度 \(p(x)\) 类条件概率密度 \(p(\bold{x}|w_1),p(\bold{x}|w_2)\) 后验概率 \(P(w_1|\bold{x}),P(w_2|\bold{x})\) 错误概率 \[P(e|\bold{x})\lbrace_

机器学习:线性分类、高斯判别分析(GDA)、朴素贝叶斯(NB)

简介:这篇文章主要介绍简单的二分类算法:线性分类器.高斯判别分析.朴素贝叶斯. 一.线性分类器 加入给定如下两类数据(0-1),目测分类器应该对这组数据进行这样的划分.图中,红色样本点表示0,蓝色样本点表示1. 原始数据显示为三维如下: 现在运用前一节介绍的线性拟合来进行分类,即线性分类器.当拟合出来的y值大于等于0.5,则归为1,:否则归为0. 代码如下: %% %线性分类器 function Classification_Liner %% clc; clear all; close all;

机器学习:线性判别式分析(LDA)

1.概述      线性判别式分析(Linear Discriminant Analysis),简称为LDA.也称为Fisher线性判别(Fisher Linear Discriminant,FLD),是模式识别的经典算法,在1996年由Belhumeur引入模式识别和人工智能领域. 基本思想是将高维的模式样本投影到最佳鉴别矢量空间,以达到抽取分类信息和压缩特征空间维数的效果,投影后保证模式样本在新的子空间有最大的类间距离和最小的类内距离,即模式在该空间中有最佳的可分离性. LDA与PCA都是常

python机器学习——自适应线性神经元

上篇博客我们说了感知器,这篇博客主要记录自适应线性神经元的实现算法及一些其他的训练细节,自适应线性神经元(简称为Adaline)由Bernard Widrow和他的博士生Tedd Hoff提出,对感知器算法进行了改进. 当然Adaline对输入向量x的处理和感知器是一样的,都是使用一个权重向量w与x线性组合后得到z,再使用激活函数将z压缩到二元输入(1/-1),区别在于Adaline使用梯度下降法来更新w. 因为我们的目的是准确分类,那么我们需要来衡量分类效果的好坏,在这里我们介绍目标函数: \

机器学习入门-线性判别分析(LDA)

用途:分类预处理中的降维,做分类任务 目的:LDA关心的是能够最大化类间区分度的坐标轴 将特征空间(数据中的多维样本,将投影到一个维度更小的K维空间,保持区别类型的信息) 监督性:LDA是"有监督"的,它计算的是另一个类特定的方向 投影:找到更适用的分类空间 与PCA不同: 更关心分类而不是方差(PCA更关心的是方差) 如图所示,找到合适的方向投影后的数据更加的分散 LDA的数据原理: 目标找到投影:y = w^T * x  ,我们需要求解出w LDA的第一个目标是使得投影后两个类别之

线性代数01 线性的大脑

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 线性代数是一门大学课程,但也是相当“惨烈”的一门课程.在大学期间,我对这门学科就没怎么学懂.先是挣扎于各种行列式.解方程,然后又看到奇怪的正交矩阵.酉矩阵.还没来得及消化,期末考试轰然到来,成绩自然凄凄惨惨. 后来读了更多的线性代数的内容,才发现,线性代数远不是一套奇奇怪怪的规定.它的内在逻辑很明确.只可惜大学时的教材,把最重要的一些核心概念,比如线性系统,放在了最后.总结这些惨

迭代、递归替代循环

循环(迭代)与递归的区别 1. 递归算法与迭代算法的设计思路区别在于:函数或算法是否具备收敛性,当且仅当一个算法存在预期的收敛效果时,采用递归算法才是可行的,否则,就不能使用递归算法. 当然,从理论上说,所有的递归函数都可以转换为迭代函数,反之亦然,然而代价通常都是比较高的. 但从算法结构来说,递归声明的结构并不总能够转换为迭代结构,原因在于结构的引申本身属于递归的概念,用迭代的方法在设计初期根本无法实现,这就像动多态的东西并不总是可以用静多态的方法实现一样.这也是为什么在结构设计时,通常采用递