Python学习: tensorflow 解决矩阵线性回归问题

前提:使用编程环境为PythonIDE,系统为Windows10。

问题:输入变量为X为含有3特征的数据,例如X=[1,2,3],输出量同为3特征的数据,例如y=[4,5,6],关系为Y=AX,满足矩阵乘法,A为3*3矩阵。目标是应用TensorFlow求出A的参数。为方便起见,假设现有10个X的数据,则X=[]为3行10列矩阵,根据Y=AX,Y也为3行10列矩阵。

第一步:制造数据

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

  
#制造数据
x_data=10*np.random.random((3,10)).astype(np.float32)  #x为3行10列矩阵,数据类型为float32
A=np.matrix([[1,2,1],         
             [2,1,1],
             [1,1,3]])
  
y_data=A*x_data
#np.save('3dim_y_data',y_data)
#np.save('3dim_x_data',x_data)
x_data=np.load('3dim_x_data.npy')
y_data=np.load('3dim_y_data.npy').astype(np.float32)

print('x_data = :',x_data)
print('A = :',A)
print('y_data = :',y_data)

程序运行结果:

可以看到y_data与x_data满足y_data=A*x_data的关系。

第二步:搞。

Weights = tf.Variable(tf.random_uniform([3,3]))   #要训练的矩阵参数,初始为3*3随机矩阵

y=tf.matmul(Weights,x_data)
#y=Weights*x_data


loss = tf.reduce_mean(tf.square(y-y_data))   #与期望的差值
optimizer = tf.train.GradientDescentOptimizer(0.001) #优化器,
train = optimizer.minimize(loss)                  #减少误差

init = tf.global_variables_initializer()        #初始化变量important
## create tensorflow structure end#

sess = tf.Session()
sess.run(init)             #激活 important

for step in range(5001):
   sess.run(train)     
   if step%100==0:
     print('step = :',step,'loss = :',sess.run(loss))

w=sess.run(Weights)
print('we get A = :\n',w)

结果如下:

step = : 0 loss is : 242.11034
step = : 100 loss is : 3.4686103
step = : 200 loss is : 1.8073219
step = : 300 loss is : 1.0072047
step = : 400 loss is : 0.588069
step = : 500 loss is : 0.35357958
step = : 600 loss is : 0.21632071
step = : 700 loss is : 0.1336665
step = : 800 loss is : 0.08305356
step = : 900 loss is : 0.05176353
step = : 1000 loss is : 0.03231613
step = : 1100 loss is : 0.020193871
step = : 1200 loss is : 0.012625264
step = : 1300 loss is : 0.0078954445
step = : 1400 loss is : 0.0049382765
step = : 1500 loss is : 0.0030888512
step = : 1600 loss is : 0.0019322013
step = : 1700 loss is : 0.0012087018
step = : 1800 loss is : 0.00075607677
step = : 1900 loss is : 0.00047296527
step = : 2000 loss is : 0.00029587856
step = : 2100 loss is : 0.0001850925
step = : 2200 loss is : 0.00011579284
step = : 2300 loss is : 7.244545e-05
step = : 2400 loss is : 4.5319197e-05
step = : 2500 loss is : 2.8358334e-05
step = : 2600 loss is : 1.775048e-05
step = : 2700 loss is : 1.11127865e-05
step = : 2800 loss is : 6.9564417e-06
step = : 2900 loss is : 4.3645496e-06
step = : 3000 loss is : 2.7341548e-06
step = : 3100 loss is : 1.7189167e-06
step = : 3200 loss is : 1.0795205e-06
step = : 3300 loss is : 6.8306935e-07
step = : 3400 loss is : 4.3196005e-07
step = : 3500 loss is : 2.7391667e-07
step = : 3600 loss is : 1.7285602e-07
step = : 3700 loss is : 1.1208443e-07
step = : 3800 loss is : 6.8706385e-08
step = : 3900 loss is : 4.51934e-08
step = : 4000 loss is : 3.056169e-08
step = : 4100 loss is : 1.9121822e-08
step = : 4200 loss is : 1.0809405e-08
step = : 4300 loss is : 7.4446387e-09
step = : 4400 loss is : 7.010385e-09
step = : 4500 loss is : 7.010385e-09
step = : 4600 loss is : 7.010385e-09
step = : 4700 loss is : 7.010385e-09
step = : 4800 loss is : 7.010385e-09
step = : 4900 loss is : 7.010385e-09
step = : 5000 loss is : 7.010385e-09
we get A = :
 [[0.99998754 1.9999862  1.0000278 ]
 [1.9999815  0.99998957 1.0000292 ]
 [1.0000262  1.0000209  2.9999506 ]]

最后得到了训练得到的矩阵近似等于A。

要注意的是模型的建立要用y=tf.matmul(Weights,x_data)而不能使用y=Weights*x_data。否则会报错。y_data要特别控制type为float32,否则他的默认形式是float64,后面会格式报错。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

电的重量

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值