了解标量、向量和点积

数据科学基础数学:线性代数简介 了解标量、向量和点积

机器只能按着算法理解和处理数据结构存储的数字.

例如创建垃圾邮件检测器,则首先必须将文本数据转换为数字(通过单词嵌入)。

两个句子之间的余弦相似性 两个句子之间的余弦相似性可以通过它们的向量表示法的点积来找到。有多种方法可以将句子/段落表示为向量。

similarity
= cos(a,b)
= dotproduct(a,b) / ( norm(a) * norm(b) )
= a.b / ||a|| * ||b||

这里有两个非常短的文本可以比较:

Julie loves me more than Linda loves me

Jane likes me more than Julie loves me

我们想知道这些文本的相似程度,纯粹从字数上看(而忽略了字数顺序)。我们首先列出两篇文章中的单词:

me Julie loves Linda than more likes Jane

现在我们计算这些词在每个文本中出现的次数:

 me     2   2
 Jane   0   1
Julie   1   1
Linda   1   0
likes   0   1
loves   2   1
 more   1   1
 than   1   1

对这两个垂直向量的计数感兴趣。例如,每个文本中都有两个 "我 "的例子。我们将通过计算这两个向量的一个函数,即它们之间的角度的余弦,来决定这两个文本之间的距离。

这两个向量也是如此:

a: [2, 1, 0, 2, 0, 1, 1, 1]
b: [2, 1, 1, 1, 1, 0, 1, 1]

它们之间的角度的余弦约为0.822。

这些向量是8维的。使用余弦相似性的一个优点显然是,它将问题转化为可视化。在这种情况下,你可以把它看作是大约35度的角度,这与零或完全一致有一些 "距离"。

在我们的下一篇文章中,我们将看到实时的实现。

然后可以将数据存储在向量、矩阵和张量中。图色彩表示为 0 到 255 之间的值矩阵,表示每个像素的每种颜色的亮度。可以利用线性代数领域的工具和概念来操作这些向量、矩阵和张量。

问题描述:数学求解不在我讨论的重点,转向使用 python 求 2D 平面空间的3个点所决定的三角形三边之间的角度。

矢量分析中的点积将用于计算3点之间的角度。

我们使用了多个维度数据,如 1D、2D、3D 和更高维度,而不仅仅是 2D。但我用2D数据点解释。

点积,可以用代数或几何方式定义。几何定义基于角度和距离,矢量的大小的概念。这两个定义的等价性依赖于欧几里得空间的笛卡尔坐标系。

alt

几何定义:

同时具有大小和方向的几何对象。矢量可以描绘成箭头,大小是它的长度,它的方向是箭头指向的方向。

alt

向量 a 的大小用 a 表示|a|

两个欧几里得向量 a 和 b 的点积由下式定义。其中 θ 是 a 和 b 之间的角度。

alt

解释:

alt

Linear Algebra

alt

使用Math库的写法不是今天讨论的重点。因为写法1只照顾到我们熟知的数学思路,仅在最后一步调用对应的python函数求解。

换句话话说,写法1人理解起来比较容易,但在机器看来并不是它的菜。

import math
def getAngle(a, b, c):
    y_ca,x_ca = c[1] - a[1], c[0] - a[0]
    y_ba,x_ba = b[1] - a[1], b[0] - a[0]
    ang = math.degrees(math.atan2(y_ca,x_ca) - math.atan2(y_ba,x_ba))
    return ang + 360 if ang < 0 else ang

a,b,c = (0,0),(4,0),(4,3)
print(getAngle(a, b, c))
36.86989764584402

今天的重点是在第2种思路:Numpy

a ∗ b (点积) = (a 或 b 在b或a方向上的投影) × (b 或 a)

OA’ × OB = OA × OB ×COSθ

a ∗ b = |a| × |b|× COSθ

numpy.dot() #计算 a  ∗  b = 9

numpy.linalg.norm() #|a| × |b|

