据说大数学家笛卡尔, 有一次生了一场大病, 卧床养病期间依然在思考一个问题: 如何把几何图形和代数方程联系起来. 一天躺在床上, 笛卡尔不经意间看到房顶一角的正在织网的蜘蛛. spider 高超的拉网技术不仅让笛卡尔免于讨厌的 mosquito 的bite, 也带给了他发明直角坐标系的灵感. 而直角坐标系, 是我们学习向量的起点. So, thanks for the annoying mosquito!
向量含义
数字和点向量(3, 4), 有两种含义:
- 代表坐标系中的一点
- 代表由原点(0, 0)指向(3, 4)的有向线段
由于真实的世界是多维度的, 单变量不足以描述真实的世界, 所以我们需要向量这个伟大的工具. 而我们将上面的二维向量进一步推广, 定义为一组有序的数, 也就有了机器学习中特征向量. 对于我们普通的调参侠而言, 处理由特征向量构成的特征工程这部分工作, 在炼丹中占有很大的比例.
特征向量
向量运算法则
下面这个, 一目了然, 似曾相识, 好久不见...
向量运算的性质 向量加法的几何意义 向量加法的代数意义
证明也很重要
所有一目了然的公式, 背后都需要严格的数学证明.
另外,在数学公式的证明中,经常使用反证法和归纳法
零向量
零向量的定义 零向量的证明--反证法python实现向量基本操作
class Vector:
def __init__(self, lst):
self._values = list(lst)
@classmethod
def zeros(cls, dim):
"""静态方法, 返回dim维零向量"""
return cls([0] * dim)
def __getitem__(self, index):
"""下标获取元素"""
return self._values[index]
def __len__(self):
"""定义向量加法"""
return len(self._values)
def __add__(self, other):
"""定义向量减法"""
assert len(self) == len(other), \
"vector length not equal"
return Vector([a+b for a, b in zip(self._values, other)])
def __sub__(self, other):
"""定义向量减法"""
assert len(self) == len(other), \
"vector length not equal"
return Vector([a-b for a, b in zip(self. other)])
def __mul__(self, k):
"""左乘"""
return Vector([e*k for e in self._values])
def __rmul__(self, k):
"""右乘"""
return self * k
def __iter__(self):
"""迭代器"""
return self._values.__iter__()
def __pos__(self):
return 1 * self
def __neg__(self):
return -1 * self
def __repr__(self):
"""与开发者友好交互打印"""
return "Vector({})".format(self._values)
def __str__(self):
"""print函数调用的打印"""
return "({})".format(", ".join(str(e) for e in self._values))
if __name__ == "__main__":
vec1 = Vector([1, 2])
print("vec1: {}".format(vec1))
print("vec[1]: {}".format(vec1[1]))
print("vec len: {}".format(len(vec1)))
vec2 = Vector([3, 4])
print("vec2: {}".format(vec2))
print("vec1 add vec2: {}".format(vec1 + vec2))
print("{} * 3 = {}".format(vec1, vec1 * 3))
print("3 * {} = {}".format(vec2, 3 * vec2))
print("+{}: {}".format(vec1, +vec1))
print("-{}: {}".format(vec2, -vec2))
打印结果
网友评论