使用tensorflow实现矩阵分解方式

采用最小二乘的求逆方法在大部分情况下是低效率的。特别地,当局镇非常大时效率更低。另外一种实现方法是矩阵分解,此方法使用tensorflow内建的Cholesky矩阵分解法。Cholesky矩阵分解法把一个矩阵分解为上三角矩阵和下三角矩阵,L和L'。求解Ax=b,改写成LL'=b。首先求解Ly=b,然后求解L'x=y得到系数矩阵。

1. 导入编程库,初始化计算图,生成数据集。接着获取矩阵A和b。

>>> import matplotlib.pyplot as plt
>>> import numpy as np

>>> import tensorflow as tf

>>> from tensorflow.python.framework import ops
>>> ops.reset_default_graph()

>>> sess=tf.Session()

>>> x_vals=np.linspace(0,10,100)

>>> y_vals=x_vals+np.random.normal(0,1,100)

>>> x_vals_column=np.transpose(np.matrix(x_vals))
>>> ones_column=np.transpose(np.matrix(np.repeat(1,100)))
>>> A=np.column_stack((x_vals_column,ones_column))
>>> b=np.transpose(np.matrix(y_vals))
>>> A_tensor=tf.constant(A)

>>> b_tensor=tf.constant(b)

2. 找到方阵的Cholesky矩阵分解。

注意:tensorflow的cholesky()函数仅仅返回矩阵分解的下三角矩阵,因为上三角矩阵是下三角矩阵的转置矩阵。

>>> tA_A=tf.matmul(tf.transpose(A_tensor),A_tensor)
>>> L=tf.cholesky(tA_A)
>>> tA_b=tf.matmul(tf.transpose(A_tensor),b)
>>> sol1=tf.matrix_solve(L,tA_b)

>>> sol2=tf.matrix_solve(tf.transpose(L),sol1)

3. 抽取系数

>>> solution_eval=sess.run(sol2)
>>> solution_eval
array([[1.01379067],
    [0.02290901]])
>>> slope=solution_eval[0][0]
>>> y_intercept=solution_eval[1][0]
>>> print('slope:'+str(slope))
slope:1.0137906744047482
>>> print('y_intercept:'+str(y_intercept))
y_intercept:0.022909011828880693
>>> best_fit=[]
>>> for i in x_vals:
...  best_fit.append(slope*i+y_intercept)
...
>>> plt.plot(x_vals,y_vals,'o',label='Data')
[<matplotlib.lines.Line2D object at 0x000001E0A58DD9B0>]
>>> plt.plot(x_vals,best_fit,'r-',label='Best fit line',linewidth=3)
[<matplotlib.lines.Line2D object at 0x000001E0A2DFAF98>]
>>> plt.legend(loc='upper left')
<matplotlib.legend.Legend object at 0x000001E0A58F03C8>

>>> plt.show()

