线性代数 向量

时间:2024-10-14 20:50:14

一、定义

        几何定义:向量是一个有方向和大小的量,通常用箭头表示。向量的起点称为原点,终点称为向量的端点。

        代数定义:向量是一个有序的数组,通常表示为列向量或行向量。

行向量就是 1*n的形式(行展开)

列向量就是 n*1的形式(列展开)

二、运算

        加法、数乘、点积和叉积(向量维度必须相同,若不相同,可以补零)

1、加法

        向量加法是将两个向量的对应分量相加,得到一个新的向量(A_1 +B_1 = C_1)。

2、数乘

        向量数乘是将一个向量的每个分量乘以一个标量,得到一个新的向量(KA =B= KA_1 ,KA_2 ... KA_n)。

3、点积

        向量点积(内积)是将两个向量的对应分量相乘,然后将结果相加,得到一个标量

u⋅v=u_{1}v_{1}+u_{2}v_{2}+⋯+u_{n}v_{n}  。

例如:存在两个向量,求相加、分别乘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_{1}b_{1}+a_{2}b_{2}+⋯+a_{n}b_{n}

        在几何上,内积也可以通过向量的模和它们之间的夹角来表示。具体来说,如果 θ 是向量 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/  (14)^{1/2}   / (21)^{1/2} =  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("这两个句子不相似")