1. 原理
线性回归是一个大范围,我们通常所说的线性回归在scikit-learn中,以其实现原理命名称为original least squares,即普通最小二乘法。原理很简单,即用最小二乘法求得线性方程的系数(coef)和截距(intercept)。
这是目标方程,两个未知参数Wi和W0,分别就是系数和截距
最小二乘法表达式,即让真实值和预测值差值的平方最小,此时的系数和截距即为所求的值。
将上式对w求导,并让导数等于0,以求出结果
2. scikit-learn中的用法
引入linear_model这个module,里面的LinearRegression类中fit方法返回LinearRegression本身这个对象。LiinearRegression这个类有两个属性,coef_和intercept_,分别是要求的系数和截距。
3. 源代码
def fit(self, X, y, sample_weight=None):
#三个输入参数,分别是训练集,结果集和权重,默认不采用权重
#n_jobs表明使用几个处理器来处理
n_jobs_ = self.n_jobs
#check_X_y函数用来检查训练集和结果集是否符合标准,并进行标准化处理
X, y = check_X_y(X, y, accept_sparse=['csr', 'csc', 'coo'],
y_numeric=True, multi_output=True)
#根据权重对数据集进行处理
if sample_weight is not None and np.atleast_1d(sample_weight).ndim > 1:
raise ValueError("Sample weights must be 1D array or scalar")
X, y, X_offset, y_offset, X_scale = self._preprocess_data(
X, y, fit_intercept=self.fit_intercept, normalize=self.normalize,
copy=self.copy_X, sample_weight=sample_weight)
if sample_weight is not None:
# Sample weight can be implemented via a simple rescaling.
X, y = _rescale_data(X, y, sample_weight)
#对稀疏矩阵的处理
if sp.issparse(X):
if y.ndim < 2:
#最小二乘法的计算函数sparse_lsqr,此函数在/scikit-learn/sklearn/utils/fixes.py里定义,如下
#if sp_version < (0, 15):
# Backport fix for scikit-learn/scikit-learn#2986 / scipy/scipy#4142
# from ._scipy_sparse_lsqr_backport import lsqr as sparse_lsqr
#else:
# from scipy.sparse.linalg import lsqr as sparse_lsqr # noqa
out = sparse_lsqr(X, y)
self.coef_ = out[0]
self._residues = out[3]
else:
# sparse_lstsq cannot handle y with shape (M, K)
outs = Parallel(n_jobs=n_jobs_)(
delayed(sparse_lsqr)(X, y[:, j].ravel())
for j in range(y.shape[1]))
self.coef_ = np.vstack(out[0] for out in outs)
self._residues = np.vstack(out[3] for out in outs)
else:
self.coef_, self._residues, self.rank_, self.singular_ = \
linalg.lstsq(X, y)
self.coef_ = self.coef_.T
#设置好coef_和intercept_
if y.ndim == 1:
self.coef_ = np.ravel(self.coef_)
self._set_intercept(X_offset, y_offset, X_scale)
return self
文件在/scikit-learn/sklearn/linear_model/base.py目录下,起名叫base,表明它是线性模型里面最最基础的一个模型了。