背景
划重点
3.1 向量的长度和单位向量
- 向量的长度(向量的模,又名欧拉距离,又名二范数,也就是2次方范数。。。)
- 单位向量表示方向,长度是1
- 求单位向量的过程,叫做规范化(或者是归一化,英文normalize)
3.2 代码实战归一化(normalize)
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()
if __name__ == '__main__':
print(Vector([5, 2]).norm())
print(Vector([5, 2]).normalize())
print(Vector([5, 2]).normalize().norm())
print(Vector.zero(2).normalize())
- 单位向量的模是1
- 0向量不能被归一化
评价
单位向量的概念在机器学习中很重要,例如tfidf,最终倾向于用normalize的值,准确率会明显提升。