矩阵、向量、使用余弦相似度计算两段文本的相似度

矩阵的幂

矩阵的幂是指将一个矩阵自身相乘多次的操作。具体来说,如果 A 是一个 n×n 的方阵,那么 A 的 k 次幂 A^k 定义为 A 自身相乘 k 次的结果。

设 A 是一个 n×n 的方阵,那么 A 的 k 次幂 A^k 定义为:

其中 k 是一个正整数。

性质

矩阵幂具有以下性质:

  • 结合律:对于任意正整数 k 和 l,

  • 分配律:对于任意正整数 k 和 l,

     

    (除非 A 和 B 是可交换的)例如A+B的平方:

     

    如果A和B可交换,则AB=BA,所以

     

    如果A和B不可交换,则AB与BA不等,则上述公式不能合并为2AB。

  • 单位矩阵:对于任意方阵A,A^0=E,其中 E 是单位矩阵。

矩阵的转置

矩阵的转置(Transpose)是矩阵操作中的一种基本运算。它通过交换矩阵的行和列来生成一个新的矩阵。具体来说,如果 A 是一个

m×n 的矩阵,那么它的转置矩阵 A^T 是一个 n×m 的矩阵,其中 A^T 的第 i 行第 j 列的元素等于 A 的第 j 行第i 列的元素。

定义

设 A 是一个 m×n 的矩阵,其元素为 aij,那么 A 的转置矩阵 A^T 是一个 n×m 的矩阵,其元素为 aji。

性质

矩阵转置具有以下性质:

  • (A^T)^T = A:一个矩阵的转置的转置等于原矩阵。

  • (A + B)^T = A^T + B^T:两个矩阵和的转置等于它们各自转置的和。

  • (kA)^T = kA^T:一个矩阵乘以一个标量的转置等于该矩阵的转置乘以该标量。

  • (AB)^T = B^T A^T:两个矩阵乘积的转置等于它们各自转置的乘积,但顺序相反

特殊矩阵

  • 对称矩阵:如果一个矩阵 A 满足 A^T=A,那么 A 是对称矩阵。对称矩阵的元素关于主对角线对称。

    如:

  • 反对称矩阵:如果一个矩阵 A 满足 A^T=−A,那么 A 是反对称矩阵。反对称矩阵的主对角线元素必须为零,且关于主对角线对称的元素互为相反数。

    如:

     

    反对称矩阵:

     

    所以:

     

    得出主对角线元素必须为零

对称矩阵和反对称矩阵都是方阵。

矩阵A和B为同阶对称矩阵,AB对称的充要条件为AB=BA

方阵的行列式

要计算行列式的前提为矩阵A为方阵。

性质:A为n阶的方阵

伴随矩阵

设 A 是一个 n×n 的方阵,其元素为 aij。伴随矩阵 adj(A)或A* 是一个 n×n的矩阵,其第 i 行第 j 列的元素是 A 的余子式 Mji 的代数余子式 Cji,即:

其中 Mji是 A 的第j 行第i 列元素的余子式,即去掉第 j 行和第 i 列后剩下的 (n−1)×(n−1) 矩阵的行列式。

简单理解:

1.先按行求出每个元素的代数余子式

2.将每行元素的代数余子式按列组成一个矩阵,该矩阵就是伴随矩阵。

性质1:

性质2:

逆矩阵

对于一个 n×n 的方阵 A,如果存在另一个 n×n的方阵 B,使得 AB=BA=E,其中 E 是 n×n 的单位矩阵,那么 B 称为 A 的逆矩阵,记作

逆矩阵的存在条件

一个矩阵 A 有逆矩阵的充分必要条件是 A 是可逆的,即 det⁡(A)≠0。如果 det⁡(A)=0,则 A 是奇异矩阵,没有逆矩阵。

思考:如果A可逆,则可逆矩阵是唯一的

证明:

假设可逆矩阵不是唯一的,存在两个可逆矩阵B1和B2,则由可逆矩阵定义可知:

则:

所以可逆矩阵唯一。

性质:

1.n阶方阵A可逆的充要条件为

且当A可逆时,

初等变换

