线性代数及代码实现(一)向量

线性代数及代码实现(一)向量

背景

大学学习过的线性代数到现在有些许遗忘,并且对于其中的代码实现并不熟练;本专栏主要是回顾线性代数的基础,并且对其中的代码部分进行实现;

1、一些基础概念

本质:一组数的基本表达方式,线性代数的基本元素;

引入向量的出发点:给数值给定方向这个属性;

一个重要作用:表示N维的数据(在现实生活中数据往往是多个维度的)

2、代码实现简单向量类

class Vector:
    def __init__(self, array):
        self._value = list(array)		# 这里用list是为了将对象进行赋值操作,防止类外修改对象
    
    # 索引其中的一个元素
    def __getitem__(self, index):
        return self._value[index]
    
    # 返回向量长度
    def __len__(self):
        return len(self._value)
    
    def __repr__(self):
        return "Vector({})".format(self._value)		# 系统打印向量时调用
    
    def __str__(self):
        return "({})".format(", ".join(str(a) for a in self._value))	# 用print时调用

由于数组可以很好的表示向量,实现向量也就是对数据的一些操作;

3、向量加法操作实现

def __add__(self, other):
	assert len(self) == len(other), \
		"Error in adding. len of vecters is not same"
	return Vector([a + b for a, b in zip(self, other)])		# 这里zip传入迭代器对象

# 将向量变为可迭代对象
def __iter__(self):
    return self._value.__iter__()

向量的减法操作类似于加法,只需要修改符号即可;

4、零向量

定义:对于任意一个向量v,都存在一个向量O,满足:v + O = v

代码实现:

# 定义一个类方法
@classmethod
def zero(cls, n):
	return cls([0] * n)

5、向量的长度

好像是大学的知识,叫做向量的,其实也就是欧拉距离的计算方式;

单位向量:模长为1,方向和原向量一致,表示方向,称为归一化、规范化过程;

下面是代码实现:

import math

# 求向量的模
def norm(self):
	return math.sqrt(sum(e**2 for e in self))

# 求当前向量的单位向量
def normal_one(self):
	return 1 / self.norm() * Vector(self._value)

6、向量的点乘

实现公式

在这里插入图片描述

其实很容易理解,可以理解成一个向量映射到另一个向量上,也可以理解成将两个向量分解到x轴和y轴再相乘;

根据几何意义,可以很好的得到下面结论:

两个向量点乘等于0,夹角呈90°;

两个向量点乘大于0,夹角小于90°;

两个向量点乘小于0,夹角大于90°;

向量的点乘其实可以判断两个向量的相似程度,也就是在推荐系统的应用中;

代码实现

def dot(self, other):
	assert len(self) == len(other), \
		"Error in adding. len of vecters is not same"
	return Vector([a * b for a, b in zip(self, other)])		# 这里zip传入迭代器对象

7、Numpy中向量的使用

# 定义一个向量
vec = np.array([1, 2, 3])		
print(np.zeros(5))
print(np.ones(5))
print(np.full(5, 666))

# numpy基本运算
vec2 = np.array([4, 5, 6])
print("{} + {} = {}".format(vec, vec2, vec + vec2))
print("{} - {} = {}".format(vec, vec2, vec - vec2))
print("{} * {} = {}".format(2, vec, 2 * vec))
print("{} * {} = {}".format(vec, vec2, vec * vec2))
print("{}.dot({}) = {}".format(vec, vec2, vec.dot(vec2)))

print(np.linalg.norm(vec))
print(vec / np.linalg.norm(vec))
print(np.linalg.norm(vec / np.linalg.norm(vec)))

Numpy作为最常用的一个库,包含了对向量处理的所有方法,其内部实现就好比我们自己实现,只是封装了起来,在实际工程中我们直接调用即可;向量只是最简单一个应用,实际在处理一些数据(特别是图像),往往都是矩阵的形式,相比向量更加复杂一些,下一部分将讲解矩阵的知识以及代码实现;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值