Python numpy中矩阵乘法的结合性

Python numpy中矩阵乘法的结合性,python,numpy,linear-algebra,Python,Numpy,Linear Algebra,我正在玩一个简单的numpy示例,很难理解为什么矩阵乘法的关联性 ABC = (AB)C = A(BC) 不完全成立。我认为问题在于数值稳定性。但如何解决呢?到底是什么问题 这是我的线性回归例子。我使用sklearn解决方案,因为它在关联分组之间提供了更多差异: import numpy as np np.random.seed(42) num_samples = 100 M = 1000 sigma = 0.5 X = np.random.binomial(2, 0.4, (num_sa

我正在玩一个简单的numpy示例,很难理解为什么矩阵乘法的关联性

ABC = (AB)C = A(BC)
不完全成立。我认为问题在于数值稳定性。但如何解决呢?到底是什么问题

这是我的线性回归例子。我使用sklearn解决方案,因为它在关联分组之间提供了更多差异:

import numpy as np
np.random.seed(42)
num_samples = 100
M = 1000
sigma = 0.5


X = np.random.binomial(2, 0.4, (num_samples, M))

beta = np.zeros(M)
beta[5] = 1.0

y = X.dot(beta) + sigma*np.random.randn(num_samples)
"standardise y"
y = y - np.mean(y)
y = y/np.std(y)

"center and standardise X"
Xc = X - X.mean(axis=0)
xstd = X.std(axis=0)
mask = xstd > 1e-12
Xc = Xc[:, mask]

from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(Xc ,y)
beta_hat_sklearn = lr.coef_


beta_hat_sklearn.T @ Xc.T @ Xc @ beta_hat_sklearn / num_samples
"equivalent < Python3.5"
beta_hat_sklearn.T.dot(Xc.T).dot(Xc).dot(beta_hat_sklearn) / num_samples
# 1.0000000000000009

beta_hat_sklearn.T @ (Xc.T @ Xc) @ beta_hat_sklearn / num_samples
"equivalent < Python3.5"
beta_hat_sklearn.T.dot(Xc.T.dot( Xc )).dot(beta_hat_sklearn )/ num_samples
# 0.89517439485479278
将numpy导入为np
np.随机种子(42)
样本数=100
M=1000
西格玛=0.5
X=np.随机二项(2,0.4,(样本数,M))
β=np.零(M)
β[5]=1.0
y=X.dot(β)+sigma*np.random.randn(num_样本)
“标准化y”
y=y-np.平均值(y)
y=y/np.标准(y)
“居中并标准化X”
Xc=X-X.平均值(轴=0)
xstd=X.std(轴=0)
掩码=xstd>1e-12
Xc=Xc[:,掩码]
从sklearn.linear\u模型导入线性回归
lr=线性回归()
lr.配合(Xc,y)
beta_hat_sklearn=lr.coef_
beta_hat_sklearn.T@Xc.T@Xc@beta_hat_sklearn/num_示例
“等效<蟒蛇3.5”
beta_hat_sklearn.T.dot(Xc.T).dot(Xc).dot(beta_hat_sklearn)/num_示例
# 1.0000000000000009
beta_hat_sklearn.T@(Xc.T@Xc)@beta_hat_sklearn/num_示例
“等效<蟒蛇3.5”
beta_hat_sklearn.T.dot(Xc.T.dot(Xc)).dot(beta_hat_sklearn)/num_样本
# 0.89517439485479278
更新
这可能是MacOSX特有的bug

通常,我只想说不要依赖数学上等价的表达式来产生完全相同的结果,但10%的差异要比正常情况高出很多。当我使用Python 3.5和numpy 1.11.2运行此程序时,这些值要么是
1.0000000000000007
要么是
1.0000000000000002
@WarrenWeckesser:我有完全相同的版本;MacOSX 10.10.5;虽然在CentOS上使用Python3.4和相同的numpy结果非常接近:
1.0000000000000027,1.0000000000000029
64位Ubuntu 16.04运行的我的电脑产生1.0(准确地说)和1+2.22e-16