目录
介绍
背景
向量作为数字列表
使用NumPy库
使用TensorFlow
使用代码
总结
介绍在机器学习中,向量可以用作表示数字数据的好方法。使用向量时,我们可以满足以下基本操作:
- 添加两个向量
- 减去两个向量
- 多个带有标量的向量(即数字)
- 规范(即向量的大小或长度)
- 两个向量的点积
在本文中,我将通过三种方法介绍向量对象的基本操作:
- 最简单的方法是将向量表示为Python中的数字列表
- 第二种方法是在Python中使用Numpy库
- 最后一种方法是使用TensorFlow
在这种方法中,我们将向量表示为Python中的数字列表。例如,我们可以创建两个向量(v和w)作为两个数字列表:
v = [1,2]
w = [2,3]
可以将两个向量加在一起以形成新的向量。添加v和w的结果:
v + w = [3,5]
在Python中,我们可以使用zip方法添加两个向量:
def vector_add(v, w):
"""adds corresponding elements"""
return [v_i + w_i
for v_i, w_i in zip(v, w)]
同样,可以将两个向量相减,形成一个新向量:
v - w = [-1,-1]
在Python中:
def vector_subtract(v, w):
"""subtracts corresponding elements"""
return [v_i - w_i
for v_i, w_i in zip(v, w)]
向量也可以与标量相乘以形成新的向量,例如:
3 * v = [3,6]
在Python中:
def scalar_multiply(c, v):
"""c is a number, v is a vector"""
return [c * v_i for v_i in v]
两个向量的点积是它们的分量产物的总和。v和w的点积:
vw = 1 * 2 + 2 * 3 = 8
在Python中:
def dot(v, w):
"""v_1 * w_1 + ... + v_n * w_n"""
return sum(v_i * w_i
for v_i, w_i in zip(v, w))
使用上面的dot函数,我们可以用它来计算向量的大小(或长度)。大小也称为向量的范数。以下函数(名为norm)计算向量的范数:
import math
def norm(v):
return math.sqrt(dot(v,v))
使用NumPy库
另一种方法是使用NumPy库,其中包含许多支持向量基本操作的函数。如果我们将向量创建为数字列表,但我们必须将它们转换为数组,因为NumPy的函数仅适用于数组对象。
在使用NumPy库之前,我们必须:
import numpy as np
类似的功能vector_add,vector_subtract,scalar_multiply,dot和norm可以重新写成如下代码:
def vector_add(v, w):
"""adds corresponding elements"""
return np.array(v) + np.array(w)
def vector_subtract(v, w):
"""subtracts corresponding elements"""
return np.array(v) - np.array(w)
def scalar_multiply(c, v):
"""c is a number, v is a vector"""
return c*np.array(v)
def dot(v, w):
"""v_1 * w_1 + ... + v_n * w_n"""
return np.dot(np.array(v),np.array(w))
def norm(v):
return np.linalg.norm(np.array(v))
使用TensorFlow
TensorFlow是一个开源库,由Google Brain团队开发,并于2015年11月发布。在使用TensorFlow之前,我们需要了解以下基本概念:
- 图表:学习过程的布局,不包括数据
- 数据:用于训练的示例,它有两种输入和目标
- 会话:我们向图表提供数据或会话=图表+数据。我们可以通过使用占位符来实现这一点——在介绍示例的地方使用门(gates)。
可以使用TensorFlow库中的函数实现对向量的操作:
# creating the Graph
vec_1 = tf.placeholder(tf.float32)
vec_2 = tf.placeholder(tf.float32)
scalar = tf.placeholder(tf.float32)
vector_add = tf.add(vec_1,vec_2)
vector_subtract = tf.subtract(vec_1,vec_2)
scalar_multiply = tf.multiply(scalar,vec_1)
norm = tf.norm(vec_1)
dot = tf.tensordot(vec_1, vec_2, 1)
我们可以通过会话向图表提供数据:
#############DATA
v = [1,2]
w = [2,3]
c = 3
##########SESSION
with tf.Session() as sess:
result_add = sess.run(vector_add, feed_dict={vec_1:v,vec_2:w})
result_sub = sess.run(vector_subtract, feed_dict={vec_1:v,vec_2:w})
result_mul = sess.run(scalar_multiply, feed_dict={scalar:c,vec_1:v})
result_norm = sess.run(norm , feed_dict={vec_1:v})
result_dot = sess.run(dot, feed_dict={vec_1:v,vec_2:w})
使用代码
要测试第一种方法,我们可以创建一个名为vectors_lists.py的文件:
import math
#########VECTORS AS LISTS##########
def vector_add(v, w):
"""adds corresponding elements"""
return [v_i + w_i
for v_i, w_i in zip(v, w)]
def vector_subtract(v, w):
"""subtracts corresponding elements"""
return [v_i - w_i
for v_i, w_i in zip(v, w)]
def scalar_multiply(c, v):
"""c is a number, v is a vector"""
return [c * v_i for v_i in v]
def dot(v, w):
"""v_1 * w_1 + ... + v_n * w_n"""
return sum(v_i * w_i
for v_i, w_i in zip(v, w))
def norm(v):
return math.sqrt(dot(v,v))
##########DATA#############
v = [1,2]
w = [2,3]
scalar = 3
#########OUTPUT##########
print(vector_add(v,w))
print(vector_subtract(v,w))
print(scalar_multiply(scalar,v))
print(norm(v))
print(dot(v,w))
如果运行此文件,结果可能如下所示:
[3, 5]
[-1, -1]
[3, 6]
2.23606797749979
8
要测试第二种方法,我们可以创建一个名为vectors_numpy.py的文件:
import numpy as np
#########VECTORS AND NUMPY##########
def vector_add(v, w):
"""adds corresponding elements"""
return np.array(v) + np.array(w)
def vector_subtract(v, w):
"""subtracts corresponding elements"""
return np.array(v) - np.array(w)
def scalar_multiply(c, v):
"""c is a number, v is a vector"""
return c*np.array(v)
def dot(v, w):
"""v_1 * w_1 + ... + v_n * w_n"""
return np.dot(np.array(v),np.array(w))
def norm(v):
return np.linalg.norm(np.array(v))
##########DATA#############
v = [1,2]
w = [2,3]
scalar = 3
#########DISPLAY VECTORS ##########
print(vector_add(v,w).tolist())
print(vector_subtract(v,w).tolist())
print(scalar_multiply(scalar,v).tolist())
print(norm(v))
print(dot(v,w))
结果如下:
[3, 5]
[-1, -1]
[3, 6]
2.23606797749979
8
为了测试最后一种方法,我们可以创建一个名为vectors_tensorflow.py的文件:
import tensorflow as tf
############GRAPH
vec_1 = tf.placeholder(tf.float32)
vec_2 = tf.placeholder(tf.float32)
scalar = tf.placeholder(tf.float32)
vector_add = tf.add(vec_1,vec_2)
vector_subtract = tf.subtract(vec_1,vec_2)
scalar_multiply = tf.multiply(scalar,vec_1)
norm = tf.norm(vec_1)
dot = tf.tensordot(vec_1, vec_2, 1)
#############DATA
v = [1,2]
w = [2,3]
c = 3
##########SESSION
with tf.Session() as sess:
result_add = sess.run(vector_add, feed_dict={vec_1:v,vec_2:w})
result_sub = sess.run(vector_subtract, feed_dict={vec_1:v,vec_2:w})
result_mul = sess.run(scalar_multiply, feed_dict={scalar:c,vec_1:v})
result_norm = sess.run(norm , feed_dict={vec_1:v})
result_dot = sess.run(dot, feed_dict={vec_1:v,vec_2:w})
###########OUTPUT
print(result_add.tolist())
print(result_sub.tolist())
print(result_mul.tolist())
print(result_norm)
print(result_dot)
结果:
[3.0, 5.0]
[-1.0, -1.0]
[3.0, 6.0]
2.236068
8.0
总结
从最简单的事情开始是学习TensorFlow的最佳方法之一。通过对向量对象使用不同的方法,我希望你(和我)——TensorFlow初学者——在将来用于更复杂的任务之前,将了解如何使用TensorFlow。
原文地址:https://www.codeproject.com/Articles/1274830/An-introduction-to-the-TensorFlow-Vector-objects