矢量,矢量化的梯度下降以及多元线性回归

news2024/9/19 10:45:10

一、矢量

定义:按照特定顺序排列的元素集合。可以被视为一维数组。

在机器学习中的作用:

  1. 特征表示:在机器学习任务中,输入数据通常以矢量的形式表示。例如,图像可以表示为像素值的矢量,文本可以表示为词向量的矢量。矢量工具可以用来处理和表示这些特征向量,以便机器学习模型能够对其进行处理和学习。
  2. 模型参数表示:在机器学习模型中,参数通常以矢量的形式表示。例如,线性回归模型的参数可以表示为一个包含权重和偏置的矢量。矢量工具可以用来对模型参数进行操作和更新,以便模型能够进行学习和预测。
  3. 矩阵运算:在机器学习中,矩阵运算是非常常见的操作。例如,矩阵乘法在神经网络中经常用于计算输入数据和模型参数之间的线性变换。矢量工具可以用来进行高效的矩阵运算,以便加速机器学习模型的训练和推断过程。

优势:

  1. 高效地表示和处理大量的数据特征和模型参数。
  2. 方便进行数学运算
  3. 高校利用内存和处理器资源
  4. 简化编程

二、numpy

在编程中常用numpy库来创建和运行矢量数组。以下为常见的使用方式:

1.使用形状元组(shape tuple)生成矢量

注:numpy.zeros((4,))和numpy.zeros(4)的效果相同,但是numpy.zeros((4,1))会生成4行一列的矩阵。

# NumPy routines which allocate memory and fill arrays with value
a = np.zeros(4);                print(f"np.zeros(4) :   a = {a}, a shape = {a.shape}, a data type = {a.dtype}")
a = np.zeros((4,));             print(f"np.zeros(4,) :  a = {a}, a shape = {a.shape}, a data type = {a.dtype}")
a = np.random.random_sample(4); print(f"np.random.random_sample(4): a = {a}, a shape = {a.shape}, a data type = {a.dtype}")

# 运行结果
#np.zeros(4) :   a = [0. 0. 0. 0.], a shape = (4,), a data type = float64
#np.zeros(4,) :  a = [0. 0. 0. 0.], a shape = (4,), a data type = float64
#np.random.random_sample(4): a = [0.49722532 0.51600241 0.11757225 0.65462113], a shape = (4,), a data type = float64

2.不使用形状元组生成矢量

a = np.arange(4.);              print(f"np.arange(4.):     a = {a}, a shape = {a.shape}, a data type = {a.dtype}")
a = np.random.rand(4);          print(f"np.random.rand(4): a = {a}, a shape = {a.shape}, a data type = {a.dtype}")

#运行结果
#np.arange(4.):     a = [0. 1. 2. 3.], a shape = (4,), a data type = float64
#np.random.rand(4): a = [0.54342577 0.79334353 0.74999339 0.43430988], a shape = (4,), a data type = float64

3.手动创建矢量

# NumPy routines which allocate memory and fill with user specified values
a = np.array([5,4,3,2]);  print(f"np.array([5,4,3,2]):  a = {a},     a shape = {a.shape}, a data type = {a.dtype}")
a = np.array([5.,4,3,2]); print(f"np.array([5.,4,3,2]): a = {a}, a shape = {a.shape}, a data type = {a.dtype}")

#运行结果:
#np.array([5,4,3,2]):  a = [5 4 3 2],     a shape = (4,), a data type = int32
#np.array([5.,4,3,2]): a = [5. 4. 3. 2.], a shape = (4,), a data type = float64

 numpy的矢量实际上属于数组,所以拥有数组的一般性质,可以进行索引、切片、删除等操作。 但是矢量的加法与列表的加法却有所不同,矢量是对位相加,列表是两个列表连接形成新的列表:

#矢量相加
a = np.array([ 1, 2, 3, 4])
b = np.array([-1,-2, 3, 4])
print(f"Binary operators work element wise: {a + b}")

#列表相加
c = [1,2,3,4]
d = [-1,-2, 3, 4]
print(f"Binary operators work element wise:{c + d}")

#运行结果
#Binary operators work element wise: [0 0 6 8]
#Binary operators work element wise:[1, 2, 3, 4, -1, -2, 3, 4]

三、多元线性回归&矢量化

在之前学习过一元线性回归模型,接下来学习和总结多元线性模型。

一般来说,我们分析一个问题时往往会考虑多个不同的因素,我们在建立模型时会将这些影响因素作为变量x,影响的权重作为系数w,得到下图中的改变:

