scikit-learn线性回归源码

1. 原理

线性回归是一个大范围,我们通常所说的线性回归在scikit-learn中,以其实现原理命名称为original least squares,即普通最小二乘法。原理很简单,即用最小二乘法求得线性方程的系数(coef)和截距(intercept)。

\hat{y}(w, x) = w_0 + w_1 x_1 + ... + w_p x_p

这是目标方程,两个未知参数Wi和W0,分别就是系数和截距

\underset{w}{min\,} {|| X w - y||_2}^2

最小二乘法表达式,即让真实值和预测值差值的平方最小,此时的系数和截距即为所求的值。

将上式对w求导,并让导数等于0,以求出结果


2. scikit-learn中的用法

>>> from sklearn import linear_model
>>> reg = linear_model.LinearRegression()
>>> reg.fit ([[0, 0], [1, 1], [2, 2]], [0, 1, 2])
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
>>> reg.coef_
array([ 0.5,  0.5])
引入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,表明它是线性模型里面最最基础的一个模型了。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值