背景
本节很重要,点积涉及到了卷积神经网络基础。
划重点
3.3 两个向量相乘(內积)
- 对应元素相乘,再想加
- 內积结果是一个数
- 通过勾股定理可以证明,并且得到如下的几何意义(如下也是向量內积的结果)
3.4 两个向量相乘(內积)
- 另外一个理解,向量的点乘是
一个向量先投影到另外一个向量,然后再做乘机
- 向量点乘,可以理解为
先投影到特征空间,然后再做乘机
(这里可以发散到卷积神经网络
,卷积可以理解为移动的內积
)
3.5 实战向量的点积
import math
class Vector:
def __init__(self, lst):
self._values = list(lst)
def __repr__(self):
return "Vector({})".format(self._values)
def __str__(self):
return "({})".format(', '.join(str(item) for item in self._values))
def __len__(self):
'''长度'''
return len(self._values)
def __getitem__(self, index):
'''获取索引元素'''
return self._values[index]
def __add__(self, other):
assert len(self) == len(other), '长度需要想等'
return Vector([a + b for a, b in zip(self, other)])
def __iter__(self):
'''增加迭代器'''
return self._values.__iter__()
def __sub__(self, other):
assert len(self) == len(other), '长度需要相等'
return Vector([a - b for a, b in zip(self, other)])
def __mul__(self, other):
return Vector([other * e for e in self])
def __rmul__(self, other):
return self * other
def __pos__(self):
return 1 * self
def __neg__(self):
return -1 * self
def __truediv__(self, other):
'''self / other'''
return 1 / other * self
@classmethod
def zero(cls, dim):
return cls([0] * dim)
def norm(self):
return math.sqrt(sum(e ** 2 for e in self))
def normalize(self):
if self.norm() < 1e-8:
raise ZeroDivisionError("分母不能为0")
return Vector(self._values) / self.norm()
def dot(self, another):
assert len(self) == len(another), "维度必须相同"
return sum(a * b for a, b in zip(self, another))
if __name__ == '__main__':
print(Vector([5, 1]).dot(Vector([4, 2])))
3.6 点积应用
- 点积 == 0,向量垂直,点积 > 0,为锐角, 点积 < 0为钝角
- 推荐系统中,向量夹角越小,说明物品更加相似
评价
dot点积很重要。。。以后我将出一个卷积的博客