一、定义
几何定义:向量是一个有方向和大小的量,通常用箭头表示。向量的起点称为原点,终点称为向量的端点。
代数定义:向量是一个有序的数组,通常表示为列向量或行向量。
行向量就是 1*n的形式(行展开)
列向量就是 n*1的形式(列展开)
二、运算
加法、数乘、点积和叉积(向量维度必须相同,若不相同,可以补零)
1、加法
向量加法是将两个向量的对应分量相加,得到一个新的向量()。
2、数乘
向量数乘是将一个向量的每个分量乘以一个标量,得到一个新的向量()。
3、点积
向量点积(内积)是将两个向量的对应分量相乘,然后将结果相加,得到一个标量。
u⋅v=++⋯+ 。
例如:存在两个向量,求相加、分别乘2、两者相乘:
解:
注意:加减法、数乘都是得到向量结果,向量相乘得到标量(准确数值)。
三、特征值与特征向量
A 是一个 n×n 的方阵。如果存在一个非零列向量 v 和一个标量 λ,使得: Av=λv。
那么λ 称为矩阵 A的特征值,v 称为对应于特征值 λ 的特征向量(λ可以为0,而v不能为0,并且v是列向量 )。
根据 Av=λv 推 (A-λE)v=0 (λ 是标量,转化为矩阵才能进行运算,则需要乘以单位矩阵),
v不可以为零,那么 A-λE = 0
例如:
解:求特征值 λ :
A-λE = 0 => = (-1- λ)(3-λ)(2-λ) - (-4) * (2-λ) = (2-λ)((-1- λ)(3-λ)+4) = (2-λ)((-1- λ)(3-λ) +4) = (2-λ)(λ*λ -3λ +λ +4) = (2-λ)(λ-1)(λ-1) =0
那么 λ 的值为 2,1
求特征向量 (A-λE)v=0 ,则需要 (A-λE) 的矩阵来得到特征向量
在 λ = 2 的情况下:
= ,初等变化 (第一行和第三行交换;第二行减去第三行;第二行减去第一行;第二行与第三行交换;第二行 乘 4加上第一行, 第二行除以4)最终结果为
,令为A1
根据 (A-λE)v=0 得到 A1 * v = 0 ,则 等价于 * = =>
1*a + 0*b +0*c = 0 ; 0*a + 1*b +0*c = 0 ; 0*a + 0*b +0*c = 0
综合可得,a=b=0,c 可以是任何数值。即 v =
在 λ = 1 的情况下:
= ,初等变化 后为 与上面类型一致,则结果还是a=b=0,c 可以是任何数值。
四、向量的模
向量 v 的模记作 ∥v∥,计算公式为:
五,向量内积
对于两个 n 维向量 a=(a1,a2,…,an) 和 b=(b1,b2,…,bn),它们的内积(点积)表示为 a⋅b,计算公式为: a * b=++⋯+
在几何上,内积也可以通过向量的模和它们之间的夹角来表示。具体来说,如果 θ 是向量 a 和 b 之间的夹角,那么内积可以表示为: a * b=||a|| * ||b|| *cos(θ)
例如:有两个三维向量 a 和 b :a=(2,3,1),b=(4,−1,2),
其内积为 a⋅b=(2⋅4)+(3⋅−1)+(1⋅2)=8-3+2=7
a⋅b=∥a∥∥b∥cos(θ) => cos(θ) = a⋅b / ∥a∥∥b∥ = 7/ / = 0.408
六、根据模扩展 - 余弦相似度
cos= ab / (|a|*|b|)
使用余弦相似度计算两段文本的相似度
将语句拆分为多个字或词,之后将两个语句的所有内容放入集合,按照词在集合中的次数进行整理得到向量(集合中的词位置就是向量的下标),两个向量求余弦值。
例如;
句子A:这只皮靴号码大了。那只号码合适。
句子B:这只皮靴号码不小,那只更合适。
拆分句子得到:
listA=[这, 只, 皮靴, 号码, 大, 了, 那, 只, 号码, 合适]
listB=[这, 只, 皮靴, 号码, 不, 小, 那, 只, 更, 合适]
放入集合
set=[号码, 合适, 那, 更, 了, 大, 皮靴, 这, 只, 不, 小]
进行排序加次数计算
freqListA=[2, 1, 1, 0, 1, 1, 1, 1, 2, 0, 0]
freqListB=[1, 1, 1, 1, 0, 0, 1, 1, 2, 1, 1]
套用余弦函数计算相似度
cos = 10 /12.94 = 0.77
import math # 输入两个语句 listA1 =input('请输入第一个句子:') listB1 =input('请输入第二个句子:') print(f'你输入的第一个句子为:{listA1}' ) print(f'你输入的第一个句子为:{listB1}' ) #拆分后排序 listA =list(listA1) listB =list(listB1) listA.sort() listB.sort() #将拆分内容放入集合,去掉重复后转成列表获取下标 C =set(listA+listB) listC=list(C) listC.sort() #创建两个空列表 freqlsitA=[] freqlsitB=[] #根据两个列表的数据并集 求向量列表的长度 for i in range(len(listC)): freqlsitA.append(str(f'{i}')) freqlsitB.append(str(f'{i}')) #根据数据并集内容判断是否存在,若存在则计数放在与集合同位置的地方,若不存在,则将同位置修改为0 for i,j in enumerate(listC): if j in listA: freqlsitA[listC.index(j)] = listA.count(j) else: freqlsitA[listC.index(j)] = 0 if j in listB: freqlsitB[listC.index(j)] = listB.count(j) else: freqlsitB[listC.index(j)] = 0 #创建三个变量用来存放数学计算所需要的数据内容 a=0 b=0 c=0 for i in range(len(freqlsitA)): a += freqlsitA[i]*freqlsitB[i] b +=freqlsitA[i] * freqlsitA[i] c +=freqlsitB[i] * freqlsitB[i] #余弦值等于相乘累计 处于平方累计之后平方根的相乘 COS = a /(math.sqrt(b) *math.sqrt(c)) if COS >0.65: print('这两个句子相似') else: print("这两个句子不相似")