初等变换一般可以分为两种类型:行变换、列变换。

初等行变换:

  • 交换两行:将矩阵的第 i 行和第 j 行交换位置

    如:矩阵第二行和第三行交换

  • 某一行乘以非零常数:将矩阵的第i 行乘以一个非零常数 k

    如:第二行乘以非零整数k

  • 某一行加上另一行的倍数:将矩阵的第 i行加上第 j 行的 k 倍

    如:矩阵第一行乘以-4加到第二行

初等列变换

  • 交换两列:将矩阵的第 i 列和第 j 列交换位置

  • 某一列乘以非零常数:将矩阵的第 i 列乘以一个非零常数 k

  • 某一列加上另一列的倍数:将矩阵的第 i 列加上第 j 列的 k 倍

矩阵的标准形

常见的矩阵标准形包括行阶梯形矩阵、简化行阶梯形矩阵等。

行阶梯形矩阵

行阶梯形矩阵是一种特殊的矩阵形式,具有以下特征:

  • 非零行在零行之上:所有非零行都在零行之上。

  • 主元:每一行的第一个非零元素(主元)在上一行主元的右边。

  • 主元下方元素为零:每一行的主元下方元素都为零。

简化行阶梯形矩阵

简化行阶梯形矩阵是行阶梯形矩阵的一种特殊形式,具有以下特征:

  • 非零行在零行之上:所有非零行都在零行之上。

  • 主元为 1:每一行的第一个非零元素(主元)为 1。

  • 主元下方元素为零:每一行的主元下方元素都为零。

  • 主元上方元素为零:每一行的主元上方元素都为零。

即:

1.是行阶梯形矩阵;2.非0行的首非0元是1;3.非0行的首非0元所在列的其它元素都是0

向量

定义

向量可以用多种方式定义,以下是几种常见的定义:

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

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

例如,一个 n 维列向量可以表示为:

一个 n 维行向量可以表示为:

其中 v1,v2,…,vn是向量的分量。

行向量和列向量再本质上没有区别。

向量的表示

向量可以用多种方式表示,以下是几种常见的表示方法:

  • 几何表示:在二维或三维空间中,向量通常用箭头表示,箭头的方向表示向量的方向,箭头的长度表示向量的大小。

  • 代数表示:向量可以用列向量或行向量表示,如上所述。

  • 坐标表示:在二维或三维空间中,向量可以用坐标表示。例如,二维向量 v=(v1,v2)v=(v1,v2) 表示在 xx 轴和 yy 轴上的分量。

向量的运算

向量有几种基本的运算,包括加法、数乘、点积和叉积。

向量加法

向量加法是将两个向量的对应分量相加,得到一个新的向量。例如,两个 n 维向量 u 和 v 的加法为:

向量数乘

向量数乘是将一个向量的每个分量乘以一个标量,得到一个新的向量。例如,一个 n 维向量 v 与标量 k 的数乘为:

向量点积

向量点积(内积)是将两个向量的对应分量相乘,然后将结果相加,得到一个标量。例如,两个 n 维向量 u 和 v 的点积为:

矩阵的特征值和特征向量

定义

设 A 是一个 n×n 的方阵。如果存在一个非零列向量 v 和一个标量 λ,使得:

那么 λ 称为矩阵 A的特征值,v 称为对应于特征值 λ 的特征向量。

注:λ可以为0,而v不能为0,并且v是列向量。因为A是n维矩阵,如果v是行向量,则维数是1xn,不满足矩阵相乘。

将定义中的等式移项,得到:

由于v是非零列向量,相当于求上述方程的非零解,由方程有非零解的充要条件是行列式为0的定理可知:

说明:(A-λE):特征矩阵;|A-λE|:特征行列式或特征多项式;|A-λE|=0:特征方程

结论:

1.λ是A的特征值,v是对应λ的一个特征向量,则cv也是λ的一个特征向量,c为不等于0的标量。

根据定义:

等式两边同乘以c

所以cv也是λ的一个特征向量。

向量的模

定义

向量 v 的模记作 ∥v∥,计算公式为:

几何解释