导入上一篇的任务链接在此👇,继续深入求解斜拉的两根绳索与水平呈的角度是多少?

上期课程直观向量相加的概念:

alt

OC = OA + OB #合力

alt
alt

代码解释:

1、点积 运算

numpy求点积:np.dot的函数

2、范式 运算

numpy求范数:np.linalg.norm

alt

图示的过程代码实现如下:

import numpy as np
# c a = angle
#a,b,c = (0,0,0),(1,0,1),(1,1,1)
a,b,c = list(map(list,(a,b,c)))
a = np.array(a)
b = np.array(b)
c = np.array(c)

# O
ba = b - a
ca = c - a
print(ba,ca) #[ 0 -3] [ 4 -3]
cosine_angle = np.dot(ba, ca) / (np.linalg.norm(ba) * np.linalg.norm(ca))

angle = np.arccos(cosine_angle)

#a,b,c = (0,0),(0,3),(4,0)
print('c与b 的夹角',np.degrees(angle))
c与b 的夹角 36.86989764584401

如何推而广之?

在四面体分子的几何结构中,一个中心原子位于中心位置,四个取代基位于四面体的四角。当所有四个取代基都相同时:

alt

四面体的键角

cos-1(-1⁄3)=109.4712206°≈109.5°

如甲烷CH4以及其较重的类似物。甲烷和其他完全对称的四面体分子属于点群Td,但大多数四面体分子的对称性较低。

四面体的键角用点乘法计算对称四面体分子的键角。 对称的四面体分子如CH4的键角可以用两个向量的点积来计算。

alt

如图所示,分子可以被刻在一个立方体中,四价原子如碳位于立方体中心,也就是坐标的原点O。

四个单价原子,如氢位于立方体的四个角A、B、C、D,选择这些角时,没有两个原子位于相邻的角,

只由一条立方体边连接。如果立方体的边长选择为2个单位,那么两个键OA和OB对应于矢量:

a = (1,-1,1)和

b = (1,1,-1),而键角θ是这两个矢量之间的角度。

这个角度可以通过这两个矢量的点积来计算,定义为

a-b=||a||||b||cos θ

其中|a|表示矢量a的长度。如图所示,这里的点积为-1,每个矢量的长度为√3,所以cos θ=-1/3,四面体的键角θ = arccos(-1/3) ≃ 109.47°

(0,0,0),(1,-1,1),(1,1,-1)

import numpy as np
# c a = angle
a,b,c = (0,0,0),(1,-1,1),(1,1,-1)
a,b,c = list(map(list,(a,b,c)))
a = np.array(a)
b = np.array(b)
c = np.array(c)

# c 与 b 的夹角 b-a , c-a
ba = b - a
ca = c - a

cosine_angle = np.dot(ba, ca) / (np.linalg.norm(ba) * np.linalg.norm(ca))

angle = np.arccos(cosine_angle)
print('np-c与b 的夹角',np.degrees(angle)) #,math.cos()

c与b的夹角 109.47122063449069

立方体键角

alt

第 3 步 数学工具

线性代数中的一个基本运算符。它被称为点积或两个向量的内积。你们中的大多数人已经熟悉这个运算符,实际上它很容易解释。

两个向量之间的点积可以解释为向量 vec{v}上的向量 vec{w}的投影。然后,我们将投影向量 vec{w}的长度乘以vec{v}的长度。

alt

然而,我们将提供一些额外的见解以及如何在 Python 中使用它的一些基本信息。

因此,根据两个向量之间的角度,我们可以有以下情况。

例如,如果内积为正,则两个向量之间的角度小于锐角。

alt

如果向量垂直,则内积为零。这是一个重要的结论!对于这样的向量,我们说它们是正交的。

alt

如果向量产生钝角,则内积将为负数。

alt

