精华内容
下载资源
问答
  • 线性系统中基于多重特征函数的滤波器设计
  • 其中在推导多元线性回归使用最小二乘法的求解原理时,对损失函数求导得到参数向量 的方程式上式中有解,即能够得到最后一步的前提条件是存在逆矩阵,而逆矩阵存在的充分必要条件是特征矩阵不存在多重线性。...

    上篇文章《简单而强大的线性回归详解》(点击跳转)详细介绍了线性回归分析方程、损失方程及求解、模型评估指标等内容,其中在推导多元线性回归使用最小二乘法的求解原理时,对损失函数求导得到参数向量 的方程式

    上式中有解,即能够得到最后一步的前提条件是存在逆矩阵,而逆矩阵存在的充分必要条件是特征矩阵不存在多重共线性。

    本文将详细介绍线性回归中多重共线性问题,以及一种线性回归的缩减(shrinkage)方法 ----岭回归(Ridge Regression),并对其进行了Python实现

    多重共线性

    多重共线性是指线性回归模型中的解释变量之间由于存在精确相关关系或高度相关关系而使模型估计失真或难以估计准确。

    从线性等式理解,对于  个变量,如果存在常数 使得如下公式,可近似表示为

    那么通常称这 个变量存在多重共线性。

    下面从特征矩阵的角度出发,深入探究多重共线性将究竟如何影响对损失函数求解,以便深刻理解改进原理。

    逆矩阵存在的充要条件

    逆矩阵计算公式

    其中 是伴随矩阵,其存在没有限制条件,当然也不会影响逆矩阵的存在性。而矩阵的行列式 存在于分母上,其值不能为零。由此得到,逆矩阵存在的充分必要条件是:矩阵的行列式不能为0。

    存在逆矩阵的充要条件为 不能为0。这是使用最小二乘法来求解线性回归的核心条件之一。

    行列式与矩阵

    矩阵(matrix)是一组数按照一定方式排列的数表,它不能从整体上被看成一个数(只有一个数的1阶矩阵除外),记为

    在线性代数中,行列式(determinant)是一个函数,它将每个 矩阵 对应到一个纯量(scalar),简单讲即是行列式是这一组数按照某种运算法则计算出的一个数,记为

    行列式不为零的充要条件

    假设特征矩阵 的结构为,则

    一般行列式计算不会通过展开的方式,而是通过行列初等行变换/列变换将其整合成一个梯形的行列式

    由于梯形行列式下半部分为0,整个矩阵的行列式其实就是梯形行列式对角线上的元素相乘。

    由此可见,如果对角线上的任一个元素为0,则行列式结果即为0。反之,如果对角线上的任一元素均不为0,则行列式不为0。

    矩阵满秩是矩阵的行列式不为0的充分必要条件。

    满秩矩阵

    一个结构为 的矩阵 ,若 转换为梯形矩阵后,没有任何全为0的行或者全为0的列,则称 满秩矩阵。简单来说,只要对角线上没有一个元素为0,则这个矩阵中绝对不可能存在全为0的行或列。

    矩阵满秩的充要条件

    精确相关关系

    即完全相关,矩阵两行之间或两列之间存在完全线性关系,这种精确相关关系会使得矩阵的行列式为0,则矩阵的逆矩阵不存在。在最小二乘法中,如果矩阵 中存在这种精确相关关系,则逆矩阵不存在,线性回归无法使用最小二乘法求出结果

    无解

    即当 则会发生除零错误 。

    高度相关关系

    即不完全相关,这种高度相关关系下,矩阵的行列式不为0,但是一个非常接近0的数,矩阵的逆是存在的,但接近无限大,直接影响参数向量求解。

    这种情况下,结果参数向量 无穷大,直接影响模型结果,造成模型偏差大或不可用。

    精确相关关系和高度相关关系并称"多重共线性"。

    矩阵行与行或列于列之间相互独立,其矩阵的行列式经初等变换后的对角线上没有任何元素特别接近于0,因此矩阵求得的参数向量不会对模型产生影响,对拟合结果也是较理想的。

    正常值

    由此可见,一个矩阵如果要满秩,则要求矩阵中每个向量之间不能存在多重共线性,这也构成了线性回归算法对于特征矩阵的要求。

    多重共线性与相关性

    多重共线性(Multicollinearity)是一种统计现象,是指线性模型中的特征(解释变量)之间由于存在精确相关关系或高度相关关系, 多重共线性的存在会使模型无法建立,或者估计失真。多重共线性使用指标方差膨胀因子(variance inflation factor,VIF)来进行衡量(from statsmodels.stats.outliers_influence import variance_inflation_factor), 通常当我们提到"共线性",都特指多重共线性。

    相关性(Correlation)是衡量两个或多个变量一起波动的程度的指标,它可以是正的,负的或者0。一般而言,变量之间具有相关性,通常是指线性相关性,线性相关一般由皮尔逊相关系数进行衡量,非线性相关可以使用斯皮尔曼相关系数或者互信息法进行衡量。此部分可参见数据探索分析(点击跳转)

    多重共线性对回归模型的影响

    回归系数的估计值方差变大,回归系数的置信度变宽,估计的精确性大幅度降低,使得估计值稳定性变差。

    会使得一些回归系数通不过显著性检验,回归系数的正负号也可能出现倒置,使得回归方程无法得到合理的解释,直接影响最小二乘法的计算结果。

    多重共线性如果存在,则线性回归就无法使用最小二乘法来进行求解,或者求解就会出现偏差。不能存在多重共线性,不代表不能存在相关性——机器学习不要求特征之间必须独立,必须不相关,只要不是高度相关或者精确相关就好。

    改进线性回归处理多重共线性

    处理多重共线性方法有多种,其中最直接的方法是手动移除共线性的变量。具体做法是先对数据进行相关分析,若两个特征的相关系数大于某特定值(一般为0.7),则手动移除其中一个特征,再继续做回归分析。这种做法会导致估计结果产生偏差,会引起遗漏变量问题。而且有时数据特征本来就很少,或并不想直接删除特征,此时可考虑其他更加有效的方法。

    改进线性回归即是当前解决多重共线性问题的最有效的方法。

    岭回归

    岭回归分析(Ridge Regression)是一种改良的最小二乘法,其通过放弃最小二乘法的无偏性,以损失部分信息为代价来寻找效果稍差但回归系数更符合实际情况的模型方程。该模型求解的回归模型的损失函数为线性最小二乘函数,正则化采用l2-范数。也称为岭回归(Ridge Regression)或吉洪诺夫正则化(Tikhonov regularization)。岭回归与套索回归(Lasso Regression)两个算法不是为了提升模型表现,而是为了修复漏洞而设计的。(Lasso回归将在下一篇章介绍)

    岭回归原理和逻辑是将求解 的过程转化为一个带条件的最优化问题,然后再用最小二乘法求解。岭回归在多元线性回归的损失函数上加上了正则项,表达为系数 L2-范式(即系数 的平方项)乘以正则化系数

    最小化目标函数:

    假设我们的特征矩阵结构为(m,n),系数 的结构是(1,n) 是构为(n,n)单位矩阵则

    最终得到

    从而转化为只需 存在逆矩阵,就能求解出参数向量

    假设原本的特征矩阵存在共线性,即非满秩矩阵

    最后得到的这个行列式还是一个梯形行列式,但已经不存在全0行或者全0列了,除非以下两种情况,否则矩阵永远都是满秩。

    (1) 

    (2) 原本的矩阵存在对角线上元素为 ,且其他元素都为0的行或者列

    以上两种情况,在sklearn中都可以轻松应对:自由控制 ;当出现无法求解时,更换 取值即可。则可认为 是存在的

    其中

    通过调整正则化系数 大小,来避免"精确相关关系"及"高度相关关系"带来的影响。如此,多重共线性就被控制住了:最小二乘法一定有解,并且这个解可以通过 来进行调节,以确保不会偏离太多。当然了, 挤占了 中由原始的特征矩阵贡献的空间,因此 如果太大,也会导致的估计出现较大的偏移,无法正确拟合数据的真实面貌。我们在使用中,需要找出 让模型效果变好的最佳取值。

    语法:
    sklearn.linear_model.Ridge(alpha=1.0, fit_intercept=True, normalize=False, copy_X=True, max_iter=None, tol=0.001, solver=’auto’, random_state=None)
    重要参数:

    alpha : {float, ndarray of shape (n_targets,)}, default=1.0

    正则化参数,必须是正浮点数。正则化改善了问题的条件,降低了估计的方差。值越大表示正则化惩罚越强。对应于其它线性模型中的 C−1,如LogisticRegression或LinearSVC。如果传递了数组,则惩罚特定目标。

    例:
    >>> from sklearn.linear_model import Ridge
    >>> import numpy as np
    >>> n_samples, n_features = 105
    >>> rng = np.random.RandomState(0)
    >>> y = rng.randn(n_samples)
    >>> X = rng.randn(n_samples, n_features)
    >>> clf = Ridge(alpha=1.0)
    >>> clf.fit(X, y)
    Ridge()

    虽然岭回归和Lasso不是设计来提升模型表现,而是专注于解决多重共线性问题的,但当 在一定范围内变动的时候,消除多重共线性也许能够一定程度上提高模型的泛化能力。

    案例

    波士顿房价数据集中看回归处理多重共线性。

    from sklearn.datasets import load_boston
    from sklearn.model_selection import cross_val_score
    import matplotlib.pyplot as plt
    from sklearn.linear_model import Ridge
    import numpy as np
    from sklearn.linear_model import LinearRegression # 线性回归模型
    from sklearn.model_selection import train_test_split# 交叉验证
    X = load_boston().data
    y = load_boston().target
    Xtrain, Xtest, Ytrain, Ytest = train_test_split(X, y, test_size=0.3,random_state=420)
    #先查看方差的变化,再看R2的变化
    alpha_range = np.arange(1,1001,100)
    ridge_var, lr_var, ridge_mean, lr_mean = [], [], [], []
    plt.figure(figsize=(16,10))
    plt.style.use('seaborn')
    for alpha in alpha_range:
        ridge = Ridge(alpha=alpha)
        linear = LinearRegression()
        score_rig = cross_val_score(ridge,X,y,cv=5,scoring="r2")
        score_linear = cross_val_score(linear,X,y,cv=5,scoring="r2")
        ridge_var.append(score_rig.var())
        lr_var.append(score_linear.var())
        ridge_mean.append(score_rig.mean())
        lr_mean.append(score_linear.mean())
    name = ['variance''mean']
    for i,j in enumerate([[ridge_var, lr_var], [ridge_mean, lr_mean]]):
        plt.subplot(2,2,i+1)
        plt.plot(alpha_range,j[0],color="green",label="Ridge")
        plt.plot(alpha_range,j[1],color="blue",label="LR")
        plt.title(f"cross_val_score {name[i]} for different alpha values")
        plt.xlabel("alpha")
        plt.ylabel(f"{name[i]}")
        plt.legend()
    #细化学习曲线
    alpha_range = np.arange(100,300,10)
    ridge_score, lr_score = [], []
    for alpha in alpha_range:
        reg = Ridge(alpha=alpha)
        linear = LinearRegression()
        regs = cross_val_score(reg,X,y,cv=5,scoring = "r2").mean()
        linears = cross_val_score(linear,X,y,cv=5,scoring = "r2").mean()
        ridge_score.append(regs)
        lr_score.append(linears)
    for i,j in enumerate([[ridge_score,"Ridge""green"], [lr_score, "LR"'blue']]):
        plt.subplot(2,2,i+3)
        plt.plot(alpha_range,j[0],color=j[2],label=j[1])
        plt.title("cross_val_score mean for different alpha values")
        plt.xlabel("alpha")
        plt.ylabel("Mean")
        plt.legend()
    plt.suptitle("cross_val_score of the LR and Ridge for different alpha values", y=0.95, fontsize=18)
    plt.show()  
    输出结果

    b1604df4e15addd73b733157f56091f0.png

    可以发现,比起加利佛尼亚房屋价值数据集,波士顿房价数据集的方差降低明显,偏差也降低明显,可见使用岭回归还是起到了一定的作用,模型的泛化能力是有可能会上升的。

    选择最佳正则化系数

    使用交叉验证类 RidgeCV 来选择最佳的正则化系数。

    sklearn.linear_model.RidgeCV(alphas=(0.11.010.0), fit_intercept=True, normalize=False, scoring=None, cv=None, gcv_mode=None, store_cv_values=False)
    重要参数

    alphas : numpy array of shape [n_alphas]

    需要测试的正则化参数的取值的元祖

    scoring : string, callable or None, optional, default: None

    用来进行交叉验证的模型评估指标,默认是,可自行调整

    store_cv_values : boolean, default=False

    是否保存每次交叉验证的结果,默认False

    cv : int, cross-validation generator or an iterable, optional

    交叉验证的模式,默认是None,表示默认进行留一交叉验证可以输入Kfold对象和StratifiedKFold对象来进行交叉验证 注意,仅仅当为None时,每次交叉验证的结果才可以被保存下来当cv有值存在(不是None)时,store_cv_values无法被设定为True

    重要属性

    alpha_ : float

    查看交叉验证选中的alpha

    cv_values_ : array, shape = [n_samples, n_alphas] or shape = [n_samples, n_targets, n_alphas], optional

    调用所有交叉验证的结果,只有当 store_cv_values=True 的时候才能够调用,因此返回的结构是 (n_samples, n_alphas)

    重要接口

    score

    调用Ridge类不进行交叉验证的情况下返回的

    >>> import numpy as np
    >>> from sklearn import linear_model
    >>> reg = linear_model.RidgeCV(alphas=np.logspace(-6613))
    >>> reg.fit([[00], [00], [11]], [0.11])
    RidgeCV(alphas=array([1.e-061.e-051.e-041.e-031.e-021.e-011.e+001.e+01,
          1.e+021.e+031.e+041.e+051.e+06]))
    >>> reg.alpha_
    0.01

    另一种方式是使用岭迹图来判断正则项参数的最佳取值,了解即可,实际工作中不建议使用。

    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn import linear_model
    #创造10*10的希尔伯特矩阵
    X = 1. / (np.arange(111) + np.arange(010)[:, np.newaxis])
    y = np.ones(10)
    #计算横坐标
    n_alphas = 200
    alphas = np.logspace(-10-2, n_alphas)
    #建模,获取每一个正则化取值下的系数组合
    coefs = []
    for a in alphas:
        ridge = linear_model.Ridge(alpha=a, fit_intercept=False)
        ridge.fit(X, y)
        coefs.append(ridge.coef_)
    #绘图展示结果
    ax = plt.gca()
    ax.plot(alphas, coefs)
    ax.set_xscale('log')
    ax.set_xlim(ax.get_xlim()[::-1])  #将横坐标逆转
    plt.xlabel('正则化参数alpha')
    plt.ylabel('系数w')
    plt.title('岭回归下的岭迹图')
    plt.axis('tight')
    plt.show()

    b83b3e6cb0bf1593dddc2c1081df8641.png

    岭迹图

    以正则化参数即岭参数 为横坐标,线性模型求解的系数即岭系数 为纵坐标的图像,其中每一条彩色的线都是一个岭系数 。其目标是建立岭参数 与岭系数 之间的直接关系,以此来观察岭参数的变化如何影响了岭系数 的拟合。

    岭迹图认为,线条交叉越多,则说明特征之间的多重共线性越高。我们应该选择系数较为平稳的喇叭口所对应的 取值作为最佳的正则化参数的取值。不存在奇异性时,岭迹图应稳定的逐渐趋向于0。

    希伯尔特矩阵

    岭回归分析是一种用于存在多重共线性(自变量高度相关)数据的技术。在线性回归基础上增加L2正则化项 。

    除常数项以外,这种回归的假设与最小二乘回归类似;它收缩了相关系数的值,但没有达到零,这表明它没有特征选择功能,这是一个正则化方法,并且使用的是L2正则化。

    转载请联系笔者

    点赞关注转发在看支持笔者,关注持续获取最新数据分析相关干货。

    展开全文
  • Content线性回归的多重线性1. 前提2. 由损失函数推导ω(基于最小二乘法OLS)3. 上述计算结果不成立3.1 多重线性的机器学习解释3.2 多重线性的解决4. Ridge & Lasso4.1 Ridge4.2 Lasso 线性回归的多重线性...

    线性回归的多重共线性

    1. 前提

    1. 线性回归的矩阵表示
      y = XT × ω y\ =\ X^{T}\ \times \ \omega
      假如有m个训练样本,则
      在这里插入图片描述
    2. 损失函数的定义
      在此,我们使用最常用的损失函数SSE(平方误差)来定义线性回归的损失函数
      在这里插入图片描述
      用矩阵表示:
      SSE=(yXω)T(yXω) SSE=\left( y-X\omega \right)^{T} \left( y-X\omega \right)

    2. 由损失函数推导ω(基于最小二乘法OLS)

    根据损失函数的定义,我们在线性回归中是想让损失函数越小越好,因此我们需要用极限(求导)的方式使得损失函数取到最小值。
    Lloss=SSE=(yXω)T(yXω) L_{loss} = SSE =\left(y-X\omega \right)^{T}\left(y-X\omega \right)
    dLlossdω0 \frac{\mathrm{d} L_{loss}}{\mathrm{d} \omega} \rightarrow 0
    推导过程:
    在这里插入图片描述
    令其为0:
    在这里插入图片描述
    (XTX)1\left( X^{T}X\right)^{-1} 可逆的条件下
    ω=(XTX)1XTy \omega = \left( X^{T}X\right)^{-1} X^{T}y

    3. 上述计算结果不成立

    我们知道,当特征矩阵满足多重共线性的前提下,矩阵是不可逆的,此时无法用OLS来求解ω

    逆矩阵存在的条件

    3.1 多重共线性的机器学习解释

    从机器学习的角度来看,多重共线性是指线性模型中的特征(解释变量)之间由于存在精确相关关系或高度相关关系,多重共线性的存在会使模型无法建立,或者估计失真性。

    而在现实中特征之间完全独立的情况其实非常少,因为大部分数据统计手段或者收集者并不考虑统计学或者机器学习建模时的需求,现实数据总都会存在一些相关性,极端情况下,甚至还可能出现收集的特征数量比样本数量多的情况。通常来说,这些相关性在机器学习中通常无伤大雅(在统计学中他们可能是比较严重的问题),即便有一些偏差,只要最小二乘法能够求解,我们都有可能会无视掉它。毕竟,想要消除特征的相关性,无论使用怎样的手段,都无法避免进行特征选择,这意味着可用的信息变得更加少,对于机器学习来说,很有可能尽量排除相关性后,模型的整体效果会受到巨大的打击。这种情况下,我们选择不处理相关性,只要结果好,我们就尽量无视这个问题。

    然而多重共线性就不是这样一回事了,它的存在会造成模型极大地偏移,无法模拟数据的全貌,因此这是必须解决的问题。

    3.2 多重共线性的解决

    统计学先验思想 逐步向前回归 改进的线性回归
    在开始建模之前先对数据进行各种相关性检验,如果存在多重共线性则可考虑对数据的特征进行删减筛查,或者使用降维算法对其进行处理,最终获得一个完全不存在相关性的数据集 逐步归回能够筛选对标签解释力度最强的特征,同时对于存在相关性的特征们加上⼀个惩罚项,削弱其对标签的贡献,以绕过最小二乘法对共线性较为敏感的缺陷 在原有的线性回归算法基础上进行修改,使其能够容忍特征列存在多重共线性的情况,并且能够顺利建模,且尽可能的保证RSS取得最小值

    这三种手段中:

    第一种相对耗时耗力,需要较多的人工操作,并且会需要混合各种统计学中的知识和检验来进行使用;

    第二种手段在现实中应用较多,不过由于理论复杂,效果也不是非常高效;
    逐步向前回归

    我们主要使用第三种改进的线性回归。

    4. Ridge & Lasso

    这两个算法不是为了提升模型表现,而是为了修复漏洞(多重共线性)而设计的。

    实际上,我们使用岭回归或者Lasso,模型的效果往往会下降一些,因为我们删除了一小部分信息。

    4.1 Ridge

    Ridge主要是将求解ω的过程转化为一个带条件的最优化问题,然后用最小二乘法求解。

    Ridge在多元线性回归的损失函数上加上了正则项,表达为系数ω的L2范式乘以正则化系数α

    在Ridge上,损失函数的定义为:
    minωXωy22+αω22 min_{\omega}\left| \left| X\omega -y\right| \right|^{2}_{2} +\alpha \left| \left| \omega \right| \right|^{2}_{2}
    则有
    在这里插入图片描述
    最后
    ω=(XTX+αI)1XTy \omega = \left( X^{T}X+\alpha I\right)^{-1} X^{T}y

    问题转化为要求(XTX+αI)\left( X^{T}X+\alpha I\right)存在逆矩阵。

    我们来看其矩阵具体的表现形式:
    在这里插入图片描述
    此时方阵XTXX^{T}X是不可逆的,最小二乘法就无法使用。然而,加上αI\alpha I了之后,我们的矩阵就大不一样了:
    在这里插入图片描述
    最后得到的这个行列式还是一个梯形行列式。我们讨论该行列式是否存在全0列:

    若存在全0列,应该满足如下假设之一:

    1. α=0\alpha=0
    2. 原本矩阵XTXX^{T}X存在某个对角元素为α-\alpha

    首先,α\alpha的值,理论上我们是可以取无穷个的,那我们只要使得α0\alpha \neq 0则上述条件1即可避免;而对于条件二,我们只要规避因为α\alpha的值为上述的因为α-\alpha,则该条件也可避免。

    最后,通过改变正则化因子因为α\alpha的值,我们就可以规避线性回归中多重共线性的影响。

    4.2 Lasso

    和Ridge一样,Lasso是被创造来作用于多重共线性问题的算法,不过Lasso使用的是系数ω\omega的L1范式(L1范式则是系数的绝对值)乘以正则化系数α\alpha

    对于Lasso,其损失函数的表达式为
    minωXωy22+αω1 min_{\omega}\left| \left| X\omega -y\right| \right|^{2}_{2} +\alpha \left| \left| \omega \right| \right|^{}_{1}
    同样的,我们进行求导
    在这里插入图片描述
    最终结果为
    XTXω=XTyαI2 X^{T}X\omega =X^{T}y-\frac{\alpha I}{2}
    在这里,我们注意到刚刚在普通线性回归中可能存在的多重共线性问题在Lasso中同样无法避免。

    因此Lasso无法解决特征之间”精确相关“的问题。当我们使用最小二乘法求解线性回归时,如果线性回归无解或者报除零错误,换Lasso不能解决任何问题。

    然而,在现实中我们其实会比较少遇到“精确相关”的多重共线性问题,大部分多重共线性问题应该是“高度相关“,而如果我们假设方阵XTXX^{T}X的逆是一定存在的,那我们可以有
    ω=(XTX)1(XTyαI2) \omega =\left( X^{T}X\right)^{-1}\left( X^{T}y -\frac{\alpha I}{2} \right)
    通过增大α\alpha,我们可以为的计算增加一个负项,从而限制参数估计中的大小,而防止多重共线性引起的参数被估计过大导致模型失准的问题。

    因此我们说,Lasso不是从根本上解决多重共线性问题,而是限制多重共线性带来的影响

    在此,我们发现两种算法的区别在于损失函数定义的不同,或者是L1正则化及L2正则化所带来的影响不同。

    L1和L2正则化一个核心差异就是他们对系数的影响:

    两个正则化都会压缩系数的大小,对标签贡献更少的特征的系数会更小,也会更容易被压缩。不过,L2正则化只会将系数压缩到尽量接近0,但L1正则化主导稀疏性,因此会将系数压缩到0。

    而对于Lasso本身带有的独特性质,也为Lasso能够进行特征选择奠定了基础(下次写)。

    展开全文
  • 其中在推导多元线性回归使用最小二乘法的求解原理时,对损失函数求导得到参数向量 的方程式上式中有解,即能够得到最后一步的前提条件是存在逆矩阵,而逆矩阵存在的充分必要条件是特征矩阵不存在多重线性。...

    fe719599e4ac5d160cf8adb758f0976e.png

    写在前面

    线性回归详解mp.weixin.qq.com

    上篇文章详细介绍了线性回归分析方程、损失方程及求解、模型评估指标等内容,其中在推导多元线性回归使用最小二乘法的求解原理时,对损失函数求导得到参数向量

    equation?tex=w的方程式

    equation?tex=%5Cbegin%7Bequation%7D%5Cbegin%7Bsplit%7D++%5Cboldsymbol%7BX%5ET%7D%5Cboldsymbol%7BX%7D%5Cboldsymbol%7Bw%7D+-%5Cboldsymbol%7BX%5ET%7D%5Cboldsymbol%7By%7D%26%3D0+%5C%5C+%5Cboldsymbol%7BX%5ET%7D%5Cboldsymbol%7BX%7D%5Cboldsymbol%7Bw%7D+%26+%3D%5Cboldsymbol%7BX%5ET%7D%5Cboldsymbol%7By%7D+%5C%5C+%5Cboldsymbol%7Bw%7D+%26+%3D+%28%5Cboldsymbol%7BX%5ET%7D%5Cboldsymbol%7BX%7D%29%5E%7B-1%7D%5Cboldsymbol%7BX%5ET%7D%5Cboldsymbol%7By%7D+%5Cend%7Bsplit%7D%5Cend%7Bequation%7D+%5C%5C
    equation?tex=%5Cboldsymbol%7BX%5ET%7D%5Cboldsymbol%7BX%7D%5Cboldsymbol%7Bw%7D+-%5Cboldsymbol%7BX%5ET%7D%5Cboldsymbol%7By%7D%3D0++%5C%5C
    equation?tex=%5Cboldsymbol%7BX%5ET%7D%5Cboldsymbol%7BX%7D%5Cboldsymbol%7Bw%7D%3D%5Cboldsymbol%7BX%5ET%7D%5Cboldsymbol%7By%7D+%5C%5C
    equation?tex=%5Cboldsymbol%7Bw%7D%3D+%28%5Cboldsymbol%7BX%5ET%7D%5Cboldsymbol%7BX%7D%29%5E%7B-1%7D%5Cboldsymbol%7BX%5ET%7D%5Cboldsymbol%7By%7D+%5C%5C

    上式中有解,即能够得到最后一步的前提条件是

    equation?tex=%5Cboldsymbol%7BX%5ETX%7D存在逆矩阵,而逆矩阵存在的充分必要条件是特征矩阵不存在多重共线性。

    本文将详细介绍线性回归中多重共线性问题及解决。 主要详细介绍两种线性回归的缩减(shrinkage)方法的基础知识:岭回归(Ridge Regression)和 LASSO(Least Absolute Shrinkage and Selection Operator) 并对其进行了Python实现。

    本文将详细介绍线性回归中多重共线性问题,以及一种线性回归的缩减(shrinkage)方法 ----岭回归(Ridge Regression),并对其进行了Python实现。

    多重共线性

    多重共线性是指线性回归模型中的解释变量之间由于存在精确相关关系或高度相关关系而使模型估计失真或难以估计准确。

    从线性等式理解,对于

    equation?tex=n%3E2个变量有,如果存在常数
    equation?tex=w_0%2Cw_1%2C%5Ccdots%2Cw_n使得如下公式,可近似表示:

    equation?tex=w_1X_1%2Bw_2X_2%2B%5Ccdots%2Bw_nX_n%3Dw_0+%5C%5C

    那么通常称这

    equation?tex=n个变量存在多重共线性。

    处理多重共线性方法有多种,其中最直接的方法是手动移除共线性的变量。具体做法是先对数据进行相关分析,若两个特征的相关系数大于某特定值(一般为0.7),则手动移除其中一个特征,再继续做回归分析。这种做法会导致估计结果产生偏差,会引起遗漏变量问题。而且有时数据特征本来就很少,或并不想直接删除特征,此时可考虑其他更加有效的方法。

    改进线性回归即是当前解决多重共线性问题的最有效的方法,下面从矩阵的角度介绍多重共线性将究竟如何影响对损失函数求解,以便更加深刻理解改进原理。

    逆矩阵存在的充要条件

    逆矩阵计算公式

    equation?tex=%5Cboldsymbol%7BA%5E%7B-1%7D%3D%5Cfrac%7B1%7D%7B%7CA%7C%7DA%5E%2A%7D+%5C%5C

    其中

    equation?tex=%5Cboldsymbol%7BA%5E%2A%7D是伴随矩阵,其存在没有限制条件,当然也不会影响逆矩阵的存在性。而矩阵的行列式
    equation?tex=%5Cboldsymbol%7B%7CA%7C%7D存在于分母上,其值不能为零。由此得到,逆矩阵存在的充分必要条件是:矩阵的行列式不能为0。
    equation?tex=%5Cboldsymbol%7BX%5ETX%7D存在逆矩阵的充要条件为
    equation?tex=%5Cboldsymbol%7B%7CX%5ETX%7C%7D不能为0。这是使用最小二乘法来求解线性回归的核心条件之一。
    行列式与矩阵矩阵(matrix)是一组数按照一定方式排列的数表,它不能从整体上被看成一个数(只有一个数的1阶矩阵除外),记为
    equation?tex=%5Cboldsymbol%7BA%7D

    在线性代数中,行列式(determinant)是一个函数,它将每个
    equation?tex=n%5Ctimes+n矩阵
    equation?tex=A对应到一个纯量(scalar),简单讲即是行列式是这一组数按照某种运算法则计算出的一个数,记为
    equation?tex=%5Cboldsymbol%7B%7CA%7C%7D
    equation?tex=det%5Cboldsymbol%7BA%7D

    行列式不为零的充要条件

    假设特征矩阵

    equation?tex=%5Cboldsymbol%7BX%7D的结构为
    equation?tex=%28m%2Cn%29,则

    equation?tex=%5Cboldsymbol%7BX%5ETX%7D%3D%28n%2Cm%29%5Ccdot%28m.n%29%3D%28n%2Cn%29+%5C%5C

    一般行列式计算不会通过展开的方式,而是通过行列初等行变换/列变换将其整合成一个梯形的行列式

    equation?tex=%5Cboldsymbol%7B%7CA%7C%7D%3D%5Cbegin%7Bvmatrix%7D+x_%7B11%7D%26x_%7B12%7D%26x_%7B13%7D%5C%5C+x_%7B21%7D%26x_%7B22%7D%26x_%7B23%7D%5C%5C+x_%7B31%7D%26x_%7B32%7D%26x_%7B33%7D%5C%5C+%5Cend%7Bvmatrix%7D+%5Clongrightarrow+%5Cbegin%7Bvmatrix%7D+a_%7B11%7D%26a_%7B12%7D%26a_%7B13%7D%5C%5C+0%26a_%7B22%7D%26a_%7B23%7D%5C%5C+0%260%26a_%7B33%7D%5C%5C+%5Cend%7Bvmatrix%7D+%5C%5C

    由于梯形行列式下半部分为0,整个矩阵的行列式其实就是梯形行列式对角线上的元素相乘。

    equation?tex=%5Cboldsymbol%7B%7CA%7C%7D%3D+%5Cbegin%7Bvmatrix%7D+a_%7B11%7D%26a_%7B12%7D%26a_%7B13%7D%5C%5C+0%26a_%7B22%7D%26a_%7B23%7D%5C%5C+0%260%26a_%7B33%7D%5C%5C+%5Cend%7Bvmatrix%7D%3Da_%7B11%7Da_%7B22%7Da_%7B33%7D+%5C%5C

    由此可见,如果对角线上的任一个元素为0,则行列式结果即为0。反之,如果对角线上的任一元素均不为0,则行列式不为0。

    矩阵满秩是矩阵的行列式不为0的充分必要条件。满秩矩阵
    一个结构为
    equation?tex=%28n%2Cn%29的矩阵
    equation?tex=A,若
    equation?tex=A转换为梯形矩阵后,没有任何全为0的行或者全为0的列,则称
    equation?tex=A为满秩矩阵。简单来说,只要对角线上没有一个元素为0,则这个矩阵中绝对不可能存在全为0的行或列。

    矩阵满秩的充要条件

    精确相关关系

    即完全相关,矩阵两行之间或两列之间存在完全线性关系,这种精确相关关系会使得矩阵的行列式为0,则矩阵的逆矩阵不存在。在最小二乘法中,如果矩阵

    equation?tex=%5Cboldsymbol%7BX%5ETX%7D中存在这种精确相关关系,则逆矩阵不存在,线性回归无法使用最小二乘法求出结果

    equation?tex=%5Cboldsymbol%7B%28X%5ETX%29%5E%7B-1%7D%7D+%3D%5Cboldsymbol%7B%5Cfrac%7B1%7D%7B%7CX%5ETX%7C%7D%28X%5ETX%29%5E%2A%7D%5Clongrightarrow+%E9%99%A4%E9%9B%B6%E9%94%99%E8%AF%AF+%5C%5C
    equation?tex=%5Cboldsymbol%7Bw%7D+%3D+%28%5Cboldsymbol%7BX%5ET%7D%5Cboldsymbol%7BX%7D%29%5E%7B-1%7D%5Cboldsymbol%7BX%5ET%7D%5Cboldsymbol%7By%7D%5Clongrightarrow+%E6%97%A0%E8%A7%A3+%5C%5C

    equation?tex=%5Cboldsymbol%7B%7CX%5ETX%7C%7D%3D0则会发生除零错误 。

    高度相关关系

    即不完全相关,这种高度相关关系下,矩阵的行列式不为0,但是一个非常接近0的数,矩阵的逆是存在的,但接近无限大,直接影响参数向量求解。

    equation?tex=%5Cboldsymbol%7B%28X%5ETX%29%5E%7B-1%7D%7D+%3D%5Cboldsymbol%7B%5Cfrac%7B1%7D%7B%7CX%5ETX%7C%7D%28X%5ETX%29%5E%2A%7D%5Clongrightarrow+%5Cinfty+%5C%5C
    equation?tex=%5Cboldsymbol%7Bw%7D+%3D+%28%5Cboldsymbol%7BX%5ET%7D%5Cboldsymbol%7BX%7D%29%5E%7B-1%7D%5Cboldsymbol%7BX%5ET%7D%5Cboldsymbol%7By%7D%5Clongrightarrow+%5Cinfty+%5C%5C

    这种情况下,结果参数向量

    equation?tex=w无穷大,直接影响模型结果,造成模型偏差大或不可用。
    精确相关关系和高度相关关系并称"多重共线性"。

    矩阵行与行或列于列之间相互独立,其矩阵的行列式经初等变换后的对角线上没有任何元素特别接近于0,因此矩阵求得的参数向量不会对模型产生影响,对拟合结果也是较理想的。

    equation?tex=%5Cboldsymbol%7B%28X%5ETX%29%5E%7B-1%7D%7D+%3D%5Cboldsymbol%7B%5Cfrac%7B1%7D%7B%7CX%5ETX%7C%7D%28X%5ETX%29%5E%2A%7D%5Clongrightarrow+%E6%AD%A3%E5%B8%B8%E5%80%BC+%5C%5C
    equation?tex=%5Cboldsymbol%7Bw%7D+%3D+%28%5Cboldsymbol%7BX%5ET%7D%5Cboldsymbol%7BX%7D%29%5E%7B-1%7D%5Cboldsymbol%7BX%5ET%7D%5Cboldsymbol%7By%7D%5Clongrightarrow+%E6%AD%A3%E5%B8%B8%E5%80%BC+%5C%5C

    由此可见,一个矩阵如果要满秩,则要求矩阵中每个向量之间不能存在多重共线性,这也构成了线性回归算法对于特征矩阵的要求。

    多重共线性与相关性
    多重共线性(Multicollinearity)是一种统计现象,是指线性模型中的特征(解释变量)之间由于存在精确相关关系或高度相关关系, 多重共线性的存在会使模型无法建立,或者估计失真。多重共线性使用指标方差膨胀因子(variance inflation factor,VIF)来进行衡量(from statsmodels.stats.outliers_influence import variance_inflation_factor), 通常当我们提到"共线性",都特指多重共线性。
    相关性(Correlation)是衡量两个或多个变量一起波动的程度的指标,它可以是正的,负的或者0。一般而言,变量之间具有相关性,通常是指线性相关性,线性相关一般由皮尔逊相关系数进行衡量,非线性相关可以使用斯皮尔曼相关系数或者互信息法进行衡量。此部分可参见数据探索分析。

    多重共线性对回归模型的影响

    回归系数的估计值方差变大,回归系数的置信度变宽,估计的精确性大幅度降低,使得估计值稳定性变差。

    会使得一些回归系数通不过显著性检验,回归系数的正负号也可能出现倒置,使得回归方程无法得到合理的解释,直接影响最小二乘法的计算结果。

    多重共线性如果存在,则线性回归就无法使用最小二乘法来进行求解,或者求解就会出现偏差。不能存在多重共线性,不代表不能存在相关性——机器学习不要求特征之间必须独立,必须不相关,只要不是高度相关或者精确相关就好。


    改进线性回归处理多重共线性

    岭回归

    岭回归分析(Ridge Regression)是一种改良的最小二乘法,其通过放弃最小二乘法的无偏性,以损失部分信息为代价来寻找效果稍差但回归系数更符合实际情况的模型方程。该模型求解的回归模型的损失函数为线性最小二乘函数,正则化采用l2-范数。也称为岭回归(Ridge Regression)或吉洪诺夫正则化(Tikhonov regularization)。岭回归与套索回归(Lasso Regression)两个算法不是为了提升模型表现,而是为了修复漏洞而设计的。

    岭回归原理和逻辑是将求解

    equation?tex=w的过程转化为一个带条件的最优化问题,然后再用最小二乘法求解。 岭回归在多元线性回归的损失函数上加上了正则项,表达为系数
    equation?tex=w
    L2-范式(即系数
    equation?tex=w的平方项)乘以正则化系数
    equation?tex=%5Calpha

    最小化目标函数:

    equation?tex=%5Cmin_w%7B%7C%7C%5Cboldsymbol%7By+-+Xw%7D%7C%7C_2%7D%5E2+%2B+%5Calpha%7B%7C%7C%5Cboldsymbol%7Bw%7D%7C%7C_2%7D%5E2+%5C%5C

    假设我们的特征矩阵结构为(m,n),系数

    equation?tex=w的结构是
    (1,n)
    equation?tex=I是构为
    (n,n)单位矩阵则

    最终得到

    equation?tex=%5Cboldsymbol%7B%28X%5ETX%7D%2B%5Calpha+%5Cboldsymbol%7BI%29w%3DX%5ETy%7D+%5C%5C

    从而转化为只需

    equation?tex=%5Cboldsymbol%7B%28X%5ETX%7D%2B%5Calpha+%5Cboldsymbol%7BI%29%7D存在逆矩阵,就能求解出参数向量
    equation?tex=w

    假设原本的特征矩阵存在共线性,即非满秩矩阵

    equation?tex=%5Cboldsymbol%7BX%5ETX%7D

    equation?tex=%5Cboldsymbol%7BX%5ETX%7D%3D%5Cbegin%7Bvmatrix%7D+a_%7B11%7D%26a_%7B12%7D%26a_%7B13%7D%26%5Ccdots%26a_%7B1n%7D%5C%5C+0%26a_%7B22%7D%26a_%7B23%7D%26%5Ccdots%26a_%7B2n%7D%5C%5C+0%260%26a_%7B33%7D%26%5Ccdots%26a_%7B3n%7D%5C%5C+%5Cvdots%26%5Cvdots%26%5Cvdots%26%5Cddots%26%5Cvdots%5C%5C+0%260%260%26%5Ccdots%260%5C%5C+%5Cend%7Bvmatrix%7D+%5C%5C
    equation?tex=%5Cboldsymbol%7BX%5ETX%7D%2B%5Calpha%5Cboldsymbol%7BI%7D%3D%5Cbegin%7Bvmatrix%7D+a_%7B11%7D%26a_%7B12%7D%26a_%7B13%7D%26%5Ccdots%26a_%7B1n%7D%5C%5C+0%26a_%7B22%7D%26a_%7B23%7D%26%5Ccdots%26a_%7B2n%7D%5C%5C+0%260%26a_%7B33%7D%26%5Ccdots%26a_%7B3n%7D%5C%5C+%5Cvdots%26%5Cvdots%26%5Cvdots%26%5Cddots%26%5Cvdots%5C%5C+0%260%260%26%5Ccdots%260%5C%5C+%5Cend%7Bvmatrix%7D+%2B+%5Cbegin%7Bvmatrix%7D+%5Calpha%260%260%26%5Ccdots%260%5C%5C+0%26%5Calpha%260%26%5Ccdots%260%5C%5C+0%260%26%5Calpha%26%5Ccdots%260%5C%5C+%5Cvdots%26%5Cvdots%26%5Cvdots%26%5Cddots%26%5Cvdots%5C%5C+0%260%260%26%5Ccdots%26%5Calpha%5C%5C+%5Cend%7Bvmatrix%7D+%5C%5C
    equation?tex=%5Cboldsymbol%7BX%5ETX%7D%2B%5Calpha%5Cboldsymbol%7BI%7D%3D%5Cbegin%7Bvmatrix%7D+a_%7B11%7D%2B%5Calpha%26a_%7B12%7D%26a_%7B13%7D%26%5Ccdots%26a_%7B1n%7D%5C%5C+0%26a_%7B22%7D%2B%5Calpha%26a_%7B23%7D%26%5Ccdots%26a_%7B2n%7D%5C%5C+0%260%26a_%7B33%7D%2B%5Calpha%26%5Ccdots%26a_%7B3n%7D%5C%5C+%5Cvdots%26%5Cvdots%26%5Cvdots%26%5Cddots%26%5Cvdots%5C%5C+0%260%260%26%5Ccdots%26%5Calpha%5C%5C+%5Cend%7Bvmatrix%7D+%5C%5C

    最后得到的这个行列式还是一个梯形行列式,但已经不存在全0行或者全0列了,除非以下两种情况,否则矩阵

    equation?tex=%5Cboldsymbol%7BX%5ETX%7D%2B%5Calpha%5Cboldsymbol%7BI%7D永远都是满秩。
    (1)
    equation?tex=%5Calpha%3D0

    (2) 原本的矩阵
    equation?tex=%5Cboldsymbol%7BX%5ETX%7D存在对角线上元素为
    equation?tex=-%5Calpha,且其他元素都为0的行或者列

    以上两种情况,在sklearn中都可以轻松应对:自由控制

    equation?tex=%5Calpha%5Cnot%3D0;当出现无法求解时,更换
    equation?tex=%5Calpha取值即可。则可认为
    equation?tex=%5Cboldsymbol%7B%28X%5ETX%7D%2B%5Calpha+%5Cboldsymbol%7BI%29%5E%7B-1%7D%7D是存在的

    equation?tex=%5Cboldsymbol%7B%28X%5ETX%7D%2B%5Calpha+%5Cboldsymbol%7BI%29w%3DX%5ETy%7D%5C+%5C%5C
    equation?tex=%5Cboldsymbol%7Bw%7D%3D%5Cboldsymbol%7B%28X%5ETX%7D%2B%5Calpha+%5Cboldsymbol%7BI%29%5E%7B-1%7D%7D%5Cboldsymbol%7BX%5ETy%7D+%5C%5C

    其中

    equation?tex=%5Cboldsymbol%7B%28X%5ETX%2B%5Calpha+I%29%5E%7B-1%7D%7D+%3D%5Cboldsymbol%7B%5Cfrac%7B1%7D%7B%7CX%5ETX%2B%5Calpha+I%7C%7D%28X%5ETX%2B%5Calpha+I%29%5E%2A%7D+%5C%5C

    通过调整正则化系数

    equation?tex=%5Calpha大小,来避免"精确相关关系"及"高度相关关系"带来的影响。如此,多重共线性就被控制住了:最小二乘法一定有解,并且这个解可以通过
    equation?tex=%5Calpha来进行调节,以确保不会偏离太多。当然了,
    equation?tex=%5Calpha挤占了
    equation?tex=w中由原始的特征矩阵贡献的空间,因此
    equation?tex=%5Calpha如果太大,也会导致的估计出现较大的偏移,无法正确拟合数据的真实面貌。我们在使用中,需要找出
    equation?tex=%5Calpha让模型效果变好的最佳取值。

    语法:

    sklearn.linear_model.Ridge(alpha=1.0, fit_intercept=True, normalize=False, copy_X=True, 
                                          max_iter=None, tol=0.001, solver=auto, random_state=None)

    重要参数

    alpha : {float, ndarray of shape (n_targets,)}, default=1.0
    正则化参数,必须是正浮点数。正则化改善了问题的条件,降低了估计的方差。值越大表示正则化惩罚越强。对应于其它线性模型中的
    equation?tex=+C%5E%7B-1%7D,如LogisticRegression或LinearSVC。如果传递了数组,则惩罚特定目标。

    例:

    >>> from sklearn.linear_model import Ridge
    >>> import numpy as np
    >>> n_samples, n_features = 10, 5
    >>> rng = np.random.RandomState(0)
    >>> y = rng.randn(n_samples)
    >>> X = rng.randn(n_samples, n_features)
    >>> clf = Ridge(alpha=1.0)
    >>> clf.fit(X, y)
    Ridge()

    虽然岭回归和Lasso不是设计来提升模型表现,而是专注于解决多重共线性问题的,但当

    equation?tex=%5Calpha在一定范围内变动的时候,消除多重共线性也许能够一定程度上提高模型的泛化能力。

    案例

    波士顿房价数据集中看岭回归处理多重共线性。

    详细代码请参见文末原文。

    输出结果

    263cd3b78d9a737e17a725fe80373e53.png

    可以发现,比起加利佛尼亚房屋价值数据集,波士顿房价数据集的方差降低明显,偏差也降低明显,可见使用岭回归还是起到了一定的作用,模型的泛化能力是有可能会上升的。


    选择最佳正则化系数

    使用交叉验证类 RidgeCV 来选择最佳的正则化系数。

    sklearn.linear_model.RidgeCV(alphas=(0.1, 1.0, 10.0), fit_intercept=True, normalize=False, scoring=None, cv=None, gcv_mode=None, store_cv_values=False)

    重要参数即属性请参见文末原文


    岭回归分析是一种用于存在多重共线性(自变量高度相关)数据的技术。在线性回归基础上增加L2正则化项 。

    除常数项以外,这种回归的假设与最小二乘回归类似;它收缩了相关系数的值,但没有达到零,这表明它没有特征选择功能,这是一个正则化方法,并且使用的是L2正则化。


    原文链接

    线性回归中的多重共线性与岭回归mp.weixin.qq.com

    推荐阅读

    机器学习 | 简单而强大的线性回归详解mp.weixin.qq.com机器学习 | 深度理解Lasso回归分析mp.weixin.qq.com

    扫码关注《数据STUDIO》,更多干货知识分享等你来撩!

    d54337ffe0e3e573439346499e2974f5.gif
    数据STUDIO
    展开全文
  • 1、 多重线性的定义:多重线性(Multicollinearity)是指线性回归模型中的解释变量之间由于存在精确相关关系或高度相关。2、 多重线性线性回归模型的影响:(1) 是否会影响模型的泛化能力?好多文章中说这...

    1、 多重共线性的定义:

    多重共线性(Multicollinearity)是指线性回归模型中的解释变量之间由于存在精确相关关系或高度相关。

    2、 多重共线性对线性回归模型的影响:

    (1) 是否会影响模型的泛化能力?

    好多文章中说这个会影响模型的泛化能力,这个不能一概而论,当损失函数最终收敛的情况下,是不影响模型泛化能力的,但是现实中的特征数据是存在噪声的,因此强相关的特征同时使用的话会增加模型受噪声影响的程度,比如X1、X2、X3三个强相关的特征,每个特征受到噪声干扰的程度是0.02,那么用其中一个特征模型受噪声影响的概率为0.02,但如果三个同时使用的话,模型受噪声干扰的程度是1-0.98*0.98*0,98=0.058808,显然比只用一个特征受噪声干扰的程度要大。实际上这增加了模型不稳定的程度,可能会影响模型的泛化能力。

    (2) 是否会影响变量的分析?

    这个答案是肯定的, 假设有三个特征变量X1, X2, X3其中X2= 2X1,即X1与X2存在共线性关系,如果选取X1,X3, Y = W1*X1 + W3 * X3,假设训练完后回归方程是:Y = 24X1 + 6X3,如果X1、X2、X3同时入模的话,Y = W1*X1 + W2*X2 +W3*X3 =

    W1*X1 + W2*2*X1 + W3*X3 = (W1 +2*W2)X1 +W3*X3,另W4=W1 +2*W2则Y=W4*X1 +W3*X3,实际上 Y=W4*X1 +W3*X3 与 Y = W1*X1 + W3 * X3是等价的,则最终模型也应该是Y = 24*X1 + 6*X3,所以 W4=24=W1 + 2*W2,这样W1 和W2就有无穷多组解,比如 (0,24)、(-1, 25), (11, 13)等,会导致模型系数的值不稳定,甚至出现0和负数的情况,这样就没有通过系数值来判断特征的重要性了,无法解释单个变量对模型的影响,当然这是再简化后的理想情况下W3是不变化的假设下,即使W3变化了,W4与W2和W1也保持一种关系,W2与W1的解也是有多解。

    (3) 共线性变量的系数是否会对非共线性变量的系数产生影响?

    通过实验看是有影响的。假设有一种场景有三个变量x1,x2,x3三个特征变量,y与x1, x2, x3的关系为y = 8 * x1 + 7 * x2 + 6 * x1, 且 x1与x2之间存在共线性,x2 = 2 * x1通过建立简单的线性模型可以看出:再x1,x2,x3同时加入模型和x1、x3加入模型,x2、x3加入模型三种情况下下,x3的系数是变化的:

    import numpy as np
    from random import sample
    
    def add_random(x, sd):
        '''
        给特征变量随机添加噪音
    :param x:
    :param sd:
    :return:
        '''
    num = len(x[0])
        x_new = x + np.random.normal(loc=0, scale=sd, size=num)
        num1 = int(num *0.2)
        data = [i for i in range(0, num)]
        index = sample(data, num1)
        x_new[0][index] = x_new[0][index] + np.random.normal(loc=0, scale=sd * 1.6, size=num1)
        num2 = int(num * 0.16)
        index2 = sample(data, num2)
        x_new[0][index2] = x_new[0][index2] + np.random.normal(loc=0, scale=sd * 1.8, size=num2)
        return x_new
    
    
    def return_Y_estimate(theta_now, data_x):
        '''
        根据当前的theta求Y的估计值
        传入的data_x的最左侧列为全1,即设X_0 = 1
    :param theta_now:
    :param data_x:
    :return:
        '''
    # 确保theta_now为列向量
        theta_now = theta_now.reshape(-1, 1)
        Y_estimate = np.dot(data_x, theta_now)
        return Y_estimate
    
    
    def return_dJ(theta_now, data_x, y_true):
        '''
        求当前theta的梯度
        传入的data_x的最左侧列为全1,即设X_0 = 1
    :param theta_now:
    :param data_x:
    :param y_true:
    :return:
        '''
    y_estimate = return_Y_estimate(theta_now, data_x)
        # 共有_N组数据
        N = data_x.shape[0]
        # 求解的theta个数
        num_of_features = data_x.shape[1]
        # 构建
        dJ = np.zeros([num_of_features, 1])
    
        for i in range(num_of_features):
            dJ[i, 0] = 2 * np.dot((y_estimate - y_true).T, data_x[:, i]) / N
    
        return dJ
    
    
    def return_J(theta_now, data_x, y_true):
        '''
        计算J的值
        传入的data_x的最左侧列为全1,即设X_0 = 1
    :param theta_now:
    :param data_x:
    :param y_true:
    :return:
        '''
    # 共有N组数据
        N = data_x.shape[0]
        temp = y_true - np.dot(data_x, theta_now)
        J = np.dot(temp.T, temp) / N
    
        return J
    
    
    def gradient_descent(data_x, data_y, Learning_rate=0.01, ER=1e-10, MAX_LOOP=1e5):
        '''
        梯度下降法求解线性回归
        data_x的一行为一组数据
        data_y为列向量,每一行对应data_x一行的计算结果
        学习率默认为0.3
        误差默认为1e-8
        默认最大迭代次数为1e4
    :param data_x:
    :param data_y:
    :param Learning_rate:
    :param ER:
    :param MAX_LOOP:
    :return:
        '''
    # 样本个数为
        num_of_samples = data_x.shape[0]
        # 在data_x的最左侧拼接全1列
        X_0 = np.zeros([num_of_samples, 1])
        new_x = np.column_stack((X_0, data_x))
        # 确保data_y为列向量
        new_y = data_y.reshape(-1, 1)
        # 求解的未知元个数为
        num_of_features = new_x.shape[1]
        # 初始化theta向量
        theta = np.zeros([num_of_features, 1]) * 0.3
        flag = 0  # 定义跳出标志位
        last_J = 0  # 用来存放上一次的Lose Function的值
        ct = 0  # 用来计算迭代次数
        while flag == 0 and ct < MAX_LOOP:
            last_theta = theta
            # 更新theta
            gradient = return_dJ(theta, new_x, new_y)
            theta = theta - Learning_rate * gradient
            er = abs(return_J(last_theta, new_x, new_y) - return_J(theta, new_x, new_y))
            # 误差达到阀值则刷新跳出标志位
            if er < ER:
                flag = 1
            # 叠加迭代次数
            ct += 1
        return theta
    
    
    def main():
        # 样本数据生成
        # 生成数据以1元为例,要估计的theta数为2个
        num_of_features = 3
        num_of_samples = 1000
        # 设置噪声系数
        rate = 0.05
        X = []
    
        # for i in range(num_of_features):
        #     X.append(np.random.random([1, num_of_samples]) * 10)
        X.append(np.random.normal(loc=1.6, scale=2, size=num_of_samples).reshape(1,num_of_samples))
        X.append(np.random.normal(loc=1.6, scale=2, size=num_of_samples).reshape(1,num_of_samples))
        X.append(np.random.normal(loc=8, scale=5, size=num_of_samples).reshape(1,num_of_samples))
        print(X[0].shape)
        X1 = X[0]
        X2 = X[0] * 2  #X2 = 2 * X1
        X3 = X[2]
        X1 = add_random(X1, sd=0.001)
        X2 = add_random(X2, sd=0.001)
        X3 = add_random(X3, sd=0.001)
        X_new= []
        X_new.append(X1)
        X_new.append(X2)
        X_new.append(X3)
        X_new = np.array(X_new).reshape(num_of_samples, num_of_features)
        print("X的数据规模为 : ", X_new.shape)
        #X = np.array(X).reshape(num_of_samples, num_of_features)
        # 利用方程生成X对应的Y
        Y = []
    
        for i in range(num_of_samples):
            Y.append(0 + 8 * X_new[i][0] + 7 * X_new[i][1] + 6 * X_new[i][2] + np.random.rand() * rate)
            #Y.append(0 + 8 * X_new[i][0] + 6 * X_new[i][2] + np.random.rand() * rate)
        Y = np.array(Y).reshape(-1, 1)
        print("Y的数据规模为 : ", Y.shape)
    
        # 计算并打印结果
        #Y = W1*X1 + W2*X2 + W3*X3
        print('Y = W1*X1 + W2*X2 + W3*X3')
        print(gradient_descent(X_new, Y))
    
        #Y = W1*X1 + W3*X3
        print('Y = W1*X1 + W3*X3')
        X_new = []
        X_new.append(X1)
        X_new.append(X3)
        num_of_features = 2
        X_new = np.array(X_new).reshape(num_of_samples, num_of_features)
        print(gradient_descent(X_new, Y))
    
        # Y = W2*X2 + W3*X3
        print('Y = W2*X2 + W3*X3')
        X_new = []
        X_new.append(X2)
        X_new.append(X3)
        num_of_features = 2
        X_new = np.array(X_new).reshape(num_of_samples, num_of_features)
        print(gradient_descent(X_new, Y))
    
        # Y = W2*X2 + W3*X3
        # print('Y = W3*X3 + W4*X4')
        # X_new = []
        # X4 = X1 + X2
        # X_new.append(X3)
        # X_new.append(X4)
        # num_of_features = 2
        # X_new = np.array(X_new).reshape(num_of_samples, num_of_features)
        # print(gradient_descent(X_new, Y))
    
    
    if __name__ == '__main__':
        main()

    运行结果如下:

    d7831baf2a343f929520c16e5cc30040.png

    3、 对共线性变量的处理

    (1)删除共线变量

    在风控的评分卡模型中,一般的思想是去掉多重共线性变量,理由是增加模型稳定性,但是相对模型的预测能力来说真的是去掉了就一定好吗,如果是完全共线性的当然是需要删除的,但现实中其实特征变量之间并不是完全共线性的,所以删除有可能会导致预测的信息源减少而导致预测能力下降,其实删除只是一种处理方,当比如 A、B两个特征共线性,那么到底选择删除哪一个也有一些方法,比如通过启发式逐个把特征加入模型看模型效果。

    (2)加正则项

    前面说在理想情况下没有噪声的情况下,共线性并不会导致泛化能力下降,甚至保留可能会有利于模型的预测能力,但现实中特征变量噪声是存在的,那么减少特征数据的噪声也是处理共线性的一种方法。其实L2正则的本质就是处理特征的噪声问题,因此正则项也是处理共线性的一种方法。这篇文中中有一段“正则项才是更好的选择”是关于正则项和变量噪声关系的描述可以参考:https://zhuanlan.zhihu.com/p/81610690

    展开全文
  • R语言 检验多重线性

    万次阅读 2016-11-17 19:32:49
    r语言检验多重线性函数
  • 这部分原理内容有点难啃,需要恶补很多知识,比如这一期总体都在证明为什么线性回归中不能存在多重线性这个问题。当然,如果你只记住了这个结论,那么也完全OK的,丝毫不影响你使用,但是如果希望知其所以然的,...
  • 其中在推导多元线性回归使用最小二乘法的求解原理时,对损失函数求导得到参数向量 的方程式上式中有解,即能够得到最后一步的前提条件是存在逆矩阵,而逆矩阵存在的充分必要条件是特征矩阵不存在多重线性。...
  • 多元线性回归使用最小二乘法求解,对多元线性回归的损失函数求导,并得出求解系数的式子和过程: 最后一步中需要左乘XTX的逆矩阵,而逆矩阵存在的充分必要条件是特征矩阵不存在多重线性。什么是多重线性,如何...
  • 机器学习之路——多重线性

    千次阅读 2016-03-03 21:50:30
    1.什么是多重线性? 自变量与自变量之间的相关性。 2.多重线性对回归模型的影响? 我们可能得出单个参数...在R中用Kappa()函数,若k1000,存在严重的多重线性。 k(XTX)=max(lambda(XTX))/min(lambda(XTX))
  • 多重线性代数与矩阵:王伯英文集》收入了《关于求逆矩阵方法的一个注记》《一种降低条件数的迭代格式》《一类矩阵特征值最小距离的界限》《张量空间对称化算子的指标》《正半定Hermitian矩阵乘积的一些特征值不等式...
  • ① 度量多重线性严重程度的一个重要指标是矩阵的条件数,可以由函数kappa()求出。在R中,函数kappa()计算矩阵的条件数。 注意:一般条件数K,则认为多重线性的程度很小;若100则认为存在中等程度或较强的多重共...
  • 除了岭回归,最常被提到的模型还有Lasso。...和岭回归一样,Lasso是被创造来作用于多重线性问题的算法,不过Lasso使用的是系数ω的L1范式(L1范式是系数ω的绝对值)乘以正则化系数α,所以Lasso的损失函数表达式...
  • excel多重线性 在对数据库进行长时间测试之后,从第一个代码升级了很多部分,我很高兴向大家展示我的Import / Link Excel vba代码,该代码非常有用且稳定。 函数(不是sub,因为我更喜欢在另一个函数中调用函数...
  • 本节根据置换的和多重线性函数来推导行列式的展开式 0 回忆行列式函数D的性质 (i) 若存在i不等于j有ai= aj 则D(a1,...,an)=0; (ii)D是其自变量的多重线性函数 (iii)D(e1,...,en)=1; (iv)若D是其自变量的交错函数,即...
  • 我们的目标就是求解w,如何求解w,就要用到损失函数线性回归的损失函数为: 即预测值和真实值之间的差异,我们希望越小越好。 我们往往称上述式子为RSS(Residual Sum of Squares 残差平方和)或者SSE(Sum of ...
  • 竖直、侧面三个方向的切片上各有n2个元素,共n3个元素的立方体数阵函数,称为立方行列式, 其阶数为 n。为方便区分,对只有两个下标的行列式称为狭义行列式[1]。把狭义行列式的全部性 质推广至立方行列式以及更...
  • 用R语言进行数据分析:常规和广义线性模型线性模型对于常规的多重模型(multiple model)拟合,最基本的函数是lm()。 下面是调用它的方式的一种改进版:>fitted.model例如> fm2 将会拟合 y 对 x1 和 x2 的多重...
  • 1.过拟合 当样本特征很多,样本数相对较少时,模型容易陷入...正则化是结构风险(损失函数+正则化项)最小化策略的体现,是在经验风险(平均损失函数)上加一个正则化项。正则化的作用就是选择经验风险和模型复杂度...
  • 然后,定义同步尺度函数为复变量,设计混合反馈控制器,并构造相应的正定函数,利用李雅普诺夫稳定性定理和线性矩阵不等式变换给出同步的充分条件.仿真结果验证了所提出方法的有效性,同时揭示了网络节点重边数对同步速度...
  • 线性回归 优化函数 - 随机梯度下降 (w,b)←(w,b)−η∣B∣∑i∈B∂(w,b)l(i)(w,b)(\mathbf{w},b) \leftarrow (\mathbf{w},b) - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \partial_{(\mathbf{w},b)} l^{...
  • 题意:给定ai和bi,表示第i个商店有ai个商品可以买,单价为bi元,给...然后显然可以做个前缀,求出前r个物品的背包,这个多重背包的复杂度是O(ncb),用二进制可以优化到O(nclogb),但是有T组数据的存在这个复杂度比...
  • 线性回归

    2018-05-21 17:11:00
     困难:选定变量(多元),避免多重线性,观察拟合方程,避免过度拟合,检验模型是否合理  关系  函数关系:确定性关系  相关关系:非确定性关系  相关系数:使用相关系数衡量线性相关的强弱  一元线性...
  • 张量是多重线性函数,输入r个向量,输出1个数,r称作张量的阶数。 多重线性是指张量对于每个参数都是线性的,张量的分量就是张量作用在相应的一组基矢上的值。 0阶张量(标量)1阶张量(向量)2阶张量(矩阵) 以下引用...
  • 我们在Born近似中研究了N $$ \ mathcal {N} $$ = 4 super-Yang-Mills理论中完全非手性应力张量多重态的多点超相关函数。 我们为它们推导有效的上标费曼规则。 出人意料的是,通过空时变量的简单格拉斯曼位移,从非...
  • 对Tensor的理解wiki对Tensor的定义:Tensor是用于描述向量、标量和其它Tensor之间线性关系的集合对象。...Tensor是一类多重线性函数,处理一系列线性可分的向量变量。在预定义好Tensor的情况下,数据传入时就会开...
  • 张量的学习

    2020-07-11 22:09:21
    越来越多的问题需要使用两个下标以上的数据来描述,两个下标以上的数据的多路排列称为多...张量用花体符号表示,n路阵列表示的张量称为n阶张量,是定义在n个向量空间的笛卡尔积上的多重线性函数,记为: 其中, 其中图
  • 上证指数高频数据的多重分形错觉,周炜星,,本文以上证指数5分钟取样的高频数据为例,用配分函数法对每一交易日的数据进行多重分形分析,发现质量指数$\\\\tau(q)$为线性函数。�
  • 通俗地说,张量在数学上理解为多重线性函数,在物理上可以理解为在不同坐标系(参考系)下有不同表示的量。先来说一下一些基本概念,与代数学有关:对偶空间:设 是 维向量空间,命 。则 也是一个 维线性空间,将其...
  • 使用它,提出了一种逻辑矩阵表达式,其中逻辑变量表示为向量,逻辑函数表示为多重线性映射。 在这种框架下,布尔网络方程被转换为等效的代数形式,成为常规的离散时间线性系统。 分析线性系统的转移矩阵,得出公式...

空空如也

空空如也

1 2 3 4 5 ... 18
收藏数 346
精华内容 138
关键字:

多重线性函数