atk*_*t12 5 python numpy linear-regression scikit-learn tensorflow
我正在研究 Aurelien Geron 的“Hands-On Machine Learning”一书中的 Tensorflow 示例。但是,我无法在此支持笔记本中复制简单的线性回归示例。为什么 Tensorflow 与 Numpy/SciKit-Learn 结果不匹配?
据我所知,没有优化(我们使用的是正规方程,所以它只是矩阵计算),而且答案似乎太不同了,不可能是精度误差。
import numpy as np
import tensorflow as tf
from sklearn.datasets import fetch_california_housing
housing = fetch_california_housing()
m, n = housing.data.shape
housing_data_plus_bias = np.c_[np.ones((m, 1)), housing.data]
X = tf.constant(housing_data_plus_bias, dtype=tf.float32, name="X")
y = tf.constant(housing.target.reshape(-1, 1), dtype=tf.float32, name="y")
XT = tf.transpose(X)
theta = tf.matmul(tf.matmul(tf.matrix_inverse(tf.matmul(XT, X)), XT), y)
with tf.Session() as sess:
theta_value = theta.eval()
theta_value
Run Code Online (Sandbox Code Playgroud)
回答:
array([[ -3.74651413e+01],
[ 4.35734153e-01],
[ 9.33829229e-03],
[ -1.06622010e-01],
[ 6.44106984e-01],
[ -4.25131839e-06],
[ -3.77322501e-03],
[ -4.26648885e-01],
[ -4.40514028e-01]], dtype=float32)
Run Code Online (Sandbox Code Playgroud)
###### 与纯 NumPy 比较
X = housing_data_plus_bias
y = housing.target.reshape(-1, 1)
theta_numpy = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)
print(theta_numpy)
Run Code Online (Sandbox Code Playgroud)
回答:
[[ -3.69419202e+01]
[ 4.36693293e-01]
[ 9.43577803e-03]
[ -1.07322041e-01]
[ 6.45065694e-01]
[ -3.97638942e-06]
[ -3.78654265e-03]
[ -4.21314378e-01]
[ -4.34513755e-01]]
Run Code Online (Sandbox Code Playgroud)
###### 与 Scikit-Learn 比较
from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit(housing.data, housing.target.reshape(-1, 1))
print(np.r_[lin_reg.intercept_.reshape(-1, 1), lin_reg.coef_.T])
Run Code Online (Sandbox Code Playgroud)
回答:
[[ -3.69419202e+01]
[ 4.36693293e-01]
[ 9.43577803e-03]
[ -1.07322041e-01]
[ 6.45065694e-01]
[ -3.97638942e-06]
[ -3.78654265e-03]
[ -4.21314378e-01]
[ -4.34513755e-01]]
Run Code Online (Sandbox Code Playgroud)
更新:我的问题听起来与此类似,但遵循建议并没有解决问题。
我只是比较结果tensorflow和numpy。由于您使用了dtype=tf.float32and X,y我将使用如下示例np.float32:numpy
X_numpy = housing_data_plus_bias.astype(np.float32)
y_numpy = housing.target.reshape(-1, 1).astype(np.float32)
Run Code Online (Sandbox Code Playgroud)
tf.matmul(XT, X)现在我们尝试通过( tensorflow) 和X.T.dot(X)( )来比较结果numpy:
with tf.Session() as sess:
XTX_value = tf.matmul(XT, X).eval()
XTX_numpy = X_numpy.T.dot(X_numpy)
np.allclose(XTX_value, XTX_numpy, rtol=1e-06) # True
np.allclose(XTX_value, XTX_numpy, rtol=1e-07) # False
Run Code Online (Sandbox Code Playgroud)
float所以这就是的精度问题。如果将精度更改为tf.float64和np.float64,则将得到相同的结果theta。
| 归档时间: |
|
| 查看次数: |
549 次 |
| 最近记录: |