【发布时间】:2021-04-14 16:44:47
【问题描述】:
我正在尝试使用 TensorFlow 执行多元线性回归,并使用 statsmodels 库处理结果。
我生成了两个随机变量 X1 和 X2(以便任何人都可以重现它)来解释 Y 变量。 X2 变量对于这个回归完全没用,它只是一个大尺度的噪声,因此系数不会显着(p-val 接近 1)。
最后我应该得到一个基本上是的模型。 y_data = alpha + (0.25)x1 + (0.00)x2 + error.
我尝试将此code 调整为我随机生成的数据,但不幸的是,这根本不起作用。 这是我的尝试:
import numpy as np
from scipy.stats import norm
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.sandbox.regression.predstd import wls_prediction_std
import tensorflow as tf
from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.models import Model
from tensorflow.keras.optimizers import SGD
from tensorflow.keras import layers
from tensorflow.keras.layers.experimental import preprocessing
from tensorflow import keras
import datetime
#generating variables:
np.random.seed(1)
lin_x = np.arange(0,200,2)
y_data = np.true_divide(lin_x,4)
n = np.shape(lin_x)
##adding noise:
rand1 = norm.rvs(loc=0,scale=5,size=n)
np.random.seed(2)
rand2 = norm.rvs(loc=0,scale=1000,size=n)
x1 = np.add(lin_x,rand1)
x2 = rand2
#creating the X matrix: beta = (X'X)^-1(X'y):
x_data = np.column_stack((x1,x2))
#adding ones vector for the intercept:
x_data = sm.add_constant(x_data)
#MLR with statsmodels:
mod = sm.OLS(y_data,x_data)
LinReg = mod.fit()
print(LinReg.summary())
#MLR with tensorflow:
normalizer = preprocessing.Normalization()
normalizer.adapt(x_data)
normalized_data = normalizer(x_data)
print(normalized_data)
model = tf.keras.Sequential([
normalizer,
layers.Dense(units=1)
])
model.compile(loss = tf.losses.MeanSquaredError(),
optimizer = tf.keras.optimizers.SGD(
learning_rate=0.06, momentum=0.0, nesterov=True, name="SGD",
))
log_dir = "logs/fit/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1)
model.summary()
print('--------------')
weights = model.layers[0].get_weights()[0]
biases = model.layers[0].get_weights()[1]
print('--------------')
x_data_tf = tf.convert_to_tensor(x_data)
y_data_tf = tf.convert_to_tensor(y_data)
model.fit(y_data_tf,x_data_tf, epochs=1000, callbacks=[tensorboard_callback])
weights = model.layers[0].get_weights()[0]
biases = model.layers[0].get_weights()[1]
print("TensorFlow results: ")
print("weigths: ", weights)
print("biases: ", biases)
print(LinReg.summary())
如何获得与使用 TensorFlow 的 statsmodels 库获得的相同系数?谢谢
【问题讨论】:
标签: python tensorflow linear-regression