内积还有一个技巧。内积是一个交换向量运算。基本上,这意味着我们可以在vec{w}上投影vec{v},在这种情况下,我们将有一个投影 vec{v}的长度乘以 vec{w}的长度,因此我们将获得相同的结果。

让我们进一步探讨内积的交换性质。

如果 vec{v} 和 vec{w} 碰巧具有相同的长度,我们可以利用对称性。好吧,我们可以看到 vec{w} 到 vec{v}上的投影长度与投影到 vec{w}上的长度相同。这样,很明显,两种计算方法的内积是相同的。

alt

此外,我们可以假设其中一个向量,假设vec{v},比vec{w}长3倍。现在,我们看到我们不能有相同长度的投影。

但是,我们可以将其解释为 3 vec{v}向量的简单缩放vec{v}

alt

线性代数,对称线 让我们回想一下,使用标量缩放向量实际上是缩放其长度。

因此,我们可以观察到向量的大小与标量缩放的 vec{w} 相同。

现在,我们有一个标量乘以向量 vec{v},取 vec{w} 的内积与将 3 乘以 vec{v} 和 vec{w}相同。这说明内积确实是一种交换运算。

线性函数

现在,我们将再次讨论线性函数。但是现在,我们将观察输入和输出维度不同的函数。例如,我们有一个 2D 输入向量,使用函数 L 它将为 1D 输出向量。

alt

对于线性变换,以下属性确实成立:

alt

例如,一条带有均匀分布的点的线将被映射到一条 1D 线。在这里,请注意,实际上是将坐标为(x, y)的点映射到单个坐标在某条线上 z重要的是,映射线上的点之间的距离是等距的。这是线性变换的属性。

alt

现在,观察在vec{w}向量上应用线性变换 [1 -2] 会发生什么?

它被映射,使其值为 -2, 转换将 2D 空间映射到一条线的一维空间。变换显示了如何映射单个基向量。

因此,-2 不改变 hat{i}向量(保持不变),但它会改变我们的 hat{j}向量。因此,使用任何向量都可以分解为基向量组合的想法,我们可以得到以下公式。

alt

所有这些都可以在这个例子中澄清。你可以这样想:如何将二维点投影到一条线上。

我们有一个从 0 到 hat{u}的向量。

此外,我们还有很多 2D 点。我们感兴趣的是这些二维点(向量)将投影在一条线上的什么位置?

alt

让我们看看hat{i}向量将落在定义这条线的单位向量hat{u}上。如果我们使用所谓的对称线,我们将得出结论,u_{x}将是一个投影 hat{i}。这也是向量hat{u}的 x–坐标。

alt

同样的情况也适用于向量hat{i}。它将被投影到一个长度为u_{y}的向量。所以,什么将是一个具有两个非零(x,y)坐标的任意矢量的投影。

我们看到u_{x} 和 u_{y} 定义了我们的投影矩阵。它们将告诉我们基向量的着陆点:u_{x}和 u_{y}

alt

换句话说,如果我们用基向量表示我们的向量,我们会得到坐标(x, y)。

当我们将这些坐标分别与 u_{x} 和 u_{y} 相乘,然后将这两个乘积相加,我们将得到一个位置,在这个位置上,我们的原始(x, y)矢量将落在一条由矢量 hat{u} 定义的直线上。

这个位置,将是我们的新坐标,对于一个一维坐标系来说,就是 hat{u}。

第 3 步 编程工具

NumPy 的线性代数模块提供了多种方法将线性代数应用于任何 numpy 数组。 人们可以找到:

秩、行列式、跟踪等的数组

矩阵的特征值

矩阵和向量积(点积、内积、外积等)、矩阵幂

求解线性或张量方程等等!

线性代数是研究向量空间的数学分支。您将看到向量如何构成向量空间以及线性代数如何将线性变换应用于这些空间。

您还将学习线性方程组和矢量方程组之间的强大关系,这些关系与重要的数据科学概念,如最小二乘近似相关。

