[原]使用tensorflow和梯度下降来求多元回归方程的系数

  以二元线性回归方程为例。我先设置了一个二元线性回归方程为y=-3.05x1+0.24x2-1.765来对该方法做一个验证。并随便弄了个数据如下:

  方法一:直接调用sklearn里的模型来进行求解,改方法求出的系数为原数据的系数。代码如下:

import numpy as np
from pandas import read_csv
from sklearn.linear_model import LinearRegression

data = read_csv('./data.csv',encoding='GBK')
#调用模型
lrModel = LinearRegression()
x_data=np.asarray(data[['x1','x2']])
y = data[['y']]
lrModel.fit(x_data,y)


#对回归模型进行检验
print('R2:',lrModel.score(x_data,y))
#查看参数
print('x1,x2:', lrModel.coef_)
#查看截距
print('b:',lrModel.intercept_)

#R2: 1.0
#x1,x2: [[-3.05  0.24]]
#b: [-1.765]

  方法二:使用梯度下降求解,使用tensorflow是因为它里面已经封装好梯度下降的方法,使用时直接调用就可以。代码如下:

import numpy as np
import tensorflow as tf
from pandas import read_csv

data = read_csv('./data.csv',encoding='GBK')
x_data=np.asarray(data[['x1','x2']])
#标准化X
x_data[:,0]=(x_data[:,0]-x_data[:,0].mean())/x_data[:,0].std()
x_data[:,1]=(x_data[:,1]-x_data[:,1].mean())/x_data[:,1].std()
y_data = np.asarray(data[['y']])
A = tf.Variable(tf.zeros(shape=[2, 1],dtype=tf.float64))
b = tf.Variable(tf.zeros(shape=[1, 1], dtype=tf.float64))

#定义模型
y = tf.add(tf.matmul(x_data, A), b)

#定义最小化误差平方根
loss=tf.reduce_mean(tf.square(y-y_data))*0.5
#learning_rate=0.5
optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.5)
#最优化最小值
train=optimizer.minimize(loss)
#初始化变量
init=tf.global_variables_initializer()

#启动graph
sess=tf.Session()
sess.run(init)

for step in range(50):
    sess.run(train)    
    print("step={},loss={}".format(step,sess.run(loss)))
    
w=sess.run(A)
x=np.asarray(data[['x1','x2']])

b=-x[:,0].mean()*w[0]/x[:,0].std()-x[:,1].mean()*w[1]/x[:,1].std()+sess.run(b)
w[0]=w[0]/x[:,0].std()
w[1]=w[1]/x[:,1].std()
print('w:',w)
print('b:',b)

  注意倒数的几行代码。因为X的值差距太大,所以在进入模型之前进行的标准化处理。这样模型直接得出的系数是标准化之后的系数,而根据以下公式可以将系数转换成原数据的系数:

  运行结果为:

  与我假设系数一致,可见该方法有效

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值