本文主要是介绍线性代数-程序员的线性代数-向量的长度与单位向量(3.1-3.2),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
背景
划重点
3.1 向量的长度和单位向量
- 向量的长度(向量的模,又名欧拉距离,又名二范数,也就是2次方范数。。。)
- 单位向量表示方向,长度是1
- 求单位向量的过程,叫做规范化(或者是归一化,英文normalize)
3.2 代码实战归一化(normalize)
import mathclass 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 * otherdef __pos__(self):return 1 * selfdef __neg__(self):return -1 * selfdef __truediv__(self, other):'''self / other'''return 1 / other * self@classmethoddef 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的值,准确率会明显提升。
这篇关于线性代数-程序员的线性代数-向量的长度与单位向量(3.1-3.2)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!