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线性代数学习笔记——向量的点乘与几何意义,实现向量的点乘操作...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: To change the IDENTI
- 下一篇: websocket python爬虫_p