一、实验大体步骤:
-
准备数据; -
构建回归模型; -
构建损失函数(损失用均方误差表示); -
优化损失(用梯度下降方法定义优化器); -
输出测试集准确率和预测值。
二、具体实现:
线性回归:w1x1+w2x2+w3x3+......+wnxn+bias(这是一个偏移量),我们采用的算法是:线性回归,策略是:均方误差,优化是:梯度下降API,
1.转准备好实验的数据:86个数据,每一个有一个特征值,所以形成一个[100,1]的列表。
2.建立一个模型,需要我们随机生成两个参数,一个是权重w一个是偏置b , y_predict = x * w + b,需要注意的是这个模型的参数必须要用变量来定义
3.求损失误差,我们求的是均方误差,公式是:((y1-y1')^2+(y2-y2')^2+.......+(y100-y100')^2)/86
4.接下来就是利用梯度下降来优化误差,这个梯度下降是tensorflow里边自己实现的,我们只需要指定一个学习率就行了
Tensorflow运算的API
三、代码实现:
def myLineregression01():
? ?# 1、数据准备
? ?MasterFile = pd.read_excel('C:\\Users\\Administrator\\Desktop\\线性回归实验\\Data01.xlsx')
? ?# 查看文件有多少行和列
? ?Master=MasterFile.loc[:,['Unnamed: 5','120KV 1250VA 2mm滤波','Unnamed: 9','Unnamed: 10','Unnamed: 11','Unnamed: 12']].values
? ?#删除掉第0和第1行,同时取0-80行做训练集
? ?y=np.delete(Master[:,0],[0,1],axis=0).reshape(86,1)
? ?x1, x2 = np.delete(Master[:,1],[0,1],axis=0).reshape(86,1),np.delete(Master[:,2],[0,1],axis=0).reshape(86,1)
? ?x3, x4 = np.delete(Master[:,3],[0,1],axis=0).reshape(86,1),np.delete(Master[:,4],[0,1],axis=0).reshape(86,1)
? ?x5 = np.delete(Master[:,5],[0,1],axis=0).reshape(86,1)
?
?
? ?y_true_train = tf.convert_to_tensor(y[range(0,80)], tf.float32, name='y_true_train')
? ?x1_train = tf.convert_to_tensor(x1[range(0,80)], tf.float32, name='x1_train')
? ?x2_train = tf.convert_to_tensor(x2[range(0,80)], tf.float32, name='x2_train')
? ?x3_train = tf.convert_to_tensor(x3[range(0,80)], tf.float32, name='x3_train')
? ?x4_train = tf.convert_to_tensor(x4[range(0,80)], tf.float32, name='x4_train')
? ?x5_train = tf.convert_to_tensor(x5[range(0,80)], tf.float32, name='x5_train')
?#删除掉第0和第1行,同时取81-86行做训练集
? ?y_true_test = tf.convert_to_tensor(y[range(81,86)], tf.float32, name='y_true_test')
? ?x1_test = tf.convert_to_tensor(x1[range(81,86)], tf.float32, name='x1_train')
? ?x2_test = tf.convert_to_tensor(x2[range(81,86)], tf.float32, name='x2_train')
? ?x3_test = tf.convert_to_tensor(x3[range(81,86)], tf.float32, name='x3_train')
? ?x4_test = tf.convert_to_tensor(x4[range(81,86)], tf.float32, name='x4_train')
? ?x5_test = tf.convert_to_tensor(x5[range(81,86)], tf.float32, name='x5_train')
?
?
? ?# 2.建立回归模型,1个特征值x 1个权重weight,一个偏置bias,组成:y = x*weight + bias,这里一定是变量
? ?# 随机给一个权重和偏置,让他接下来去计算误差函数,然后再去优化,但是前提是必须是变量才能优化
? ?weight_x1 = tf.Variable(tf.random.normal([1,1],mean=0.0,stddev=1.0),name='w1')#即使是一个数也要表示成矩阵,一行一列表示一个矩阵
? ?weight_x2 = tf.Variable(tf.random.normal([1,1],mean=0.0,stddev=1.0),name='w2')#即使是一个数也要表示成矩阵,一行一列表示一个矩阵
? ?weight_x3 = tf.Variable(tf.random.normal([1,1],mean=0.0,stddev=1.0),name='w3')#即使是一个数也要表示成矩阵,一行一列表示一个矩阵
? ?weight_x4 = tf.Variable(tf.random.normal([1,1],mean=0.0,stddev=1.0),name='w4')#即使是一个数也要表示成矩阵,一行一列表示一个矩阵
? ?weight_x5 = tf.Variable(tf.random.normal([1,1],mean=0.0,stddev=1.0),name='w5')#即使是一个数也要表示成矩阵,一行一列表示一个矩阵
? ?bias = tf.Variable(0.0,name='b')
? ?y_predict = tf.matmul(x1_train,weight_x1)+tf.matmul(x2_train,weight_x2)+\
? ? ? ? ? ? ? ?tf.matmul(x3_train,weight_x3)+tf.matmul(x4_train,weight_x4) + \
? ? ? ? ? ? ? ?tf.matmul(x5_train,weight_x5)+bias
?
? ?print(y_predict)
? ?
? ?# 3.建立损失函数
? ?loss = tf.reduce_mean(tf.square(y_true_train - y_predict), name='loss')
?
? ?# 4.梯度下降优化损失,learning_rate一般是在0~10,越小越好通常是,最大不要超过10,然后通过minimize()来优化误差函数loss
? ?tf.compat.v1.disable_eager_execution()
? ?train_op = tf.compat.v1.train.GradientDescentOptimizer(0.03).minimize(loss=loss)
?
? ?# 接下来就要通过会话来运行实现了,但在这之前需要初始化变量的op
? ?init_op = tf.global_variables_initializer()
?
? ?with tf.Session() as sess:
? ? ? ?# 初始化变量
? ? ? ?sess.run(init_op)
? ? ? ?# 打印最先初始化的权重个偏置
? ? ? ?print("最先初始化的权重:%f %f %f %f %f 和 偏置是:%f" % (weight_x1.eval(),weight_x2.eval(),weight_x3.eval(),
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? weight_x4.eval(), weight_x5.eval(),bias.eval()))
? ? ? ?# 运行优化,这只是训练一次的结果:
? ? ? ?# sess.run(train_op)
? ? ? ?# 循环训练,运行优化,优化
? ? ? ?# 1000次,越多越精确,越接近我们的假设值
? ? ? ?for i in range(6000):
? ? ? ? ? ?sess.run(train_op)
? ? ? ? ? ?# 打印优化后的权重和偏置
? ? ? ? ? ?print("loss:%f"%(loss.eval()))
? ? ? ? ? ?print("第%d次优化后的权重:%f %f %f %f %f 和 偏置是:%f" % (i, weight_x1.eval(),weight_x2.eval(),weight_x3.eval(),
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? weight_x4.eval(), weight_x5.eval(), bias.eval()))
?
?
? ? ? ?print("model weights:%f %f %f %f %f" % (weight_x1.eval(),weight_x2.eval(),weight_x3.eval(),weight_x4.eval(),weight_x5.eval()))
? ? ? ?print("model bias: %f" % (bias.eval()))
? ? ? ?y_predict_test=tf.matmul(x1_test,weight_x1)+tf.matmul(x2_test,weight_x2)+\
? ? ? ? ? ? ? ?tf.matmul(x3_test,weight_x3)+tf.matmul(x4_test,weight_x4) + \
? ? ? ? ? ? ? ?tf.matmul(x5_test,weight_x5)+bias
? ? ? ?print(y_predict_test)
? ? ? ?loss_test = tf.sqrt(tf.reduce_mean(tf.square(y_predict_test - y_true_test)))
? ? ? ?sess.run(loss_test)
? ? ? ?print("loss: \n", loss_test.eval())
? ? ? ?print("对测试集的真实值y_true_test: \n", y_true_test.eval().tolist())
? ? ? ?print("对测试集的预测值y_test_predict: \n", y_predict_test.eval().tolist())
?
?
四、实验结果:
?
|