我们可以发现,f(x)可以改写为向量形式:

由于\sum_{i}^{n}w_{i}x_{i}=\vec{w}*\vec{x}

所以f_{w,x}(x)=f_{\vec{w},\vec{x}}(\vec{x})=\vec{w}*\vec{x}+b

四、多元线性回归的矢量化梯度下降法 

按照老师的讲解如下进行变换:(其实也没多难,就是把运算的部分换成矢量运算)

 

下面是算法实现:

X_train = np.array([[2104, 5, 1, 45], [1416, 3, 2, 40], [852, 2, 1, 35]])
y_train = np.array([460, 232, 178])

def compute_gradient(X, y, w, b): 
    """
    Computes the gradient for linear regression 
    Args:
      X (ndarray (m,n)): Data, m examples with n features
      y (ndarray (m,)) : target values
      w (ndarray (n,)) : model parameters  
      b (scalar)       : model parameter
      
    Returns:
      dj_dw (ndarray (n,)): The gradient of the cost w.r.t. the parameters w. 
      dj_db (scalar):       The gradient of the cost w.r.t. the parameter b. 
    """
    m,n = X.shape           #(number of examples, number of features)
    dj_dw = np.zeros((n,))
    dj_db = 0.

    for i in range(m):                             
        err = (np.dot(X[i], w) + b) - y[i]   
        for j in range(n):                         
            dj_dw[j] = dj_dw[j] + err * X[i, j]    
        dj_db = dj_db + err                        
    dj_dw = dj_dw / m                                
    dj_db = dj_db / m                                
        
    return dj_db, dj_dw

#Compute and display gradient 
tmp_dj_db, tmp_dj_dw = compute_gradient(X_train, y_train, w_init, b_init)
print(f'dj_db at initial w,b: {tmp_dj_db}')
print(f'dj_dw at initial w,b: \n {tmp_dj_dw}')


#显示结果如下:
#dj_db at initial w,b: -1.673925169143331e-06
#dj_dw at initial w,b: 
#[-2.73e-03 -6.27e-06 -2.22e-06 -6.92e-05]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1366362.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CodeGPT,你的智能编码助手—CSDN出品

CodeGPT是由CSDN打造的一款生成式AI产品,专为开发者量身定制。 无论是在学习新技术还是在实际工作中遇到的各类计算机和开发难题,CodeGPT都能提供强大的支持。其涵盖的功能包括代码优化、续写、解释、提问等,还能生成精准的注释和创作相关内…

springCould中的gateway-从小白开始【9】

目录 1.🍟网关是什么 2.🍿gateway是什么 3.🥚gateway能什么 4.🌭核心概念 5.🧂工作流程 6.🧈实例 7.🥓gateway网关配置的方式 8.🍳配置动态路由 9.🧇pred…

软件开发和网络安全哪个更好找工作?

为什么今年应届毕业生找工作这么难? 有时间去看看张雪峰今年为什么这么火就明白了。 这么多年人才供给和需求错配的问题,在经济下行的今年,集中爆发。 供给端,大学生越来越多。需求端,低端工作大家不愿去,高…

springboot集成cas客户端

Background 单点登录SSO(Single Sign ON),指在多个应用系统中,只需登录一次,即可在多个应用系统之间共享登录。统一身份认证CAS(Central Authentication Service)是SSO的开源实现,利用CAS实现SSO可以很大程…

年销5万的岚图没有爆款

作者 | 辰纹 来源 | 洞见新研社 3款车一年卖了5万台,这个销量不算多,可对于岚图来说,却很不容易,CEO卢放称这是“一场翻身仗”,在写给全体员工的“家信”中表达谢意,称是“大家的团结奋斗,驱动…

代码随想录刷题题Day28