在二维空间中,向量 v=(v1,v2)的模表示从原点到点 (v1,v2)的距离。在三维空间中,向量 v=(v1,v2,v3)的模表示从原点到点 (v1,v2,v3)的距离。

||v||=1,叫做单位向量的模。如:v=(1,0,0)

性质

  1. 非负性:∥v∥≥0,并且 ∥v∥=0 当且仅当 v=0(零向量)。

  2. 齐次性:对于任意标量 k,∥kv∥=∣k∣∥v∥。

  3. 三角不等式:对于任意向量 u 和 v,∥u+v∥≤∥u∥+∥v∥。


向量的内积

定义

对于两个 n 维向量 a=(a1,a2,…,an) 和 b=(b1,b2,…,bn),它们的内积(点积)表示为 a⋅b,计算公式为:

几何解释

在几何上,内积也可以通过向量的模和它们之间的夹角来表示。具体来说,如果 θ 是向量 a 和 b 之间的夹角,那么内积可以表示为:

其中:

  • ∥a∥ 和 ∥b∥ 分别是向量 a 和 b 的模(长度)。

  • cos⁡(θ)是夹角 θ 的余弦值。

性质

  1. 交换律:a⋅b=b⋅a

  2. 分配律:a⋅(b+c)=a⋅b+a⋅c

  3. 数乘结合律:(ka)⋅b=k(a⋅b)=a⋅(kb)(,其中 k 是标量。

  4. 正定性:a⋅a≥0,并且 a⋅a=0 当且仅当 a=0。

向量内积的几何解释其实就是余弦相似度算法的公式,当cos⁡(θ)=1时,表示两个向量重合;当cos⁡(θ)=0时,表示两个向量垂直。

如果使用两个向量分别近似表示两个文本或图像,两个向量的cos⁡(θ)越接近1,表示这两个文本内容越相似,cos⁡(θ)越接近0,表示这两个文本内容越不相似。

向量的余弦公式是

其中a,b是向量,余弦也叫余弦函数,是三角函数的一种,且余弦定理亦称第二余弦定理,是关于三角形边角关系的重要定理之一。

使用余弦相似度计算两段文本的相似度

安装jieba库

pip install jieba

import jieba
import re
from math import sqrt
​
def cosine_similarity(vec1, vec2):
    """计算两个向量的余弦相似度"""
    dot_product = sum(p*q for p,q in zip(vec1, vec2))
    magnitude1 = sqrt(sum([val**2 for val in vec1]))
    magnitude2 = sqrt(sum([val**2 for val in vec2]))
    if not magnitude1 or not magnitude2:
        return 0
    return dot_product / (magnitude1 * magnitude2)
​
def preprocess_text(text):
    """预处理文本,移除非汉字字符"""
    return re.sub(r'[^\u4e00-\u9fa5]', '', text)
​
def text_to_vector(text):
    """将文本转换成词频向量"""
    words = set(' '.join(lists).split())
    return words
​
def calculate_similarity(s1, s2):
    # 预处理文本
    s1 = preprocess_text(s1)
    s2 = preprocess_text(s2)
​
    # 使用jieba进行分词
    listA = list(jieba.cut(s1))
    listB = list(jieba.cut(s2))
​
    # 创建词汇集合
    word_set = set(listA).union(set(listB))
​
    # 计算词频向量
    freq_listA = [listA.count(word) for word in word_set]
    freq_listB = [listB.count(word) for word in word_set]
​
    # 计算余弦相似度
    return cosine_similarity(freq_listA, freq_listB)
​
if __name__ == "__main__":
    s1 = "这只皮靴号码大了。那只号码合适"
    s2 = "这只皮靴号码不小,那只更合适"
    similarity = calculate_similarity(s1, s2)
    print(f"文本相似度为: {similarity}")

首先添加一个preprocess_text函数用于去除字符串中的非汉字字符。这里使用的正则表达式[^\u4e00-\u9fa5]匹配所有非汉字字符,并通过re.sub函数替换为空字符串,从而达到清理文本的目的。然后定义一个计算余弦相似度的函数cosine_similarity,然后定义一个将文本转换成词频向量的函数text_to_vector),以及主要的计算相似度的函数calculate_similarity

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值