您最终将学习重要的矩阵分解方法:特征分解和奇异值分解 SVD,这对于理解主成分分析 PCA 等无监督学习方法非常重要。

本文由 mdnice 多平台发布

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python小姿势 - Python使用Jupyter Notebook

Python使用Jupyter Notebook Jupyter Notebook是一个开源的Web应用程序&#xff0c;可以用来创建和共享包含 live code&#xff0c;公式&#xff0c;可视化和解释性文本的文档。 安装Jupyter Notebook 首先&#xff0c;确保你安装了正确的Python版本和包管理器&#xff08;pip&…

java中的\t说明

阅读前请看一下&#xff1a;我是一个热衷于记录的人&#xff0c;每次写博客会反复研读&#xff0c;尽量不断提升博客质量。文章设置为仅粉丝可见&#xff0c;是因为写博客确实花了不少精力。希望互相进步谢谢&#xff01;&#xff01; 文章目录 阅读前请看一下&#xff1a;我是…

加载自己的图像数据集

文章目录 1 加载图像数据集2 图像预处理3 再次加载数据集4 这里还有一个问题&#xff0c;我们没有验证集5 构建DataLoader6 检查是否正确导入数据集 原文链接&#xff1a;《加载自己的图像数据集》 ​ 数据集下载链接 1 加载图像数据集 目录结构&#xff1a; 针对这种非常典型…

while语句和until语句顺便带点小实验

while语句和until语句 一、while用法二、Until循环语句三、趣味小实验猜价格的游戏&#xff08;价格是随机数&#xff09;写一个计算器脚本闲来无事去购物 一、while用法 for循环语句非常适用于列表对象无规律&#xff0c;且列表来源以固定&#xff08;如某个列表文件&#xf…

nginx配置sh脚本远程执行一键安装

背景 本地多机重复操作某些shell指令&#xff0c;分步执行&#xff0c;很耗费时间&#xff0c; 需要远程一键部署&#xff0c;傻瓜化运维&#xff0c;更为通用安装。 即参考docker通用安装 sudo curl https://get.docker.com | sh - # sudo python3 -m pip install docker-co…

Design_transformer

磁性元件设计 思路 滤波电感设计 磁芯不要饱和&#xff08;开气隙&#xff09; 考虑铜损大于铁损 谐振电感设计 磁芯不要饱和&#xff08;开气隙&#xff09; 考虑铁损大于铜损 变压器设计 磁芯不要饱和&#xff08;开气隙&#xff09; 励磁电流产生磁场 开气隙 增加了…

FreeRTOS系统学习-内核篇.01-数据结构---列表与列表项定义详解-链表节点插入实验

# 内核篇.01 列表与列表项 为什么要学列表&#xff1f;链表单向链表双向链表 FreeRTOS 中链表的实现节点节点初始化尾节点根节点链表根节点初始化将节点插入到链表的尾部将节点按照升序排列插入到链表将节点从链表删除节点带参宏小函数 链表节点插入实验实验现象 为什么要学列表…

内存优化-比glibc更快的tcmalloc

TCMalloc 是 Google 开发的内存分配器&#xff0c;在不少项目中都有使用&#xff0c;例如在 Golang 中就使用了类似的算法进行内存分配。它具有现代化内存分配器的基本特征&#xff1a;对抗内存碎片、在多核处理器能够 scale。据称&#xff0c;它的内存分配速度是 glibc2.3 中实…

vue3表单输入绑定

初识表单输入绑定 vue3可以帮助我们将vue定义的变量绑定到html表单元素上&#xff0c;并且监听到html表单元素修改值时&#xff0c;会将对应的vue定义的变量修改。 <!-- 将vue3定义的text绑定给inut元素, 当input元素发生input输入事件时, 将修改vue3定义的text --> <…

WeakMap 与 WeakSet