刷题的第二十八天,希望自己能够不断坚持下去,迎来蜕变。😀😀😀 刷题语言:C Day28 任务 ● 343. 整数拆分 ● 96.不同的二叉搜索树 1 整数拆分 343. 整数拆分 思路: 动态规划 (1&a…

jenkins通过流水线自动部署项目(k8s部署)

参考:https://www.cnblogs.com/rb2010/p/16195443.html docker 拉取镜像到本地: docker pull docker.io/jenkins/jenkins:2.164配置卷挂载:使用nfs 参考:https://www.kuboard.cn/learning/k8s-intermediate/persistent/nfs.htm…

软考通过率真的低吗?

软考通过lv确实相对较低。软考通过lv低的原因主要有以下几点👇 ✅软考本身是计算机类别的考试,考试难度本身不小。 ✅报考没有条件限制,报考的人水平参差。弃考和零基础考生较多。 ✅不同的科目通过lv有所差异,初级的大致在30%&am…

如何将 element-ui 中的 el-select 默认展开

<el-form-item label"藕粉桂花糖糕" prop"state" required><el-selectref"mySelect"v-model"form.state"style"width: 280px"placeholder"请选择"><el-option label"藕粉" :value"…

二分查找(二)

点名 点名 某班级 n 位同学的学号为 0 ~ n-1。点名结果记录于升序数组 records。假定仅有一位同学缺席&#xff0c;请返回他的学号。 二分法思路&#xff1a;判断数组的值和对应的下标是否相等&#xff0c;将数组分为两个区间&#xff0c;不相等区间的最左端&#xff0c;就是…

java⽇志体系

⽇志体系 1.体系概述2.日志的使用1.上古时代的sout2.开创先驱的log4j3.搞事情的JUL4.应运⽽⽣的JCL5.再起波澜的logback6.再度⻘春的log4j2 本篇在jdk21下测试通过 1.体系概述 1.日志接口 JCL&#xff1a;Apache基⾦会所属的项⽬&#xff0c;是⼀套Java⽇志接⼝&#xff0c;之…

视频做成二维码查看?多格式视频二维码生成器的使用方法

现在音视频是工作和生活中经常需要使用的一种内容表现形式&#xff0c;很多人都通过这种方式来查看视频内容&#xff0c;比如产品介绍、使用说明、安装教程等。通过一个二维码就可以来承载视频内容&#xff0c;与传统的方式相比拥有更快的内容传播速度&#xff0c;简化用户获取…

[蓝桥杯学习] 线段树

学习blibli 定义 线段树是一种特殊的平衡二叉查找树&#xff0c;使用线段树&#xff0c;可以实现数据的添加、查找和删除。 树的根结点表示了一个完整的单元区间&#xff0c;左右孩子的区间是将父结点的区间进行二分&#xff0c;左右孩子的区间之和&#xff0c;就是他们的根…

三菱plc学习入门(二,三菱plc指令,触点比较,计数器,交替,四则运算,转换数据类型)

今天&#xff0c;进行总结对plc的学习&#xff0c;下面是对plc基础的学习&#xff0c;希望对读者有帮助&#xff0c;欢迎点赞&#xff0c;评论&#xff0c;收藏&#xff01;&#xff01;&#xff01; 目录 触点比较 当数据太大了的时候&#xff08;LDD32位&#xff09; CMP比…

@Transactional注解的一个很容易被忽略的错误用法

Transactional注解的一个很容易被忽略的错误用法 今日审查代码时发现对Transactional注解的一个如下用法&#xff1a; //StockController.javaAutoWired private StockService stockService//商品出库 PostMapping("/product/stock/out-stock") public Boolean pro…

输入输出流、字符字节流、NIO

1、对输入输出流、字符字节流的学习&#xff0c;以之前做的批量下载功能为例 批量下载指的是&#xff0c;将多个文件打包到zip文件中&#xff0c;然后下载该zip文件。 1.1下载网络上的文件 代码参考如下&#xff1a; import java.io.*; import java.net.URL; import java.n…

TS 36.211 V12.0.0-下行(8)-调制和上变频

本文的内容主要涉及TS 36.211&#xff0c;版本是C00&#xff0c;也就是V12.0.0。

2023 年精选:每个 DevOps 团队都应该了解的 5 种微服务设计模式

微服务彻底改变了应用程序开发世界&#xff0c;将大型整体系统分解为更小、更易于管理的组件。这种架构风格的特点是独立、松散耦合的服务&#xff0c;带来了从可扩展性、模块化到更高的灵活性等众多优势。 DevOps 团队如何最好地利用这种方法来实现最高效率&#xff1f;答案在…

小游戏实战丨基于PyGame的贪吃蛇小游戏

文章目录 写在前面PyGame贪吃蛇注意事项系列文章写在后面 写在前面 本期内容&#xff1a;基于pygame的贪吃蛇小游戏 下载地址&#xff1a;https://download.csdn.net/download/m0_68111267/88700188 实验环境 python3.11及以上pycharmpygame 安装pygame的命令&#xff1a;…

【Spring Cloud 】进阶之Config配置中心

目录 config大致的一个思路&#xff1a; 二&#xff0c;前期准备 2.1导入依赖 2.2编写bootstrop.yml&#xff1a; 三&#xff0c;编写Controller类 3.1获取单个配置类信息 3.2获取多个配置类信息 &#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f3…