def _fit_parameters(feature_matrix, data_quantities, feature_tuple):
"""Solve Ax = b, where 'feature_matrix' is A and 'data_quantities' is b.
Parameters
----------
feature_matrix : ndarray
(M*N) regressor matrix.
data_quantities : ndarray
(M,) response vector
feature_tuple : (float
Polynomial coefficient corresponding to each column of 'feature_matrix'
Returns
-------
OrderedDict
{featured_tuple: fitted_parameter}. Maps 'feature_tuple'
to fitted parameter value. If a coefficient is not used, it maps to zero.
"""
# Now generate candidate models; add parameters one at a time
model_scores = []
results = np.zeros((len(feature_tuple), len(feature_tuple)))
clf = LinearRegression(fit_intercept=False, normalize=True)
for num_params in range(1, feature_matrix.shape[-1] + 1):
current_matrix = feature_matrix[:, :num_params]
clf.fit(current_matrix, data_quantities)
# This may not exactly be the correct form for the likelihood
# We're missing the "ridge" contribution here which could become relevant for sparse data
rss = np.square(np.dot(current_matrix, clf.coef_) - data_quantities.astype(np.float)).sum()
# Compute Aikaike Information Criterion
# Form valid under assumption all sample variances are equal and unknown
score = 2*num_params + current_matrix.shape[-2] * np.log(rss)
model_scores.append(score)
results[num_params - 1, :num_params] = clf.coef_
logging.debug('{} rss: {}, AIC: {}'.format(feature_tuple[:num_params], rss, score))
return OrderedDict(zip(feature_tuple, results[np.argmin(model_scores), :]))
评论列表
文章目录