thinkphp 企業(yè)網(wǎng)站源碼青島網(wǎng)絡(luò)優(yōu)化廠家
一、定義
????????幾何定義:向量是一個(gè)有方向和大小的量,通常用箭頭表示。向量的起點(diǎn)稱為原點(diǎn),終點(diǎn)稱為向量的端點(diǎn)。
????????代數(shù)定義:向量是一個(gè)有序的數(shù)組,通常表示為列向量或行向量。
行向量就是 1*n的形式(行展開)
列向量就是 n*1的形式(列展開)
二、運(yùn)算
????????加法、數(shù)乘、點(diǎn)積和叉積(向量維度必須相同,若不相同,可以補(bǔ)零)
1、加法
? ? ? ??向量加法是將兩個(gè)向量的對(duì)應(yīng)分量相加,得到一個(gè)新的向量()。
2、數(shù)乘
????????向量數(shù)乘是將一個(gè)向量的每個(gè)分量乘以一個(gè)標(biāo)量,得到一個(gè)新的向量()。
3、點(diǎn)積
????????向量點(diǎn)積(內(nèi)積)是將兩個(gè)向量的對(duì)應(yīng)分量相乘,然后將結(jié)果相加,得到一個(gè)標(biāo)量。
u?v=+
+?+
? 。
例如:存在兩個(gè)向量,求相加、分別乘2、兩者相乘:
解:
注意:加減法、數(shù)乘都是得到向量結(jié)果,向量相乘得到標(biāo)量(準(zhǔn)確數(shù)值)。
三、特征值與特征向量
???????? A 是一個(gè) n×n 的方陣。如果存在一個(gè)非零列向量 v 和一個(gè)標(biāo)量 λ,使得: Av=λv。
那么λ 稱為矩陣 A的特征值,v 稱為對(duì)應(yīng)于特征值 λ 的特征向量(λ可以為0,而v不能為0,并且v是列向量 )。
? ? ? ? 根據(jù)? Av=λv 推?(A-λE)v=0 (λ? 是標(biāo)量,轉(zhuǎn)化為矩陣才能進(jìn)行運(yùn)算,則需要乘以單位矩陣),
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) 的矩陣來(lái)得到特征向量
在?λ = 2 的情況下:
?=?
,初等變化 (第一行和第三行交換;第二行減去第三行;第二行減去第一行;第二行與第三行交換;第二行 乘 4加上第一行, 第二行除以4)最終結(jié)果為?
,令為A1
根據(jù)?(A-λE)v=0 得到 A1 * v = 0 ,則 等價(jià)于?? *?
?=?
?=>
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 可以是任何數(shù)值。即 v =?
在?λ = 1 的情況下:
??=?
?,初等變化 后為?
與上面類型一致,則結(jié)果還是a=b=0,c 可以是任何數(shù)值。
四、向量的模
????????向量 v 的模記作 ∥v∥,計(jì)算公式為:
五,向量?jī)?nèi)積
????????對(duì)于兩個(gè) n 維向量 a=(a1,a2,…,an) 和 b=(b1,b2,…,bn),它們的內(nèi)積(點(diǎn)積)表示為 a?b,計(jì)算公式為:?a *? b=+
+?+
????????在幾何上,內(nèi)積也可以通過(guò)向量的模和它們之間的夾角來(lái)表示。具體來(lái)說(shuō),如果 θ 是向量 a 和 b 之間的夾角,那么內(nèi)積可以表示為:?a * b=||a|| * ||b|| *cos?(θ)
?例如:有兩個(gè)三維向量 a 和 b?:a=(2,3,1),b=(4,?1,2),
????????其內(nèi)積為?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
六、根據(jù)模擴(kuò)展 - 余弦相似度
????????cos= ab / (|a|*|b|)
????????使用余弦相似度計(jì)算兩段文本的相似度
將語(yǔ)句拆分為多個(gè)字或詞,之后將兩個(gè)語(yǔ)句的所有內(nèi)容放入集合,按照詞在集合中的次數(shù)進(jìn)行整理得到向量(集合中的詞位置就是向量的下標(biāo)),兩個(gè)向量求余弦值。
例如;
句子A:這只皮靴號(hào)碼大了。那只號(hào)碼合適。
句子B:這只皮靴號(hào)碼不小,那只更合適。
拆分句子得到:
listA=[這, 只, 皮靴, 號(hào)碼, 大, 了, 那, 只, 號(hào)碼, 合適]
listB=[這, 只, 皮靴, 號(hào)碼, 不, 小, 那, 只, 更, 合適]
放入集合
set=[號(hào)碼, 合適, 那, 更, 了, 大, 皮靴, 這, 只, 不, 小]
進(jìn)行排序加次數(shù)計(jì)算
freqListA=[2, 1, 1, 0, 1, 1, 1, 1, 2, 0, 0]
freqListB=[1, 1, 1, 1, 0, 0, 1, 1, 2, 1, 1]
套用余弦函數(shù)計(jì)算相似度
cos =?10 /12.94??= 0.77
import math # 輸入兩個(gè)語(yǔ)句 listA1 =input('請(qǐng)輸入第一個(gè)句子:') listB1 =input('請(qǐng)輸入第二個(gè)句子:') print(f'你輸入的第一個(gè)句子為:{listA1}' ) print(f'你輸入的第一個(gè)句子為:{listB1}' )#拆分后排序 listA =list(listA1) listB =list(listB1) listA.sort() listB.sort()#將拆分內(nèi)容放入集合,去掉重復(fù)后轉(zhuǎn)成列表獲取下標(biāo) C =set(listA+listB) listC=list(C) listC.sort()#創(chuàng)建兩個(gè)空列表 freqlsitA=[] freqlsitB=[]#根據(jù)兩個(gè)列表的數(shù)據(jù)并集 求向量列表的長(zhǎng)度 for i in range(len(listC)):freqlsitA.append(str(f'{i}'))freqlsitB.append(str(f'{i}'))#根據(jù)數(shù)據(jù)并集內(nèi)容判斷是否存在,若存在則計(jì)數(shù)放在與集合同位置的地方,若不存在,則將同位置修改為0 for i,j in enumerate(listC):if j in listA:freqlsitA[listC.index(j)] = listA.count(j)else:freqlsitA[listC.index(j)] = 0if j in listB:freqlsitB[listC.index(j)] = listB.count(j)else:freqlsitB[listC.index(j)] = 0#創(chuàng)建三個(gè)變量用來(lái)存放數(shù)學(xué)計(jì)算所需要的數(shù)據(jù)內(nèi)容 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]#余弦值等于相乘累計(jì) 處于平方累計(jì)之后平方根的相乘 COS = a /(math.sqrt(b) *math.sqrt(c))if COS >0.65:print('這兩個(gè)句子相似') else:print("這兩個(gè)句子不相似")