Refence: 《Tensorflow machine learning cookbook》 : Working with Matrices
Packt.TensorFlow.Machine.Learning.Cookbook.2017 笔记
# -*- coding:utf-8 -*-
import tensorflow as tf
import numpy as np
def show(tip, *a):
sess = tf.Session()
b = sess.run(a) #运行计算图,真正初 始化张量,对于随机张量,每次会取得不同的初始化值,也就是说,这个时候,才会正常去调用内部的生成随机数的代码。a表示一个操作,当sess.run()时,才会真正开始操作。
print('-------------------')
print(tip)
for i in b:
print(i)
sess = tf.Session()
id_mat = tf.diag([1.0, 1, 1]) #对角矩阵
show('tf.diag:', id_mat)
A = tf.truncated_normal([2, 3]) #mean:0 stddev:0.1
show('tf.truncated:', A)
B = tf.fill([2,3], 12.)
show('tf.fill',B)
C = tf.random_uniform([2,3]) #[0, 1)
show('tf.random_uniform', C)
D = tf.convert_to_tensor(np.array([[1., 2., 3.], #使用tf.convert_to_tensor接收numpy数组
[-3., -7.,-1.],
[0., 5., -2.]]))
show('tf.convert_to_tensor:', D)
#矩阵操作
print('===========')
print('A+B:',sess.run(A + B)) #直接是元素级操作,
print('===========')
print('A-B:',sess.run(B - B)) #直接是元素级操作,
print('===========')
print('矩阵相乘', sess.run(tf.matmul(B, id_mat))) #n*k,k*m方式
print('矩阵转置', sess.run(tf.transpose(C)))
print('计算矩阵对应的行列式:', sess.run(tf.matrix_determinant(D))) #[λE-A]X=0, λ是特征值,E是单位矩阵,A在这里就是D。Tensorflow不用这么麻烦,直接算。
print('计算逆矩阵',sess.run(tf.matrix_inverse(D))) #AB=BA=E, 则B是A的逆矩阵. 当矩阵为对称正定矩阵时,采用乔里斯基Cholesky分解,否则采用LU分解。
print('逆矩阵验证', sess.run(tf.matmul(D,tf.convert_to_tensor(np.array([[-0.5,-0.5,-0.5], [0.15789474, 0.05263158, 0.21052632], [0.39473684, 0.13157895, 0.02631579]])))))
#所谓矩阵分解就是将一个矩阵写成结构比较简单的或性质比较熟悉的另一些矩阵的乘积。
print('cholesky分解', sess.run(tf.cholesky(id_mat))) #对称正定矩阵,非数字专业,我也不好理解。
print('特征值和特征向量',sess.run(tf.self_adjoint_eig(D))) #打印的第一个array是特征值,第二个array是特征向量,这在数学中称为特征分解
返回:
-------------------
tf.diag:
[[ 1. 0. 0.]
[ 0. 1. 0.]
[ 0. 0. 1.]]
-------------------
tf.truncated:
[[ 0.05445328 0.35032877 0.59574115]
[ 1.07889056 -0.83000922 -1.04379463]]
-------------------
tf.fill
[[ 12. 12. 12.]
[ 12. 12. 12.]]
-------------------
tf.random_uniform
[[ 0.85289407 0.49230719 0.65092373]
[ 0.56362426 0.71060741 0.91536355]]
-------------------
tf.convert_to_tensor:
[[ 1. 2. 3.]
[-3. -7. -1.]
[ 0. 5. -2.]]
===========
A+B: [[ 12.84969997 11.2966547 12.72791958]
[ 11.78018761 12.33149624 11.5651226 ]]
===========
A-B: [[ 0. 0. 0.]
[ 0. 0. 0.]]
===========
矩阵相乘 [[ 12. 12. 12.]
[ 12. 12. 12.]]
矩阵转置 [[ 0.06980073 0.34745061]
[ 0.58658588 0.04126799]
[ 0.91785896 0.36349642]]
计算矩阵对应的行列式: -38.0
计算逆矩阵 [[-0.5 -0.5 -0.5 ]
[ 0.15789474 0.05263158 0.21052632]
[ 0.39473684 0.13157895 0.02631579]]
逆矩阵验证 [[ 1.00000000e+00 1.00000001e-08 9.99999997e-09]
[ -2.00000001e-08 9.99999990e-01 -2.99999999e-08]
[ 2.00000001e-08 0.00000000e+00 1.00000002e+00]]
cholesky分解 [[ 1. 0. 0.]
[ 0. 1. 0.]
[ 0. 0. 1.]]
特征值和特征向量 (array([-10.65907521, -0.22750691, 2.88658212]), array([[ 0.21749542, 0.63250104, -0.74339638],
[ 0.84526515, 0.2587998 , 0.46749277],
[-0.4880805 , 0.73004459, 0.47834331]]))