我正在从事作业任务,该任务旨在比较自我实现的岭回归与ADMM与sklearn软件包的内置功能。尽管我自己的实现可能会很麻烦,但我仍然坚持解释内置函数的输出。
我正在Windows上使用3.7版本的Python。我的目的是预测模型Y = X * Beta + Epsilon中的Y值, 其中Y是包含100个变量的向量,X是矩阵,尺寸为100x2000,样本来自具有设置协方差矩阵的多元正态分布,Beta是向量,其设置值为2000个位置中的5,10或100 在这一点上,我已经尝试过将sklearn.linear_model.Ridge的可传递参数与某些“更简单”的数据进行合理的组合,以进行验证,但无济于事。任何帮助将被申请。
# Function generating problem data:
def generate_task(n,p,cov_rho,b_val,b_k,op=0):
" Tutaj generujemy macierz X z rozkladu normalnego o zadanych parametrach"
mean=np.zeros(p)
" Wersja IID"
if op==0:
cov=np.eye(p)
" Wersja: malejące correlacje"
if op==1:
cov=np.fromfunction(lambda i,j:cov_rho**np.abs(i-j),(p,p));
" Wersja: stale correlacje"
if op==2:
cov=np.eye(p)+cov_rho-np.eye(p)*(cov_rho-1)
Chol=np.linalg.cholesky(cov)
X=np.random.normal(0,1,(n,p))
X=X.dot(Chol)
X=normalise(X)
B=(n,p+1)
B=np.ones(B)
B[:,1:] = X
X=B
" Czesc odpowiedzialna za Beta"
Beta=np.zeros(p+1)
m=np.arange(p+1)
np.random.shuffle(m)
Beta[m[1:b_k]]=b_val
Beta=Beta.reshape(-1,1)
" Na koncu generujemy Y zaburzone o epsilon~N(0,1)"
ep=np.random.multivariate_normal(np.zeros(n), np.eye(n), 1)
#Y=X.dot(Beta)
Y=X.dot(Beta)+ep.T
return Y,X,Beta,ep.T
Y,X,Beta,ep=generate_task(p,n,0.6,2,10)
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.33)
clr = Ridge(alpha=0.1, fit_intercept=False, normalize=False, copy_X=True, max_iter=None, tol=0.001, solver='auto')
Y_tr=Y_train.ravel()
Y_te=Y_test.ravel()
clr.fit(X_train,Y_tr)
plt.plot(Y_te, label='Original')
plt.plot(clr.predict(X_test), label = 'Estimate')
这将导致: https://i.imgur.com/4n5okPo.png 与我自己的功能相比: https://i.imgur.com/cieCcFu.png 我觉得这不太可能,尤其是当所述内置函数针对不同任务返回几乎相同的结果时。 编辑:出现的情况下,本示例使用IID矩阵,但问题与相应情况相同。