WeakSet WeakSet 结构与 Set 类似&#xff0c;也是不重复的值的集合。 成员都是数组和类似数组的对象&#xff0c;WeakSet 的成员只能是对象&#xff0c;而不能是其他类型的值。 若调用 add() 方法时传入了非数组和类似数组的对象的参数&#xff0c;就会抛出错误。 const b …

SpringBoot + Druid DataSource 实现监控 MySQL 性能

1 添加依赖 <properties><java.version>1.8</java.version><alibabaDruidStarter.version>1.2.11</alibabaDruidStarter.version> </properties><dependency><groupId>com.alibaba</groupId><artifactId>druid-s…

MYSQL进阶02

MYSQL进阶02 数据类型char与varchartext与blob浮点数与定点数日期类型的选择 数据类型 char与varchar char和varchar类型类似&#xff0c;都用来存储字符串&#xff0c;但是他们保存和检索的方式不同。char属于固定长度的字符类型&#xff0c;而varchar属于可变长度的字符类型…

【Java校招面试】基础知识(四)——JVM

目录 前言一、基础概念二、反射三、类加载器ClassLoader四、JVM内存模型后记 前言 本篇主要介绍Java虚拟机——JVM的相关内容。 “基础知识”是本专栏的第一个部分&#xff0c;本篇博文是第四篇博文&#xff0c;如有需要&#xff0c;可&#xff1a; 点击这里&#xff0c;返回…

营收、利润增速第一!海尔智家为何领跑?

“企业只有保持领先的能力&#xff0c;才有可能取得经济成果。” 管理学大师德鲁克曾如此强调。所谓“领先”&#xff0c;就是独一无二的、有价值的东西。利润&#xff0c;是企业在某个领域取得领先优势后&#xff0c;必然获得的回报。 这种“领先优势”&#xff0c;在各行业…

Linux基础IO【重定向及缓冲区理解】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 &#x1f307;前言&#x1f3d9;️正文1、文件描述符1.1、先描述&#xff0c;再组织1.2、files_struct1.3、分配规则…

跨平台Office文档预览原生插件,非腾讯X5,支持离线,稳定高可用

引言 2023年4月13日零时起&#xff0c;腾讯浏览服务内核文档能力正式下线&#xff0c;要实现真正离线文档预览&#xff0c;于是有了这边文章。 前面写了多篇关于<跨平台文件在线预览解决方案>&#xff0c;不管使用pdf.js、LibreOffice&#xff0c;还是永中DCS&#xff…

单列文本数据快速导入表格

文本数据导入Excel似乎是个老生常谈&#xff0c;方法也有很多&#xff0c;例如 使用文本编辑器打开文本文件&#xff0c;拷贝粘贴到Excel然后分类Power Query中的【从文本/CSV】如下图所示。 但是这个需求略有不同&#xff0c;文本数据为单列&#xff0c;每7行数据为一组&am…

MYSQL-数据库管理(下)

查看数据库信息 show database 查看数据库中的表信息 use 数据库名 #切换到书库中 show tables show tables in mysql 显示数据表的结构&#xff08;字段&#xff09; describe user; Field:字段名称 type:数据类型 Null :是否允许为空 Key :主键 Type:数据类型 Null :是否…

缓存空间优化实践

导读 缓存 Redis&#xff0c;是我们最常用的服务&#xff0c;其适用场景广泛&#xff0c;被大量应用到各业务场景中。也正因如此&#xff0c;缓存成为了重要的硬件成本来源&#xff0c;我们有必要从空间上做一些优化&#xff0c;降低成本的同时也会提高性能。 下面以我们的案…

【Git】Gitee免密push(TencentCloudLinux)

前提&#xff1a; 我用的是腾讯云的Centos(Linux)服务器 我创建好了仓库 我配置过git 可以正常用密码push 以上自行解决 我们直接配置公钥解决免密push 1.在服务器上创建公钥 在用户根目录创建 公钥 邮箱写自己的 随意写 我写的是gitee绑定的邮箱 ssh-keygen -t ed25519 -C…
最新文章