以上这篇使用tensorflow实现矩阵分解方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Tensorflow tf.dynamic_partition矩阵拆分示例(Python3)

    先给出一个样例看看 import tensorflow as tf raw = tf.constant([1, 2, 3, 4, 5, 6, 6, 5, 4, 3, 2, 1]) ''' 拆成 [1,2] [3,4] [5,6] [6,5] [4,3] [2,1] ''' result_1 = tf.dynamic_partition(tf.reshape(raw, [6,2]),[0, 1, 2, 3, 4, 5], 6) ''' 拆成 [1, 2, 3, 4, 5, 6] [6, 5, 4,

  • Tensorflow矩阵运算实例(矩阵相乘,点乘,行/列累加)

    Tensorflow二维.三维.四维矩阵运算(矩阵相乘,点乘,行/列累加) 1. 矩阵相乘 根据矩阵相乘的匹配原则,左乘矩阵的列数要等于右乘矩阵的行数. 在多维(三维.四维)矩阵的相乘中,需要最后两维满足匹配原则. 可以将多维矩阵理解成:(矩阵排列,矩阵),即后两维为矩阵,前面的维度为矩阵的排列. 比如对于(2,2,4)来说,视为2个(2,4)矩阵. 对于(2,2,2,4)来说,视为2*2个(2,4)矩阵. import tensorflow as tf a_2d = tf.constant([

  • Tensorflow进行多维矩阵的拆分与拼接实例

    最近在使用tensorflow进行网络训练的时候,需要提取出别人训练好的卷积核的部分层的数据.由于tensorflow中的tensor和python中的list不同,无法直接使用加法进行拼接,后来发现一个函数可以完成tensor的拼接. 函数形式如下: tf.concat(concat_dim,values,name='concat') 其中,第一个参数表示需要拼接的多维tensor,并且可以将多个tensor同事拼接,第二个表示按照哪一个维度拼接(从数字0开始). 例子:创建一个三维的tens

  • 将tensorflow.Variable中的某些元素取出组成一个新的矩阵示例

    在神经网络计算过程中,经常会遇到需要将矩阵中的某些元素取出并且单独进行计算的步骤(例如MLE,Attention等操作).那么在 tensorflow 的 Variable 类型中如何做到这一点呢? 首先假设 Variable 是一个一维数组 A: import numpy as np import tensorflow as tf a = np.array([1, 2, 3, 4, 5, 6, 7, 8]) A = tf.Variable(a) 我们把我们想取出的元素的索引存到 B 中,如果我

  • tensorflow 用矩阵运算替换for循环 用tf.tile而不写for的方法

    如下所示: # u [32,30,200] # u_logits [400,32,30] q_j_400 = [] for j in range(400): q_j_400.append(tf.squeeze(tf.matmul(tf.transpose(u,[0,2,1]),tf.expand_dims(tf.nn.softmax(u_logits[j]),-1)),[2])) # tf.matmul [32,200,30],[32,30,1] test_result = tf.stack(q

  • TensorFlow2.0矩阵与向量的加减乘实例

    1.矩阵加法使用 a = np.random.random((3,3)) b = np.random.randint(0,9,(3,3)) ad = tf.add(a,b) 2.矩阵乘法注意 # tensorflow 使用矩阵乘法都必须使用相同类型的数据,否则报错. a = np.random.random((5,3)) b = np.random.randint(0,9,(3,6)) c = tf.tensordot(a.astype(np.float),b.astype(np.float),

  • Tensorflow的常用矩阵生成方式

    我就废话不多说了,直接上代码吧! #全0和全1矩阵 v1 = tf.Variable(tf.zeros([3,3,3]), name="v1") v2 = tf.Variable(tf.ones([10,5]), name="v2") #填充单值矩阵 v3 = tf.Variable(tf.fill([2,3], 9)) #常量矩阵 v4_1 = tf.constant([1, 2, 3, 4, 5, 6, 7]) v4_2 = tf.constant(-1.0,

  • 对Tensorflow中的矩阵运算函数详解

    tf.diag(diagonal,name=None) #生成对角矩阵 import tensorflowas tf; diagonal=[1,1,1,1] with tf.Session() as sess: print(sess.run(tf.diag(diagonal))) #输出的结果为[[1 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 1]] tf.diag_part(input,name=None) #功能与tf.diag函数相反,返回对角阵的对角元素 imp

  • 使用tensorflow实现矩阵分解方式

    采用最小二乘的求逆方法在大部分情况下是低效率的.特别地,当局镇非常大时效率更低.另外一种实现方法是矩阵分解,此方法使用tensorflow内建的Cholesky矩阵分解法.Cholesky矩阵分解法把一个矩阵分解为上三角矩阵和下三角矩阵,L和L'.求解Ax=b,改写成LL'=b.首先求解Ly=b,然后求解L'x=y得到系数矩阵. 1. 导入编程库,初始化计算图,生成数据集.接着获取矩阵A和b. >>> import matplotlib.pyplot as plt >>>

  • C#实现将一个矩阵分解为对称矩阵与反称矩阵之和的方法

    本文实例讲述了C#实现将一个矩阵分解为对称矩阵与反称矩阵之和的方法.分享给大家供大家参考.具体如下: 1.理论依据 对任意n阶方阵A,有 A=(A+T(A))/2+(A-T(A))/2,其中T(A)是A的转置,(A+T(A))/2是一个对称矩阵,(A-T(A))/2是一个反称矩阵. 2.求出对称矩阵部分的函数 /// <summary> /// 把矩阵分解为对称矩阵与反称矩阵之和:对称矩阵 /// </summary> /// <param name="matrix

  • 详解Tensorflow数据读取有三种方式(next_batch)

    Tensorflow数据读取有三种方式: Preloaded data: 预加载数据 Feeding: Python产生数据,再把数据喂给后端. Reading from file: 从文件中直接读取 这三种有读取方式有什么区别呢? 我们首先要知道TensorFlow(TF)是怎么样工作的. TF的核心是用C++写的,这样的好处是运行快,缺点是调用不灵活.而Python恰好相反,所以结合两种语言的优势.涉及计算的核心算子和运行框架是用C++写的,并提供API给Python.Python调用这些A

  • 基于随机梯度下降的矩阵分解推荐算法(python)

    SVD是矩阵分解常用的方法,其原理为:矩阵M可以写成矩阵A.B与C相乘得到,而B可以与A或者C合并,就变成了两个元素M1与M2的矩阵相乘可以得到M. 矩阵分解推荐的思想就是基于此,将每个user和item的内在feature构成的矩阵分别表示为M1与M2,则内在feature的乘积得到M:因此我们可以利用已有数据(user对item的打分)通过随机梯度下降的方法计算出现有user和item最可能的feature对应到的M1与M2(相当于得到每个user和每个item的内在属性),这样就可以得到通

  • numpy.linalg.eig() 计算矩阵特征向量方式

    在PCA中有遇到,在这里记录一下 计算矩阵的特征值个特征向量,下面给出几个示例代码: 在使用前需要单独import一下 >>> from numpy import linalg as LA >>> w, v = LA.eig(np.diag((1, 2, 3))) >>> w; v array([ 1., 2., 3.]) array([[ 1., 0., 0.], [ 0., 1., 0.], [ 0., 0., 1.]]) >>>

  • TensorFlow实现自定义Op方式

    『写在前面』 以CTC Beam search decoder为例,简单整理一下TensorFlow实现自定义Op的操作流程. 基本的流程 1. 定义Op接口 #include "tensorflow/core/framework/op.h" REGISTER_OP("Custom") .Input("custom_input: int32") .Output("custom_output: int32"); 2. 为Op实现

  • tensorflow 环境变量设置方式

    安装TensorFlow后,在Python中输入 import tensorflow as tf 时 提示一下类似错误 ImportError: libcusolver.so.*.0: cannot open shared object file: No such file or directory libcusolver.so..0 ( 代表某一版本) 解决办法: 1. 输入下面命令,查找libcusolver.so 相关文件的目录 locate libcusolver.so.9 2. 输入下

  • keras模型保存为tensorflow的二进制模型方式

    最近需要将使用keras训练的模型移植到手机上使用, 因此需要转换到tensorflow的二进制模型. 折腾一下午,终于找到一个合适的方法,废话不多说,直接上代码: # coding=utf-8 import sys from keras.models import load_model import tensorflow as tf import os import os.path as osp from keras import backend as K def freeze_session

  • tensorflow实现残差网络方式(mnist数据集)

    介绍 残差网络是何凯明大神的神作,效果非常好,深度可以达到1000层.但是,其实现起来并没有那末难,在这里以tensorflow作为框架,实现基于mnist数据集上的残差网络,当然只是比较浅层的. 如下图所示: 实线的Connection部分,表示通道相同,如上图的第一个粉色矩形和第三个粉色矩形,都是3x3x64的特征图,由于通道相同,所以采用计算方式为H(x)=F(x)+x 虚线的的Connection部分,表示通道不同,如上图的第一个绿色矩形和第三个绿色矩形,分别是3x3x64和3x3x12

  • Tensorflow中使用tfrecord方式读取数据的方法

    前言 本博客默认读者对神经网络与Tensorflow有一定了解,对其中的一些术语不再做具体解释.并且本博客主要以图片数据为例进行介绍,如有错误,敬请斧正. 使用Tensorflow训练神经网络时,我们可以用多种方式来读取自己的数据.如果数据集比较小,而且内存足够大,可以选择直接将所有数据读进内存,然后每次取一个batch的数据出来.如果数据较多,可以每次直接从硬盘中进行读取,不过这种方式的读取效率就比较低了.此篇博客就主要讲一下Tensorflow官方推荐的一种较为高效的数据读取方式--tfre

随机推荐