日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python向量点乘_Python线性代数学习笔记——向量的点乘与几何意义,实现向量的点乘操作...

發布時間:2023/12/15 python 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python向量点乘_Python线性代数学习笔记——向量的点乘与几何意义,实现向量的点乘操作... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

好久沒有寫文章了,抱歉了,以后每天都會更新一篇的....

向量的點乘,也就是兩個向量相乘:

我們是不這么定義的,不是兩個向量對應的坐標元素相乘:

兩個向量“相乘”,結果是?個數!,兩個向量"相乘",更嚴格的說法:兩個向量的點乘,兩個向量的內積。

兩個向量“相乘”:等于兩個向量的模(長度)乘于夾角的余弦

在二維空間中,向量的點乘:

使用余弦定理證明:

向量點乘的直觀理解:

向量的點乘,兩個向量必須是同方向的,所以做投影以后的長度再相乘

同樣,可以用坐標來理解:

v向量分解為x軸的x2向量,y軸的y2向量,u向量分解為x軸的x1向量,和y軸的y1向量,然后分別相乘,有4種情況,垂直的向量相乘為0,所以是x1.x2+y1.y2

使用Python實現向量的點乘:

具體代碼:

定義一個內部使用的文件_globals,用來存儲全局使用的變量 EPSILON,用來判斷精度用的

EPSILON = 1e-8

Vector的代碼:

import math

from ._globals import EPSILON

class Vector:

def __init__(self, lst):

self._values = list(lst)

@classmethod

def zero(cls, dim):

"""返回一個dim維的零向量"""

return cls([0] * dim)

def __add__(self, another):

"""向量加法,返回結果向量"""

assert len(self) == len(another), \

"Error in adding. Length of vectors must be same."

return Vector([a + b for a, b in zip(self, another)])

def __sub__(self, another):

"""向量減法,返回結果向量"""

assert len(self) == len(another), \

"Error in subtracting. Length of vectors must be same."

return Vector([a - b for a, b in zip(self, another)])

def norm(self):

"""返回向量的模"""

return math.sqrt(sum(e**2 for e in self))

def normalize(self):

"""返回向量的單位向量"""

if self.norm() < EPSILON:

raise ZeroDivisionError("Normalize error! norm is zero.")

return Vector(self._values) / self.norm()

def dot(self, another):

"""向量點乘,返回結果標量"""

assert len(self) == len(another), \

"Error in dot product. Length of vectors must be same."

return sum(a * b for a, b in zip(self, another))

def __mul__(self, k):

"""返回數量乘法的結果向量:self * k"""

return Vector([k * e for e in self])

def __rmul__(self, k):

"""返回數量乘法的結果向量:k * self"""

return self * k

def __truediv__(self, k):

"""返回數量除法的結果向量:self / k"""

return (1 / k) * self

def __pos__(self):

"""返回向量取正的結果向量"""

return 1 * self

def __neg__(self):

"""返回向量取負的結果向量"""

return -1 * self

def __iter__(self):

"""返回向量的迭代器"""

return self._values.__iter__()

def __getitem__(self, index):

"""取向量的第index個元素"""

return self._values[index]

def __len__(self):

"""返回向量長度(有多少個元素)"""

return len(self._values)

def __repr__(self):

return "Vector({})".format(self._values)

def __str__(self):

return "({})".format(", ".join(str(e) for e in self._values))

測試代碼:

from playLA.Vector import Vector

if __name__ == "__main__":

vec = Vector([5, 2])

print(vec)

print("len(vec) = {}".format(len(vec)))

print("vec[0] = {}, vec[1] = {}".format(vec[0], vec[1]))

vec2 = Vector([3, 1])

print("{} + {} = {}".format(vec, vec2, vec + vec2))

print("{} - {} = {}".format(vec, vec2, vec - vec2))

print("{} * {} = {}".format(vec, 3, vec * 3))

print("{} * {} = {}".format(3, vec, 3 * vec))

print("+{} = {}".format(vec, +vec))

print("-{} = {}".format(vec, -vec))

zero2 = Vector.zero(2)

print(zero2)

print("{} + {} = {}".format(vec, zero2, vec + zero2))

print("norm({}) = {}".format(vec, vec.norm()))

print("norm({}) = {}".format(vec2, vec2.norm()))

print("norm({}) = {}".format(zero2, zero2.norm()))

print("normalize {} is {}".format(vec, vec.normalize()))

print(vec.normalize().norm())

print("normalize {} is {}".format(vec2, vec2.normalize()))

print(vec2.normalize().norm())

try:

zero2.normalize()

except ZeroDivisionError:

print("Cannot normalize zero vector {}.".format(zero2))

print(vec.dot(vec2))

注意:

向量的點乘的應?

1、求出兩個向量之間的夾角范圍,或者具體值

2、判斷兩個向量的相似程度(推薦系統)

一組物品進行推薦,可能是電影,音樂....在推薦的時候,最典型的推薦策略就是推薦和你的喜好最相似的內容,比如說,你已經在系統上留下足跡,喜歡電影A,此時電影B和A相似,推薦系統就會傾向把電影B推薦給你,電影C和電影B極其不相似,推薦系統就不會推薦。

在這個背后如何判斷兩個電影是否相似?

很簡單的判斷就是使用向量的點乘,在這種情況下,可以想象一下,每一個電影都可以理解為一個高維空間中的點,把向量另外一種視角看待(高維空間中的一個點),對電影來說,它可能有(電影的時間,演員的列表,電影的導演,電影的類型,電影的色調,臺詞量....)的一個高維度信息,就是在一個高維空間中的點,在這種情況下,如果我們轉換我們的視角,把每個電影又轉換成一個高維空間中的一個向量,每兩個電影之間就會存在一個夾角,這時候,我們可以看這兩個電影之間的夾角是直角,鈍角,還是銳角,,如果是銳角,那么這兩個電影之間有一部分是重合的,我就說這兩個電影是相似的,如果是垂直的,那么這兩部電影就是無關的,如果是頓角那么這兩部電影是背離的。

在這里我們不僅可以看兩個向量之間的夾角,還可以看點乘的結果(值),如果點乘的值為正值,并且越大,說明這兩個電影越相似,在最極端的情況下,這兩個向量完全重合的時候,那么這時候這兩個向量的點乘將達到最大值,也就是兩個電影的高維空間中的點(電影的時間,演員的列表,電影的導演,電影的類型,電影的色調,臺詞量....)已經重合了。

換句話說,我們可以使用向量點乘的方式,來看兩個向量(電影)的相似,值越大,越相似,值越小,越不一樣,這就是向量的點乘在推薦系統中的一個典型應用,當然了,現在的推薦

系統都比較復雜,在判斷兩個物品是否相似的時候,也有其他更加準確的方法,不僅如此,在具體判斷兩個物品是否相似之前,對兩個物品所對應的數據也也需要進行很多的處理。

3、?何計算

v向量投影到u向量上

投影點的方向,也就是u向量除以u向量的模,也就是u向量方向的單位向量,舉例子,u向量為(3,4),模長為5,u向量方向的單位向量為(3/5,4/5)

總結

以上是生活随笔為你收集整理的python向量点乘_Python线性代数学习笔记——向量的点乘与几何意义,实现向量的点乘操作...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。